我知道如何從 IAT 表中掛鉤函式,但是通過呼叫LoadLibrary/GetProcAddress函式匯入的 API 存在問題。我想確切地知道有人如何掛鉤這些功能。我意識到我應該掛鉤該GetProcAddress函式,但如何檢查傳遞給該函式的引數?
例如,考慮一個將包含MessageBoxWvia的程式LoadLibrary/GetProcAddress,我如何掛鉤它MessageBoxW然后檢查已傳遞給它的引數?
我在 StackOverflow 和 Google 中進行了很多搜索,但找不到關于此的分步教程。因此,如果您有這樣的教程或文章,我將非常感激閱讀它們。
uj5u.com熱心網友回復:
為了在 LoadLibrary/GetProcAddress 的幫助下將它們動態加載到二進制檔案中的 API 掛鉤,您應該截獲 GetProcAddress 的回傳地址和傳遞給它的函式的名稱(例如,考慮一個程式嘗試在此加載 MessageBoxA方法)。
在第二步中,您應該將 MessageBoxA API 的原始地址保存在像 OriginalMessageBoxA 這樣的變數中。
在第三步也是最后一步,您應該將修改后的 API (HookedMessageBoxA) 的地址回傳給 GetProcAddress 的被呼叫方,以便當程式嘗試呼叫該地址時,程式會重定向到您的函式。類似于以下內容:
VOID* HookedGetProcAddress(HMODULE hModule, LPCSTR lpProcName)
{
if (std::string(lpProcName).compare("MessageBoxA") == 0)
{
OMessageBoxA = (PMessageBoxA)GetProcAddress(hModule, lpProcName);
return HookedMessageBoxA;
}
else
{
return OGetProcAddress(hModule, lpProcName);
}
}
在那一刻,呼叫者將通過您的 HookedMessageBoxA,您可以檢查傳遞給 MessageBoxA 的引數。正如人們所說,它有點像普通的 IAT 鉤子,只是有一些小的變化和技巧。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/485991.html
