如何将DLL注入另一个进程有很多答案。 我如何使用C#Forms应用程序(exe)而不是DLL执行相同的操作。
基本上我希望它在另一个进程的虚拟地址空间中运行。 首先我分配内存,然后创建远程线程。现在我如何让我现有的exe在那里运行?也有任何限制,(例如我可以在explorer.exe中运行吗?)
答案 0 :(得分: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
)。
已编辑:这是针对.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.h
和mscoree.h
(可以在Windows SDK中找到)和#import mscorlib.tlb
(对于.NET 2.0,它是C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.tlb
)。