首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何检测API Hook?

如何检测API Hook?
EN

Stack Overflow用户
提问于 2017-02-09 10:49:21
回答 3查看 3K关注 0票数 5

我一直在尝试检测API Hook,内联和吃钩子。

到目前为止,我还没有找到任何关于如何检测EAT hook的东西。

对于内联Ring 3钩子,我目前所拥有的是:

代码语言:javascript
运行
复制
FARPROC Address = GetProcAddress(GetModuleHandle("kernel32.dll"),"ExitProcess");
if (*(BYTE*)Address == 0xE9 || *(BYTE*)Address == 0x90 || *(BYTE*)Address == 0xC3)
{
 printf("Api hooked\n");
}

问题是有几个操作码可以用来钩住/改变函数的开场白,检查JMP / NOP / RET是微不足道的,我已经看到了很多钩子类型,比如PUSH RET,MOV,RETN等等。

我想知道是否有人知道如何检测这些钩子(弯路)或API中的修改。还有一些检测EAT钩子的方法。

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2017-02-09 11:50:48

GetProcAddress也可能上钩了。此外,由于您不能确切地知道要打补丁的API,因此您必须检查所有导入的函数,这是相当繁琐的。由于入侵者有足够的特权注入到您的进程地址空间和钩子API方法中,老实说,几乎没有办法阻止他完全修补任何保护机制。通常,现代软件保护系统包括内核模式驱动程序,该驱动程序扫描程序内存并防止dll注入和远程内存修改。此外,使用代码加密/混淆系统(例如Themida),甚至使用具有完全不同的处理器指令集的内部虚拟执行机器也很常见,这使得动态修补代码变得非常困难。

票数 1
EN

Stack Overflow用户

发布于 2017-02-09 21:56:41

我认为您应该将磁盘中的kernel32.dll与内存中的当前dll进行比较,并且应该忽略IAT并修复重新定位,否则您将得到不同的散列。

如果您想要一个更简单的解决方案,只需重命名kernel32.dll并从重命名的DLL调用API即可。

票数 0
EN

Stack Overflow用户

发布于 2017-04-11 02:44:04

您需要挂接当前进程的IAT地址,然后立即保存字节。

在此之后,您有了原始字节,因此您可以稍后再次尝试复制它们,并使用IAT ()将旧的(原始)字节与新的字节进行比较,如果它们不同,则说明您的地址已被另一个进程挂钩。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42127385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档