请教读取无效内存的问题。

[复制链接]
查看11 | 回复4 | 2021-1-27 05:32:23 | 显示全部楼层 |阅读模式
各位大侠,小弟初学汇编,请教个问题。
我用cheatengine打开某个进程的内存。
我在某个地方使用virtualallocex申请了内存空间。新申请的内存随机分配为0x001C0000,具有读写和执行权限。
用cheatengine打开新申请的内存地址,显示如下:
............
001BFFE0????????????????????????????????
001BFFF0????????????????????????????????
001C000000000000000000000000000000000000
001C001000000000000000000000000000000000
001C002000000000000000000000000000000000
001C003000000000000000000000000000000000
.........
.........
那么,注入自己的指令moveax,[001C0000]是没问题的,因为0x001C0000地址是有值而且可读的。
但是如果指令换成moveax,[001BFFF0]就会出错,原因应该是0x001BFFF0是无效内存地址。
这时被调试打开的进程就会出现异常,从而退出。
我想请教的是,如何在注入代码中采取措施,判断mov操作的内存是否有效,避免程序出现异常退出,或者是出现异常后如何处理,让进程继续执行下一CPU指令而不退出。
注:1、进程是别人写的,我没有源代码,无法更改,只有申请内存,注入汇编代码。
2、不考虑先判断地址有效后再申请内存,因为mov读取的地址有可能是在我注入代码一段时间后才无效的,而我的注入代码并没有改变,还在继续访问这个无效值。

分 -->
回复

使用道具 举报

千问 | 2021-1-27 05:32:23 | 显示全部楼层
用VirtualQuery获得那个地址所在页的信息。

回复

使用道具 举报

千问 | 2021-1-27 05:32:23 | 显示全部楼层
我想在自己的注入代码中加入判断内存地址是否有效的指令(汇编),如果是用VirtualQuery,会比较简洁么?代码大概怎么弄?push参数然后callAPI么?
回复

使用道具 举报

千问 | 2021-1-27 05:32:23 | 显示全部楼层
不是很简洁,但是你既然virtualallocex可以用,那么用VirtualQuery也应该没有问题。另一种方法是用SEH来捕捉异常。

回复

使用道具 举报

千问 | 2021-1-27 05:32:23 | 显示全部楼层
挂掉是因为访问无效内存cpu进入了 dataabort中断而这个中断你没有给他相应的中断跳转 直接将cpu挂在那了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行