调试内存映射文件



我正在开发一个.NET程序,该程序假设使用共享内存(内存映射文件(与同一机器中的其他现有程序通信。现有程序本身包括一个本地dll.NET包装器/桥接器dll,我可以使用它与其他程序通信。

问题是另一个程序非常有缺陷,该程序和dll的源代码早就不见了,所以我的目标是重新创建另一个软件。我可以反编译.NETdll,但它只是直接将P/Invoke编译为原生dll

幸运的是,我可以用System.IO.MemoryMappedFiles.MemoryMappedFile查看内存映射文件,但这就是我所得到的,当我从内存映射文件中调用某些函数时,我不知道dll从内存映射的文件中读取数据的偏移量是多少(大多数时候dll只读不写(

我还尝试在C++程序中挂接CreateFileMappingOpenFileMappingMapViewOfFile,并在本机dll中调用某些函数,但这些挂接的函数在初始化期间只调用过一次,在调用dll中的函数(假设从内存映射文件读取数据(时没有触发。如果我敢猜测的话,dll一定有指向内存映射文件的指针。

所以我的问题是,当任何进程试图读取/写入内存映射文件的某个区域时,是否可以设置断点或检测?举个例子,我想知道在我的内存映射文件中是否有读进程或指针指向偏移量0xdeadbeef。我对其他选择持开放态度,所以如果你有更好的想法,请告诉我

我不熟悉内存映射文件,但如果两个进程共享相同的内存,我相信它有相同的物理地址,如果这是真的,那么你可能会在内核模式下使用作弊引擎。

请记住,这可能会导致系统不稳定或崩溃,因此请确保在继续操作之前保存所有工作。您可以按照以下步骤操作:

  1. 首先打开其中一个程序,确保"共享存储器";在进入下一步之前创建
  2. 打开作弊引擎,确保在设置中为OpenProcess启用内核模式->在"设置"中添加并启用内核调试器->调试器选项(否则您将无法观察访问内存的指令(
  3. 在作弊引擎中打开流程,选择您在第一步中启动的程序
  4. 现在扫描欺骗引擎中的内存,因为您提到可以查看内存,取出一些要监视的字节块,将值类型更改为字节数组,然后扫描这些字节
  5. 扫描结果将显示在左侧窗格中,您可能会发现多个结果,大多数情况下只有一个正确的地址,其余地址与您扫描的值意外匹配,右键单击并选择浏览此内存区域,确保周围的数据与您期望的相匹配
  6. 回到主窗口,双击正确的窗口,它将出现在底部窗格上,右键单击它并选择";DBVM找出写入或访问该地址的内容";,将出现一个对话框(或者您的系统可能崩溃(,最重要的部分是确保那里的物理地址出现在文本框中
  7. 选择访问类型,您可以只查看写入或同时查看读取和写入并点击";启动手表";按钮
  8. 每当任何进程尝试访问或写入该内存区域时,新指令都会出现在列表中

在我看来,这个主题接近于逆向工程。既然你愿意接受建议,我的另外两分钱是:如果你计划重新创建通过共享内存发送数据的现有程序,并且你也在开发客户端,为什么不从头开始重新制作这两个程序,这样你就不必处理这个问题了?

如果知道具体的数据地址,可以使用windbg或x64dbg等调试器设置硬件数据断点。我不确定这与C#的配合效果如何,但这绝对是可能的。

您也可以尝试在windbg中使用时间旅行调试,它记录程序的整个执行过程,并允许您追溯查询地址何时被写入。

最新更新