3

DLL を別のプロセスに挿入する方法はたくさんあります。DLL の代わりに C# フォーム アプリケーション (exe) を使用して同じことを行うにはどうすればよいでしょうか。

基本的に、別のプロセスの仮想アドレス空間で実行したい。最初にメモリを割り当ててから、リモート スレッドを作成します。既存のexeをそこで実行するにはどうすればよいですか?また、制限はありますか (たとえば、explorer.exe 内で実行できますか)?

4

1 に答える 1

1

私はかなり前に、自分の管理されていないアプリでそれを行いました(インジェクションなし-それは問題ではありません)。アンマネージ DLL を目的のアプリのアドレス空間に挿入したら、専用スレッドを作成し、その上で COM を初期化して (CoInitializeExまたはを使用OleInitialize)、次の手順を実行します (簡潔にするためにエラー チェックはスキップされます)。

HMODULE hmodMscoree = LoadLibrary(_T("mscoree.dll"))

HRESULT (STDAPICALLTYPE *pCorBindToRuntimeEx)(LPCWSTR pwszVersion, LPCWSTR pwszBuildFlavor, DWORD startupFlags, REFCLSID rclsid, REFIID riid, LPVOID FAR *ppv);
GET_PROC_ADDRESS(hmodMscoree, CorBindToRuntimeEx);

CComQIPtr<ICorRuntimeHost> m_host;
pCorBindToRuntimeEx(NULL, NULL, 0, CLSID_CorRuntimeHost, IID_ICorRuntimeHost, (void**)&m_host);
m_host->Start();

CComQIPtr<IUnknown> unk;
m_host->CreateDomainSetup(&unk);
CComQIPtr<mscorlib::IAppDomainSetup> domainSetup;
unk->QueryInterface(&domainSetup);
domainSetup->put_ApplicationBase(curDir);

CComBSTR appName;
ParseParam(m_commandLine, CMDLINEOPT_APPNAME, &appName);
domainSetup->put_ApplicationName(appName);

CComBSTR config;
ParseParam(m_commandLine, CMDLINEOPT_CONFIGFILE, &config);
domainSetup->put_ConfigurationFile(config);

unk.Release();
m_host->CreateDomainEx(m_managedApp, domainSetup, NULL, &unk);
CComQIPtr<mscorlib::_AppDomain> appDomain;
unk->QueryInterface(&appDomain);
appDomain->ExecuteAssembly_2(m_managedApp, &m_exitCode);

すべての依存関係アセンブリ (存在する場合) がベース フォルダー (curDirコード内) で利用可能であることを確認します。

EDITED:これは.NET 2.0で行われました。それ以来、何かが変わったかどうかはわかりません。CLR ホスティングの詳細については、こちらを参照してください。

EDITED :GET_PROC_ADDRESSこれだけを行います:

#ifdef _UNICODE
    #define FUNC_T(func) func##W
    #define GET_PROC_ADDRESS_T(mod, func) \
        ((FARPROC&)p##func = ::GetProcAddress(mod, #func "W"))
#else
    #define FUNC_T(func) func##A
    #define GET_PROC_ADDRESS_T(mod, func) \
        ((FARPROC&)p##func = ::GetProcAddress(mod, #func "A"))
#endif

また、#include fusion.hand mscoree.h(Windows SDK にあります) と #import mscorlib.tlb(.NET 2.0 の場合はC:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.tlb) も必要です。

于 2013-08-08T13:41:55.303 に答える