Windows 為每個進程提供獨立的私有位址空間,指標只能引用本進程記憶體。這保護了系統穩健性,但也增加了進程間通訊與操作的難度。必須跨越進程邊界的典型場景包括:為他進程視窗建立子類別、偵錯輔助(如枚舉模組)、系統級掛鉤監控。
Windows 為了讓掛鉤在 32 位系統下正常工作,設計了自動將包含掛鉤過濾函數的 DLL 映射到目標進程位址空間的機制。
SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, hInstDLL, 0) 安裝全域掛鉤。GetMsgProc 在進程 B 中的實際位址(透過 hinstDLL 偏移計算)。GetMsgProc,此時 DLL 完整映射於進程 B,可安全呼叫 SetWindowLongPtr 為進程 A 的視窗建立子類別。優點:可隨時呼叫 UnhookWindowsHookEx 卸載 DLL。
注意:子類別存活期間必須保持掛鉤有效。
適用於 Windows 2000/XP/2003 等 NT 核心系統(Win98 不支援 CreateRemoteThread)。
VirtualAllocEx:在目標進程配置記憶體,寫入 DLL 完整路徑。GetProcAddress:取得 Kernel32.dll 中 LoadLibraryA/W 的真實位址(系統 DLL 在各進程基址通常相同)。CreateRemoteThread:在目標進程建立執行緒,起始位址設為 LoadLibrary,參數指向步驟 1 配置的路徑緩衝區。LoadLibrary → DLL 載入 → DllMain 收到 DLL_PROCESS_ATTACH → 執行自定義程式碼。VirtualFreeEx 釋放路徑緩衝區。FreeLibrary 位址,再次 CreateRemoteThread 呼叫 FreeLibrary(hInstDLL) 卸載 DLL。優點:靈活性高,不依賴掛鉤類型限制。
缺點:僅限 NT 核心系統;實作複雜度較高,需處理執行緒同步、記憶體管理等細節。
DLL 注入技術屬雙面刃,合法用於偵錯、熱修補、系統監控;惡意用於木馬隱藏、竊取資料。開發者務必遵守法律法規與道德規範,僅於授權環境下研究與應用。