许多恶意软件可执行文件使用挂钩来隐藏。我熟悉一些挂钩方法,我不确定有哪些方法可以检测它们。有没有办法判断函数调用何时被修改以通过钩子执行其他任务?
有哪些方法可以找到钩子函数和 API?
信息安全
视窗
反恶意软件
2021-08-14 10:45:38
1个回答
钩子以多种方式实现:
- 修改合法的跳转指令以指向钩子而不是普通代码。
- 用户调用表 (IAT) 挂钩 - 修改进程中用户模式 API 的地址。
- 内核调用表挂钩(例如 SSDT / GDT ) - 用挂钩的地址替换调用表指针。
- WndProc 挂钩(例如
PeekMessage) - 挂钩到窗口通知消息。 - 合法的回调,例如
PsSetCreateProcessNotifyRoutine.
我猜你对前两种类型最感兴趣。
可以通过几乎无限种方式创建跳钩。这使得几乎不可能编写一个工具来识别钩子。但是,您可以使用完整性检查技巧,例如将二进制文件(例如exe或dll)中的代码与内存中的代码进行比较。您还可以使用 hookWriteProcessMemory和其他此类 API 来检测进程内存的修改,但这仅适用于用户模式攻击。
IAT 钩子更容易检查。对进程启动时的 IAT 进行快照(例如,从静态二进制文件),并将内存中的 IAT 与应该在其中的函数的实际地址进行比较。例如,如果您知道 IAT 条目 4 指向user32.MessageBoxA,您可以使用它GetProcAddress来查找该函数的真实地址,并将 IAT 中的地址与该地址进行比较。如果它们不匹配,你就知道它已经上钩了。
如需进一步阅读,有一篇关于该主题的精彩论文,我强烈推荐阅读 Bill Blunden 的“ The Rootkit Arsenal ”。
其它你可能感兴趣的问题