当访问某些内存区域或匹配寄存器值时,有什么方法可以调用函数而不是断点?

逆向工程 视窗 部件 函数挂钩
2021-06-26 06:00:58

我正在学习组装和挂钩。

我现在知道如何挂钩 x86 程序集了。因此,如果任何线程转到被我的代码覆盖的某个地址,它会自动返回到我的函数。我认为这是正常的挂钩原则。 https://www.apriorit.com/dev-blog/160-apihooks

现在,我想在 Windows 32 位中挂钩 x86 寄存器或内存,就像调试器的断点一样。因此,当访问某些内存区域时,会自动在该进程内存中调用我的函数。确切地说,我想使用我的钩子函数而不是断点。任何提前将不胜感激!

1个回答

在我看来,实现这一点的唯一方法是覆盖 Page Fault Handler。但是,您不能在用户模式下执行此操作。您引用的钩子处理用户模式 ​​DLL 入口点,这很容易实现。分页机制在内核中实现,在 Ring 0,所以基本上你需要编写一个驱动程序,在页面错误的情况下,检查地址是否在你想要监视的范围内,如果是,调用你的函数; 否则调用默认内核例程。做起来相当棘手,尤其是在 Windows 上(Linux 更容易一些),并且您可能会破坏整个系统的稳定性。

这就是内核模式调试器,例如 SoftICE ( https://en.wikipedia.org/wiki/SoftICE ) 或 WinDbg ( https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/ Getting-started-with-windbg--kernel-mode- ) 做。

如果你真的想要去做,这里有一个很好的信息起点:https : //stackoverflow.com/questions/18431261/how-does-x86-paging-work ,当然还有https://docs.microsoft。 com/en-us/windows-hardware/drivers/

PS:没有办法为寄存器做