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

Windows 進程間 DLL 注入技術詳解:掛鉤與遠程執行緒兩大核心方案

     編輯:VC 教學

進程地址空間隔離與打破邊界的必要性

Windows 為每個進程提供獨立的私有位址空間,指標只能引用本進程記憶體。這保護了系統穩健性,但也增加了進程間通訊與操作的難度。必須跨越進程邊界的典型場景包括:為他進程視窗建立子類別、偵錯輔助(如枚舉模組)、系統級掛鉤監控。

方案一:利用 Windows 掛鉤機制注入 DLL

Windows 為了讓掛鉤在 32 位系統下正常工作,設計了自動將包含掛鉤過濾函數的 DLL 映射到目標進程位址空間的機制。

核心流程(以 WH_GETMESSAGE 為例)

  1. 進程 A 呼叫 SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, hInstDLL, 0) 安裝全域掛鉤。
  2. 進程 B 的執行緒準備發送訊息給某視窗。
  3. 系統檢測到掛鉤,檢查 DLL 是否已映射到進程 B 空間;若無,強制映射並遞增 DLL 的自動追蹤計數。
  4. 系統計算 GetMsgProc 在進程 B 中的實際位址(透過 hinstDLL 偏移計算)。
  5. 在進程 B 的上下文中呼叫 GetMsgProc,此時 DLL 完整映射於進程 B,可安全呼叫 SetWindowLongPtr 為進程 A 的視窗建立子類別。
  6. 掛鉤函數返回後,系統遞減追蹤計數;計數歸零時 DLL 自動卸載。

優點:可隨時呼叫 UnhookWindowsHookEx 卸載 DLL。
注意:子類別存活期間必須保持掛鉤有效。

方案二:遠程執行緒注入

適用於 Windows 2000/XP/2003 等 NT 核心系統(Win98 不支援 CreateRemoteThread)。

注入步驟

  1. VirtualAllocEx:在目標進程配置記憶體,寫入 DLL 完整路徑。
  2. GetProcAddress:取得 Kernel32.dll 中 LoadLibraryA/W 的真實位址(系統 DLL 在各進程基址通常相同)。
  3. CreateRemoteThread:在目標進程建立執行緒,起始位址設為 LoadLibrary,參數指向步驟 1 配置的路徑緩衝區。
  4. 遠程執行緒執行 LoadLibrary → DLL 載入 → DllMain 收到 DLL_PROCESS_ATTACH → 執行自定義程式碼。

卸載步驟

  1. VirtualFreeEx 釋放路徑緩衝區。
  2. 取得 FreeLibrary 位址,再次 CreateRemoteThread 呼叫 FreeLibrary(hInstDLL) 卸載 DLL。

優點:靈活性高,不依賴掛鉤類型限制。
缺點:僅限 NT 核心系統;實作複雜度較高,需處理執行緒同步、記憶體管理等細節。

安全性警示

DLL 注入技術屬雙面刃,合法用於偵錯、熱修補、系統監控;惡意用於木馬隱藏、竊取資料。開發者務必遵守法律法規與道德規範,僅於授權環境下研究與應用。

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