为什么挂钩函数而不是设置断点

逆向工程 调试 恶意软件 函数挂钩 断点
2021-06-28 13:59:21

我知道当人们宁愿使用外部(或注入)代码来操作可执行文件时,挂钩通常用作一种技术,而不是通常由附加可执行文件中的调试框架设置的断点。

为什么更喜欢挂钩函数调用而不是设置断点?

我能想到的唯一例子是:

  • 如果用于调试的控制端口以某种方式被破坏,而您只需要快速信息(例如恶意软件:程序将自身调试为反 RE 技巧)
  • 工具偏好/更喜欢收集信息的程序/工具/自动化工具,而不是调试应用程序的乏味任务

除了这些,还有人能想到其他原因吗?

2个回答

挂钩和调试器都很容易检测到您是否正在寻找它们。在我看来,使用 API 以通过调试器读取被调试者的内存并不是真正的缺点。

我发现调试比任何手动挂钩都有更多的文档记录、弹性和操作系统支持。例如,尽管微软提供了 Detours 挂钩库,但这仍然不是操作系统支持的功能,微软强调不鼓励使用挂钩。

我经常看到使用钩子而不是调试的主要原因是以下原因:

  1. 需要监控整个系统而不是特定的过程。
  2. 无需跟踪完整的执行流程,而只需记录特定事件(例如网络通信)。

尽管挂钩可能用于调试,但这两种技术通常用于完全不同的事情。

@ExtremeCoders 评论是一个足够的答案:

1) Hooks 与目标地址空间存在相同的地址空间。因此,您可以完全访问所有内存。在断点的情况下,调试器和被调试器存在于不同的地址空间。为了读取内存,需要使用特殊的 API,就像ReadProcessMemory在 Windows 上一样。

2) 正确实施的钩子通常难以检测。调试器很吵。

忘了看我在这方面的问题。