将C#Forms应用程序注入另一个应用程序

时间:2013-08-08 13:06:24

标签: c# .net forms dll code-injection

如何将DLL注入另一个进程有很多答案。 我如何使用C#Forms应用程序(exe)而不是DLL执行相同的操作。

基本上我希望它在另一个进程的虚拟地址空间中运行。 首先我分配内存,然后创建远程线程。现在我如何让我现有的exe在那里运行?也有任何限制,(例如我可以在explorer.exe中运行吗?)

1 个答案:

答案 0 :(得分:1)

我在很久以前为我自己的非托管应用程序做过(没有任何注入 - 不重要)。一旦你将非托管DLL注入到所需应用程序的地址空间,就应该创建一个专用线程,在其上初始化COM(使用CoInitializeExOleInitialize),然后执行以下操作(跳过错误检查)为简洁起见:

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)。

已编辑:这是针对.NET 2.0完成的。我不知道从那以后发生了什么变化。您可以在CLR托管here找到更多信息。

已编辑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.hmscoree.h(可以在Windows SDK中找到)和#import mscorlib.tlb(对于.NET 2.0,它是C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.tlb )。