HANDLE CreateRemoteThread(
HANDLE hProcess, // 目標進程句柄 (OpenProcess 取得)
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress, // **必須是目標進程位址空間內的函數位址**
LPVOID lpParameter, // 參數指標,**必須是目標進程有效位址**
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
lpStartAddress **不能** 是注入端進程的函數位址 (位址空間不同)。lpParameter **不能** 是注入端進程的指標。lpStartAddress 指向 **目標進程中已載入的 DLL 之匯出函數**,或系統 DLL (kernel32.dll) 的 LoadLibrary 位址。OpenProcess(PROCESS_ALL_ACCESS, FALSE, targetPid) 取得 hProcess。VirtualAllocEx(hProcess, NULL, pathLen, MEM_COMMIT, PAGE_READWRITE) 在目標進程配置記憶體,寫入 **完整 DLL 路徑字串**。LoadLibraryA 在目標進程中的位址:GetProcAddress(GetModuleHandle("kernel32"), "LoadLibraryA") (系統 DLL 基址通常跨進程相同,ASLR 環境下需額外處理)。CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)addrLoadLibrary, pRemotePath, 0, NULL) 執行遠程載入。WaitForSingleObject(hThread, INFINITE) 等待載入完成,GetExitCodeThread 取得模組句柄。VirtualFreeEx 釋放路徑緩衝區,CloseHandle 清理。// Injector.cpp
#include
#include
void CheckError(BOOL ok, DWORD err, const char* msg) {
if (!ok) { printf("%s failed: %lu\n", msg, err); exit(1); }
}
int main(int argc, char* argv[]) {
if (argc < 3) { printf("Usage: Injector \n"); return 1; }
DWORD pid = atoi(argv[1]);
char* dllPath = argv[2];
size_t pathLen = strlen(dllPath) + 1;
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
CheckError(hProc != NULL, GetLastError(), "OpenProcess");
LPVOID pRemotePath = VirtualAllocEx(hProc, NULL, pathLen, MEM_COMMIT, PAGE_READWRITE);
CheckError(pRemotePath, GetLastError(), "VirtualAllocEx");
CheckError(WriteProcessMemory(hProc, pRemotePath, dllPath, pathLen, NULL), GetLastError(), "WriteProcessMemory");
LPVOID pLoadLibrary = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
CheckError(pLoadLibrary, GetLastError(), "GetProcAddress LoadLibraryA");
HANDLE hThread = CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)pLoadLibrary, pRemotePath, 0, NULL);
CheckError(hThread, GetLastError(), "CreateRemoteThread");
WaitForSingleObject(hThread, INFINITE);
DWORD exitCode; GetExitCodeThread(hThread, &exitCode);
printf("Remote LoadLibrary returned: 0x%X\n", exitCode);
VirtualFreeEx(hProc, pRemotePath, 0, MEM_RELEASE);
CloseHandle(hThread); CloseHandle(hProc);
return 0;
}
CreateRemoteThread、VirtualAllocEx/WriteProcessMemory 異常跨進程呼叫 (EDR/HIPS)。EnumProcessModulesEx) 檢測非預期 DLL。PROCESS_ALL_ACCESS 給非信任進程)。本文僅供安全研究、防禦檢測開發、理解作業系統機制之用。**嚴禁用於惡意軟體開發、未授權滲透測試、竊取資料等非法行為**。開發者應遵守《網絡安全法》及相關法規,將技術用於保護而非破壞。