首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Windows 遠程執行緒 DLL 注入技術深度解析

     編輯:關於C語言

核心思路

無法直接控制他行程執行緒 → 在目標行程建立遠程執行緒 → 執行緒呼叫 LoadLibrary 載入我們的 DLL。

關鍵 API 串聯

// 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);

為什麼 LoadLibrary 可直接作執行緒函式?

  • 簽名相容:HMODULE LoadLibrary(LPCTSTR) vs DWORD ThreadProc(LPVOID),參數皆為指標大小
  • 呼叫慣例相同:`__stdcall`,參數右進堆疊、被呼叫者清理堆疊
  • kernel32.dll 在所有行程相同基址載入(經驗值),GetProcAddress 取得的位址在目標行程也有效

避開 IAT Thunk 陷阱

直接用 LoadLibrary 符號會取得本行程的 IAT thunk 位址,傳給遠程執行緒會 Crash。必須用 GetProcAddress 取得真實匯出位址。

Unicode/ANSI 選擇

#ifdef UNICODE
    #define LoadLibrary LoadLibraryW
#else
    #define LoadLibrary LoadLibraryA
#endif

根據目標行程與 DLL 路徑編碼選擇 LoadLibraryW 或 LoadLibraryA。

完整錯誤處理建議

  • 檢查每個 API 回傳值,失敗時 GetLastError()
  • WriteProcessMemory 失敗嘗試 VirtualProtectEx 修改頁面屬性
  • 注入 32/64 位元必須匹配(WoW64 限制)

參考:《Windows 核心編程》第 22 章、《加密與解密》第 10 章

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved