0

当单个静态内存地址达到特定值时,挂钩更改的可靠性如何?

我习惯做的是从基本的 c++ 应用程序中使用读/写内存,尽管我发现有时这对于每秒更改 1000 次以上的地址并不可靠。很多时候,我的应用程序无法通过 case 函数及时捕获地址处的值,从而将其更改为另一个值。这个挂钩的概念究竟是如何工作的,它是否错过了价值变化?我正在使用 Win 7 Ult。x86

4

2 回答 2

2

(重复使用我对一个我认为相关的问题给出的答案,但结果并非如此。)

有一些特定于环境的方法可以检测变量何时更改。您可以使用 MMU 访问控制标志(通过 mprotect 或 VirtualProtect)在第一次写入时生成异常,并从处理程序内部设置脏标志。(几乎每个现代操作系统都使用内存映射文件来执行此操作,以确定是否需要将其写回磁盘)。或者您可以使用硬件断点来匹配对该地址的写入(调试器使用它在变量上实现断点)。

于 2013-03-20T04:28:24.367 回答
0

挂钩可以通过多种方式完成。大多数要求您在目标进程中有代码,使 ReadProcessMemory 过时(只需使用指针并取消引用它们)。如果你想挂钩,虽然你可以这样做:找出哪些指令写入该地址(调试器内存断点),它很可能是一个函数,所以我通常做的只是在开头附近修补一些字节要将执行流程重定向到我的代码,每次调用该函数时都会执行它,我有时也会更改堆栈上的返回地址,以便我可以检查和控制返回值以及执行我想要执行的代码函数完成后(例如,从堆栈中获取一些信息,因为我要么懒得挖掘用于存储它的结构,要么如果它'

于 2013-03-20T13:21:06.943 回答