OpenProcess 獲取目標進程句柄(需 PROCESS_VM_OPERATION | PROCESS_VM_WRITE)。VirtualAllocEx 遠程分配內存(大小 strlen(dllPath)+1)。WriteProcessMemory 寫入 DLL 路徑。CreateRemoteThread 以 LoadLibraryA 為線程函數、參數為遠程內存地址。WaitForSingleObject 等待線程結束,CloseHandle 清理。CreateRemoteThread 執行 GetModuleHandleA(參數 DLL 名),獲取模組句柄(線程退出碼)。GetExitCodeThread 取得 HMODULE。CreateRemoteThread 執行 FreeLibrary(參數模組句柄)。WaitForSingleObject 等待卸載完成,清理句柄。#include <stdio.h> #include <Windows.h> #include <TlHelp32.h>
DWORD getProcessHandle(LPCTSTR lpProcessName) { /* Toolhelp32 遍歷查找 PID */ }
int main(int argc, CHAR* argv[]) {
DWORD dwPid = getProcessHandle((LPCTSTR)argv[1]);
LPCSTR lpDllName = "EvilDll.dll";
HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_WRITE, FALSE, dwPid);
// ... 分配、寫入、CreateRemoteThread(LoadLibraryA) ...
// 卸載
CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)GetModuleHandleA, lpRemoteBuf, 0, &dwID);
WaitForSingleObject(hThread, INFINITE);
GetExitCodeThread(hThread, &dwHandle);
CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)FreeLibrary, (LPVOID)dwHandle, 0, &dwID);
WaitForSingleObject(hThread, INFINITE);
// 清理
}
教科書級示範,適合安全研究參考。