本節示範如何透過修改導入表 Thunk,將 CALC.EXE 的 Shell32.dll!ShellAboutW 重導向至自訂訊息框。核心邏輯為遍歷導入描述符,比對 DLL 名稱與函數名稱,符合時將 Thunk 指向新代碼區塊:
// 偽代碼邏輯
if (strcmp(DLL_Name, "SHELL32.DLL") == 0 && strcmp(Func_Name, "ShellAboutW") == 0) {
*Thunk = AddressOf(New_ShellAbout); // 重寫 IAT
}
新函數 _ShellAbout_NewCode 使用 PUSHAD/POPAD 保護暫存器,RET 10h 平衡堆疊(4 參數 × 4 位元組),並呼叫 MessageBox 顯示「Hello World!」。
FindFirstFile/FindNextFile 至記憶體虛擬檔案系統
完整流程示範如何從外部進程注入代碼修改目標進程 IAT:
WindowFromPoint → GetWindowThreadProcessId 取得 PID/TIDOpenProcess(PROCESS_ALL_ACCESS)、OpenThread(THREAD_ALL_ACCESS)、SuspendThread 凍結主執行緒GetThreadContext + GetThreadSelectorEntry 計算 FS 基址 → 讀取 TEB → PEB → ImageBaseAddressReadProcessMemory 讀取完整 PE 映像至本地緩衝區IMAGE_IMPORT_DESCRIPTOR、IMAGE_THUNK_DATA,比對 Shell32.dll 與 ShellAboutW 虛擬位址,重寫 Thunk 指向遠程配置的新代碼區 (VirtualAllocEx(PAGE_EXECUTE_READWRITE))VirtualProtectEx(PAGE_EXECUTE_READWRITE) → WriteProcessMemory 寫回修改後映像 → ResumeThread 解凍
注入 GetDlgItemText IAT,過濾對話框控制項 ID (211: 帳號, 212: 密碼) 竊取明文,再呼叫原函數維持正常流程。殺毒軟體僅掃描靜態檔案映像,無法檢測運行時記憶體注入。
導入表操作技術雙面性明顯:合法用於熱修補、相容性層、安全監控;惡意用於 Rootkit、竊密、防破解。防禦需結合:
WriteProcessMemory/CreateRemoteThread 呼叫)理解此技術有助於建構虛擬機監控器、執行非原生 Windows 執行檔,亦是逆向工程與安全研究的核心基石。