'Hooking'带有C++的内存地址?

'Hooking' a memory address with C++?

本文关键字:地址 内存 带有 Hooking C++      更新时间:2023-10-16

钩子在达到某些值时更改单个静态内存地址的可靠性如何?

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

(重复我对一个问题的回答,我认为是相关的,但结果却不是)

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

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