無法直接控制他行程執行緒 → 在目標行程建立遠程執行緒 → 執行緒呼叫 LoadLibrary 載入我們的 DLL。
// 1. 開啟目標行程
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
// 2. 在目標行程配置記憶體存放 DLL 路徑
LPVOID pRemotePath = VirtualAllocEx(hProcess, NULL, pathLen,
MEM_COMMIT, PAGE_READWRITE);
// 3. 寫入 DLL 完整路徑
WriteProcessMemory(hProcess, pRemotePath, dllPath, pathLen, NULL);
// 4. 取得 LoadLibrary 真實位址(核心技巧)
FARPROC pLoadLibrary = GetProcAddress(GetModuleHandle("kernel32.dll"),
"LoadLibraryW"); // 或 LoadLibraryA
// 5. 建立遠程執行緒執行 LoadLibrary
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE)pLoadLibrary,
pRemotePath, 0, NULL);
// 6. 等待結束、清理
WaitForSingleObject(hThread, INFINITE);
VirtualFreeEx(hProcess, pRemotePath, 0, MEM_RELEASE);
CloseHandle(hThread);
CloseHandle(hProcess);
HMODULE LoadLibrary(LPCTSTR) vs DWORD ThreadProc(LPVOID),參數皆為指標大小kernel32.dll 在所有行程相同基址載入(經驗值),GetProcAddress 取得的位址在目標行程也有效直接用 LoadLibrary 符號會取得本行程的 IAT thunk 位址,傳給遠程執行緒會 Crash。必須用 GetProcAddress 取得真實匯出位址。
#ifdef UNICODE
#define LoadLibrary LoadLibraryW
#else
#define LoadLibrary LoadLibraryA
#endif
根據目標行程與 DLL 路徑編碼選擇 LoadLibraryW 或 LoadLibraryA。
GetLastError()WriteProcessMemory 失敗嘗試 VirtualProtectEx 修改頁面屬性參考:《Windows 核心編程》第 22 章、《加密與解密》第 10 章