Debug 版本下,呼叫函數 → call @ILT+offset → ILT 表中 jmp 實際函數位址。修改 ILT 中的 jmp 目標位址即可實現 Hook。
E9 26 00 00 00 // jmp 相對位移 0x26
目標位址 = 當前指令位址 + 5(指令長度) + 相對位移
Hook 時需計算新函數相對於 ILT 條目的位移,而非直接填寫絕對位址。
void hookfunc() {
LPBYTE p1 = (LPBYTE)test1 + 1; // 跳過 E9
LPBYTE p2 = (LPBYTE)test2 + 1;
DWORD newRel = (DWORD)p2 - (DWORD)p1; // 計算相對位移
WriteProcessMemory(GetCurrentProcess(), p1, &newRel, 4, NULL);
}
交換 ILT 中 test1/test2 的 jmp 指令:顯式呼叫 test1 實際進入 test2,呼叫 test2 實際進入 test1。Hook 函數通常不被直接呼叫,故無副作用。
ResourceLeakDetector rld。#pragma:#pragma comment(linker, "/include:__imp_?rld@@3VResourceLeakDetector@@A") 強制包含物件#pragma comment(lib, "rld.lib") 自動鏈接庫#include "rld.h" 即可零侵入啟用檢測。只記錄位移:分配時僅存指令位址偏移,不解析檔名/函數名(耗時)。
洩露時再解析:最終報告階段根據偏移查符號表,大幅降低常規路徑開銷。
DbgHelp.dll 至新版支援寬字元解析。DbgHelp.dll 解決。來源:「越測越開心」博客,原文連結:https://happytest.blog.51cto.com/324097/62791。