IAT 钩住但钩住的函数没有被调用

Posted

技术标签:

【中文标题】IAT 钩住但钩住的函数没有被调用【英文标题】:IAT hooked but hooked function is not being called 【发布时间】:2012-05-13 02:53:36 【问题描述】:

我正在编写代码以在 Windows 中执行 IAT 挂钩。我可以在 IAT (Kernel32!GetCurrentProcessId) 中更改目标函数的地址,但是稍后在程序中调用挂钩函数时会调用 Kernel32!GetCurrentProcessId 而不是挂钩。

在调试过程中,我可以看到 Kernel!GetCurrentProcessId 的原始 IAT 地址:

GetCurrentProcessId 地址:7C8099C0

我要换入的函数是:

MyGetCurrentProcessId 地址:100118BB

我挂钩 thunkIAT->u1.Function 的地址并将其从 7C8099C0 更改为 100118BB,但是正如我之前提到的,当从程序中调用 GetCurrentProcessId() 时,会调用 Kernel32 函数(不是我注入的那个)。

执行钩子的部分代码是:

if(strcmp(apiName,(char*)(*nameData).Name)==0)

DBG_PRINT2("[processImportDescriptor]: found match for %s\n", apiName);

VirtualProtect(
    &thunkIAT->u1.Function, // start addres of the zone to "unlock"
    0x010,   // size to protect
    PAGE_EXECUTE_READWRITE, // new permission
    &dwOldProtect           // old permission
 );

procPtr = MyGetCurrentProcessId;
thunkIAT->u1.Function = (DWORD)procPtr;

DBG_PRINT2("MyGetCurrentProcessId() address: %08X\n", MyGetCurrentProcessId);
DBG_PRINT2("procPtr address: %08X\n", procPtr);
DBG_PRINT2("thunkIAT->u1.Function address: %08X\n", thunkIAT->u1.Function);

VirtualProtect(
    &thunkIAT->u1.Function, // start addres of the zone to "relock"
    0x0010,          // size to protect
    dwOldProtect,       // new permission
    &dwOldProtect2      // old permission
);


有什么想法吗?谢谢。

【问题讨论】:

一方面,被调用的函数可能是通过GetProcAddress 检索的,即使二进制文件导入了它。但问题本身太宽泛,您提供的信息很少。 您是否有机会注入 DLL?如果是这样,您可能需要注意可执行文件中的每个模块都有自己的 IAT。这意味着您可能刚刚挂钩了您的 DLL 模块的 IAT,而不是主可执行文件的 IAT。您可以使用Create32Toolhelp32Snapshot/Module32First/Next 遍历模块并将它们全部挂钩。 感谢您的意见,谢谢。为了详细说明,我正在使用 CreateRemoteThread 将 DLL 注入到 mspaint.exe 中。 DLL 中的代码能够遍历 mspaint 中的 IAT(大约十几个,包括 Kernel32 IAT)。在 DLL 中,我直接在“case DLL_THREAD_DETACH:”中调用 GetCurrentProcessId()(在实现挂钩之后)。使用 Windbg 单步执行程序,似乎对 GetCurrentProcessId() 的调用不会调用 IAT 中的查找(暗示该值可能是从较早的调用中缓存的?)。仍然plugg'n离开。谢谢。 【参考方案1】:

利用CreateToolhelp32Snapshot API,我能够在我的Helloworld 程序中将所有IAT 的函数调用(未在注入的DLL IAT 中插入钩子,因为这会导致崩溃)挂钩到GetCurrentProcessId(),该程序是编写为每隔几秒钟简单地报告其进程ID。在注入 DLL 并挂钩 GetCurrentProcessId() Helloworld 之后,开始按预期调用挂钩函数。在我的研究中,我确实发现了一些信息,说明为什么 IAT 挂钩在某些情况下可能由于现代程序中的内置防御而无法工作:

http://www.codeproject.com/Articles/12516/Win32-API-hooking-Another-reason-why-it-might-nothttp://www.codeproject.com/Articles/21414/Powerful-x86-x64-Mini-Hook-Engine

【讨论】:

【参考方案2】:

也许 exe 有一个自执行代码打包。如果是这种情况,请尝试在启动后或调用该函数后注入它。

【讨论】:

希望 OP 现在已经解决了问题,或者继续前进。这个问题来自 2012 年 :) -- 无论如何,这并不能回答问题,应该是评论。

以上是关于IAT 钩住但钩住的函数没有被调用的主要内容,如果未能解决你的问题,请参考以下文章

函数无法被 Frida 钩住

Prestashop 没有错误/空白页

钩住嵌入式 youtube 播放器内的单击事件

如何在资源管理器中双击文件被钩住?

WinAPI - 钩住鼠标

使用弯路钩住记事本中的文字