检测何时写入内存地址

时间:2014-10-02 16:26:52

标签: c emulation

我有一个字节数组,用作模拟系统RAM。我想为给定的单元格制作防弹补丁,检测它何时被写入,并立即覆盖它。使用像

这样的循环
for (;;) {
    address = x;
    sleep(y);
}

有一个缺陷,即睡眠的最小可能值,似乎与模拟帧长度几乎相同,因此它每帧仅修补一次地址。因此,如果游戏每帧写入100次,那么这样的补丁就没什么意义了。

我有一些关于写作的钩子,但是那些只是通过阅读正在执行的游戏代码来捕获写入,而我想让这些补丁适用于任何内存区域,而不仅仅是RAM,因此我可以'依赖于过多地解释模拟代码(它根本不适合我想修补的所有区域)。

所以我需要一些语法观察点,指向数组的指针,以及我想要观察的字节变化。

2 个答案:

答案 0 :(得分:3)

虽然C不是面向对象的语言,但我会在这里使用面向对象的方法:

  1. 将模拟内存包装在一个不透明的指针中,该指针只能通过一组特定的函数进行读取和写入(例如memory_write_bytememory_read_byte)。
  2. 使内存对象维护一个函数指针列表,指向用于处理写事件的回调函数。每当写入发生时,让它调用所有这些回调。
  3. 想要监视内存中该位置的代码部分可以向内存对象注册回调,每当调用回调时,它都可以根据需要修改内存。

答案 1 :(得分:3)

我会研究共享内存ala mmap。使用mmap,您可以让两个进程共享同一页面,其中一个进程可以只读。

当对此内存区域进行写入时,将生成SIGSEGV,您可以捕获该SIGSEGV,然后执行某种操作。这是使用UNIX术语,但你可以用Windows做同样的事情,它只是稍微涉及。