進程注入將代碼注入既有進程位址空間並執行。本文基於 LoadLibrary + CreateRemoteThread 技術,示範如何將托管 DLL 注入目標進程:先注入非托管 C++ DLL 作為 CLR 宿主,由其啟動 CLR 載入並執行托管組件。
流程:注入器 → 非托管 ManageCodeInvoker.dll (CLR 宿主) → 啟動 CLR → 載入托管 Message.dll → 執行 Message.Show。
建立 Win32 DLL 專案 ManageCodeInvoker,核心類別 MyClrHost 匯出 ExecuteManageCode 與 Test 兩個函式。
// LoadClr.h 片段
#pragma comment(lib, "mscoree.lib")
#import "mscorlib.tlb" raw_interfaces_only ...
namespace ManageCodeInvoker {
class MyClrHost {
public:
static __declspec(dllexport) void ExecuteManageCode(PCWSTR pszVersion, PCWSTR pszAssemblyPath,
PCWSTR pszClassName, PCWSTR pszMethodName, PCWSTR argument);
static __declspec(dllexport) void Test();
};
}
ExecuteManageCode 三步驟:
ICLRMetaHost → ICLRRuntimeInfo → ICLRRuntimeHostpClrRuntimeHost->Start() 啟動 CLRExecuteInDefaultAppDomain 執行托管靜態方法 (簽名: static int MethodName(string))DllMain 中於 DLL_PROCESS_ATTACH 呼叫 Test(),測試載入本機 E:\Message.dll。
namespace Message {
public class Message {
public static int Show(string message) {
MessageBox.Show(message);
return 100;
}
}
}
C# 主控台專案 Injector,透過 P/Invoke 呼叫 Windows API:
OpenProcess 取得目標進程控制碼 (需 PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ)GetProcAddress 取得 kernel32.dll!LoadLibraryA 位址VirtualAllocEx 在目標進程配置記憶體寫入 DLL 路徑WriteProcessMemory 寫入路徑字串CreateRemoteThread 建立遠端執行緒執行 LoadLibraryAWaitForSingleObject 等待執行緒結束目標進程 TargetForInject.exe 為空白無限迴圈程式。執行注入後,Process Explorer 可見 ManageCodeInvoker.dll 與 Message.dll 已成功載入目標進程,訊息盒彈出證明托管代碼執行成功。
完整 Demo 下載:InjectProcess.rar
作者:玄魂
出處:https://www.cnblogs.com/xuanhun/