有很多答案可以介绍如何将一个DLL注入到另一个进程中。如果我想要做同样的事情,但是目标是C#窗体应用程序(exe)而不是DLL呢?
基本上,我想让它运行在另一个进程的虚拟地址空间中。首先,我分配内存,然后创建远程线程。现在我该如何让我的现有exe在其中运行?此外,是否存在任何限制(例如,我可以让它在explorer.exe中运行吗)?
有很多答案可以介绍如何将一个DLL注入到另一个进程中。如果我想要做同样的事情,但是目标是C#窗体应用程序(exe)而不是DLL呢?
基本上,我想让它运行在另一个进程的虚拟地址空间中。首先,我分配内存,然后创建远程线程。现在我该如何让我的现有exe在其中运行?此外,是否存在任何限制(例如,我可以让它在explorer.exe中运行吗)?
我之前为自己的非托管应用程序(没有任何注入 - 这并不重要)做过这件事。一旦将您的非托管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托管的信息。
编辑: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
fusion.h
和 mscoree.h
(可在 Windows SDK 中找到),并导入 mscorlib.tlb
(对于 .NET 2.0,它位于 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.tlb
)。
ExitProcess
未被调用),它是否为注入代码都无关紧要。上述代码将在该线程上启动托管应用程序,应用程序将创建自己的消息循环。 - noseratio - open to workGetDefaultDomain
),如果您进行注入,我认为这是一个不好的选择。您需要创建一个新的域。 - noseratio - open to work