gpt4 book ai didi

c# - 将 C# Forms 应用程序注入(inject)另一个应用程序

转载 作者:行者123 更新时间:2023-11-30 17:52:47 25 4
gpt4 key购买 nike

关于如何将 DLL 注入(inject)另一个进程有很多答案。我如何使用 C# Forms 应用程序 (exe) 而不是 DLL 来做同样的事情。

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

最佳答案

我很久以前就为我自己的非托管应用程序做了这件事(没有任何注入(inject) - 这并不重要)。将非托管 DLL 注入(inject)所需应用程序的地址空间后,您应该创建一个专用线程,在其上初始化 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)。

关于c# - 将 C# Forms 应用程序注入(inject)另一个应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18126861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com