使用C ++'挂钩'内存地址?

时间:2013-03-20 04:20:05

标签: c++ c

在达到某个值时更改单个静态内存地址的挂钩有多可靠?

我过去常常使用基本c ++应用程序中的读/写内存,但我发现有时这对于每秒更改1000次以上的地址不可靠。通常,我的应用程序无法使用案例函数及时捕获地址的值,以便将其更改为其他值。这个挂钩的概念究竟是如何工作的,它是否会错过价值变化?我正在使用Win 7 Ult。 86

2 个答案:

答案 0 :(得分:2)

(重复一个我认为与之相关的问题的答案,但结果却不是。)

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

答案 1 :(得分:0)

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