我知道当人们宁愿使用外部(或注入)代码来操作可执行文件时,挂钩通常用作一种技术,而不是通常由附加可执行文件中的调试框架设置的断点。
为什么更喜欢挂钩函数调用而不是设置断点?
我能想到的唯一例子是:
- 如果用于调试的控制端口以某种方式被破坏,而您只需要快速信息(例如恶意软件:程序将自身调试为反 RE 技巧)
- 工具偏好/更喜欢收集信息的程序/工具/自动化工具,而不是调试应用程序的乏味任务
除了这些,还有人能想到其他原因吗?
我知道当人们宁愿使用外部(或注入)代码来操作可执行文件时,挂钩通常用作一种技术,而不是通常由附加可执行文件中的调试框架设置的断点。
为什么更喜欢挂钩函数调用而不是设置断点?
我能想到的唯一例子是:
除了这些,还有人能想到其他原因吗?
挂钩和调试器都很容易检测到您是否正在寻找它们。在我看来,使用 API 以通过调试器读取被调试者的内存并不是真正的缺点。
我发现调试比任何手动挂钩都有更多的文档记录、弹性和操作系统支持。例如,尽管微软提供了 Detours 挂钩库,但这仍然不是操作系统支持的功能,微软强调不鼓励使用挂钩。
我经常看到使用钩子而不是调试的主要原因是以下原因:
尽管挂钩可能用于调试,但这两种技术通常用于完全不同的事情。
@ExtremeCoders 评论是一个足够的答案:
1) Hooks 与目标地址空间存在相同的地址空间。因此,您可以完全访问所有内存。在断点的情况下,调试器和被调试器存在于不同的地址空间。为了读取内存,需要使用特殊的 API,就像
ReadProcessMemory
在 Windows 上一样。2) 正确实施的钩子通常难以检测。调试器很吵。
忘了看我在这方面的问题。