'Hooking'带有C++的内存地址?
'Hooking' a memory address with C++?
钩子在达到某些值时更改单个静态内存地址的可靠性如何?
我习惯做的是在基本的c++应用程序中使用读/写内存,尽管我发现有时这对于每秒更改1000多次的地址是不可靠的。我的应用程序经常不能及时地用case函数捕获地址处的值,从而将其更改为另一个值。这个挂钩的概念究竟是如何工作的,它是否错过了一个值的变化?我用的是win7 Ult。x86
(重复我对一个问题的回答,我认为是相关的,但结果却不是)
有特定于环境的方法来检测变量何时被更改。您可以使用MMU访问控制标志(通过mprotect或VirtualProtect)在第一次写入时生成一个异常,并在处理程序内部设置一个脏标志。(几乎每个现代操作系统都会对内存映射文件执行此操作,以确定是否需要将其写回磁盘)。或者您可以使用硬件断点来匹配对该地址的写操作(调试器使用它来实现变量上的断点)。
钩子可以通过多种方式实现。大多数都要求您在目标进程中有代码使ReadProcessMemory过时(只需使用指针并解引用它们)。如果你想要钩,你可以这样做:找出指令(s)写地址(调试器内存断点),它很可能是一个功能我通常做的是补丁一些附近的字节开始执行流重定向到我的代码,它将在每次执行这个函数被调用时,我有时也改变返回地址栈上的,这样我可以检查和控制返回值以及函数完成后我想要执行执行代码(例如,从堆栈中获取一些信息,因为我要么懒得挖掘用于存储它的结构,要么如果它是临时的,它将被丢弃并且永远不会保存)。
相关文章:
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- CUDA:统一内存和指针地址的更改
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 使用内存地址访问结构的属性值
- 如何读取特定地址的进程内存?
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 将布局映射到内存地址
- 为什么同一个变量的内存地址不同?
- LLVM 传递以在特定地址分配内存
- 无法将内存地址转换为值
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- 给定特定内存地址的数组的动态内存分配
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 获取 R 数据帧的内存地址
- 如何配置bazel以运行地址/内存清理器?
- 存储 std::list 元素的地址;内存
- 确定库的地址内存