C 检测何时写入内存地址
我有一个字节数组,用作模拟系统RAM。我想为一个给定的单元制作一个防弹补丁,当它被写入时检测,并立即覆盖它。使用类循环C 检测何时写入内存地址,c,emulation,C,Emulation,我有一个字节数组,用作模拟系统RAM。我想为一个给定的单元制作一个防弹补丁,当它被写入时检测,并立即覆盖它。使用类循环 for (;;) { address = x; sleep(y); } 存在一个缺陷,即存在一个最小可能的睡眠值,该值似乎与模拟帧长度几乎相同,因此它每帧仅修补一次地址。因此,如果一个游戏每帧写入100次,那么这样的补丁就没有什么意义了 我有一些关于编写的钩子,但这些钩子只能通过读取正在执行的游戏代码来捕获写入,而我想让这些补丁适用于任何内存区域,而不仅仅是R
for (;;) {
address = x;
sleep(y);
}
存在一个缺陷,即存在一个最小可能的睡眠值,该值似乎与模拟帧长度几乎相同,因此它每帧仅修补一次地址。因此,如果一个游戏每帧写入100次,那么这样的补丁就没有什么意义了
我有一些关于编写的钩子,但这些钩子只能通过读取正在执行的游戏代码来捕获写入,而我想让这些补丁适用于任何内存区域,而不仅仅是RAM,因此我不能太依赖于解释模拟代码(它根本不匹配我想要修补的所有区域)
因此,我需要一些pragramtic监视点,它有一个指向数组的指针和一个我想监视变化的字节。虽然C不是一种面向对象的语言,但我在这里会使用面向对象的方法:
内存\写入\字节
和内存\读取\字节
)进行读取和写入我会在mmap中查看共享内存。使用mmap,两个进程可以共享同一页,其中一个进程可以是只读的
当在这个内存区域上发生写操作时,会生成一个SIGSEGV,您可以捕获它,然后执行某种操作。这是使用UNIX术语,但您也可以在windows上执行同样的操作,它只是稍微复杂一些。如果同一页上没有太多其他内容,那么在使用MMU的系统上,保护页和/或写保护页可能会有所帮助。也许可以检查您选择的性能库(TAU或PAPI)在内存访问上公开其挂钩处理器有什么内置调试器硬件?这能实现什么?任何c函数都不能使用包装器并写入受保护的内存。+1,跨平台解决方案,@Claris,一个不透明的结构阻止您读写(只能通过属性get set方法访问),请查看@Claris,这取决于您是否给它们一个引用。我认为建议是让一切都通过一个定义良好的API。听起来我必须编辑模拟核心。。。如果是的话,这不是一个选项。好的,作为替代,您不能在运行每个模拟指令后编辑内存吗?这假定代码结构良好,因此每次执行指令时都会有一些循环或函数运行,并且假定不需要提前修改内存。您使用的是什么模拟器?您可以用什么方式编辑它?