2013-03-20 46 views
0

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

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

+0

什么是内存挂钩? – 2013-03-20 04:30:56

+0

@ n.m。你拿一个海盗钩......或者你在地址总线和中断输入之间放置一个地址解码器......或者这样。 – 2013-03-20 04:33:26

+0

出于好奇,用例/目的是什么? – hyde 2013-03-20 08:07:25

回答

2

(重用的答案,我给了我认为是相关的,但实际上不是一个问题。)

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

+0

这两个听起来像他们会放慢程序。我头脑里有一个想法,但我不确定是否正确。基本上,我能够将单条指令重定向到我注入的DLL的函数,进行比较检查,然后将其重定向回该指令?成千上万的随机值通过这条指令,我只想改变特定的值。我不完全确定DLL注入是如何工作的,所以我不确定这是否合理。 – 2013-03-20 04:37:19

+0

@Scott:在整个过程中是否只有一条指令触及该内存位置?如果是这样,那么挂钩可以工作。否则,利用确实进行比较的硬件是您唯一的效率希望,并且我列出的两种方法都使用硬件来过滤地址。 – 2013-03-20 05:08:44

+1

嘿@BenVoigt我不认为你有任何引用方便你提到的方法吗?听起来像一个有趣的阅读。 – 2013-03-20 05:21:31

0

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

+0

AFAIK,'ReadProcessMemory()'不会引发异常,不会像直接指针解引用那样影响保护页。 – 2013-03-23 07:16:05