有哪些方法可以找到钩子函数和 API?

信息安全 视窗 反恶意软件
2021-08-14 10:45:38

许多恶意软件可执行文件使用挂钩来隐藏。我熟悉一些挂钩方法,我不确定有哪些方法可以检测它们。有没有办法判断函数调用何时被修改以通过钩子执行其他任务?

1个回答

钩子以多种方式实现:

  • 修改合法的跳转指令以指向钩子而不是普通代码。
  • 用户调用表 (IAT) 挂钩 - 修改进程中用户模式 ​​API 的地址。
  • 内核调用表挂钩(例如 SSDT / GDT ) - 用挂钩的地址替换调用表指针。
  • WndProc 挂钩(例如PeekMessage) - 挂钩到窗口通知消息。
  • 合法的回调,例如PsSetCreateProcessNotifyRoutine.

我猜你对前两种类型最感兴趣。

可以通过几乎无限种方式创建跳钩。这使得几乎不可能编写一个工具来识别钩子。但是,您可以使用完整性检查技巧,例如将二进制文件(例如exedll)中的代码与内存中的代码进行比较。您还可以使用 hookWriteProcessMemory和其他此类 API 来检测进程内存的修改,但这仅适用于用户模式攻击。

IAT 钩子更容易检查。对进程启动时的 IAT 进行快照(例如,从静态二进制文件),并将内存中的 IAT 与应该在其中的函数的实际地址进行比较。例如,如果您知道 IAT 条目 4 指向user32.MessageBoxA,您可以使用它GetProcAddress来查找该函数的真实地址,并将 IAT 中的地址与该地址进行比较。如果它们不匹配,你就知道它已经上钩了。

如需进一步阅读,有一篇关于该主题的精彩论文,我强烈推荐阅读 Bill Blunden 的“ The Rootkit Arsenal ”。