DLL を別のプロセスに挿入する方法はたくさんあります。DLL の代わりに C# フォーム アプリケーション (exe) を使用して同じことを行うにはどうすればよいでしょうか。
基本的に、別のプロセスの仮想アドレス空間で実行したい。最初にメモリを割り当ててから、リモート スレッドを作成します。既存のexeをそこで実行するにはどうすればよいですか?また、制限はありますか (たとえば、explorer.exe 内で実行できますか)?
DLL を別のプロセスに挿入する方法はたくさんあります。DLL の代わりに C# フォーム アプリケーション (exe) を使用して同じことを行うにはどうすればよいでしょうか。
基本的に、別のプロセスの仮想アドレス空間で実行したい。最初にメモリを割り当ててから、リモート スレッドを作成します。既存の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
コード内) で利用可能であることを確認します。
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.h
and mscoree.h
(Windows SDK にあります) と #import mscorlib.tlb
(.NET 2.0 の場合はC:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.tlb
) も必要です。