Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 检测何时写入内存地址_C_Emulation - Fatal编程技术网

C 检测何时写入内存地址

C 检测何时写入内存地址,c,emulation,C,Emulation,我有一个字节数组,用作模拟系统RAM。我想为一个给定的单元制作一个防弹补丁,当它被写入时检测,并立即覆盖它。使用类循环 for (;;) { address = x; sleep(y); } 存在一个缺陷,即存在一个最小可能的睡眠值,该值似乎与模拟帧长度几乎相同,因此它每帧仅修补一次地址。因此,如果一个游戏每帧写入100次,那么这样的补丁就没有什么意义了 我有一些关于编写的钩子,但这些钩子只能通过读取正在执行的游戏代码来捕获写入,而我想让这些补丁适用于任何内存区域,而不仅仅是R

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

for (;;) {
    address = x;
    sleep(y);
}
存在一个缺陷,即存在一个最小可能的睡眠值,该值似乎与模拟帧长度几乎相同,因此它每帧仅修补一次地址。因此,如果一个游戏每帧写入100次,那么这样的补丁就没有什么意义了

我有一些关于编写的钩子,但这些钩子只能通过读取正在执行的游戏代码来捕获写入,而我想让这些补丁适用于任何内存区域,而不仅仅是RAM,因此我不能太依赖于解释模拟代码(它根本不匹配我想要修补的所有区域)


因此,我需要一些pragramtic监视点,它有一个指向数组的指针和一个我想监视变化的字节。

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

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

  • 我会在mmap中查看共享内存。使用mmap,两个进程可以共享同一页,其中一个进程可以是只读的


    当在这个内存区域上发生写操作时,会生成一个SIGSEGV,您可以捕获它,然后执行某种操作。这是使用UNIX术语,但您也可以在windows上执行同样的操作,它只是稍微复杂一些。

    如果同一页上没有太多其他内容,那么在使用MMU的系统上,保护页和/或写保护页可能会有所帮助。也许可以检查您选择的性能库(TAU或PAPI)在内存访问上公开其挂钩处理器有什么内置调试器硬件?这能实现什么?任何c函数都不能使用包装器并写入受保护的内存。+1,跨平台解决方案,@Claris,一个不透明的结构阻止您读写(只能通过属性get set方法访问),请查看@Claris,这取决于您是否给它们一个引用。我认为建议是让一切都通过一个定义良好的API。听起来我必须编辑模拟核心。。。如果是的话,这不是一个选项。好的,作为替代,您不能在运行每个模拟指令后编辑内存吗?这假定代码结构良好,因此每次执行指令时都会有一些循环或函数运行,并且假定不需要提前修改内存。您使用的是什么模拟器?您可以用什么方式编辑它?