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

haugya2014 2015-12-27 11:17:44
各位大侠,小弟初学汇编,请教个问题。
我用cheat engine 打开某个进程的内存。
我在某个地方使用virtualallocex 申请了内存空间。新申请的内存随机分配为 0x001C0000,具有读写和执行权限。
用cheat engine 打开新申请的内存地址,显示如下:

............
001BFFE0 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
001BFFF0 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
001C0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
001C0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
001C0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
001C0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
.........
.........

那么,注入自己的指令 mov eax, [001C0000] 是没问题的,因为0x001C0000 地址是有值而且可读的。
但是如果指令换成 mov eax, [001BFFF0] 就会出错,原因应该是 0x001BFFF0 是无效内存地址。
这时被调试打开的进程就会出现异常,从而退出。

我想请教的是,如何在注入代码中采取措施,判断 mov 操作的内存是否有效,避免程序出现异常退出,或者是出现异常后如何处理,让进程继续执行下一CPU指令而不退出。

注:1、进程是别人写的,我没有源代码,无法更改,只有申请内存,注入汇编代码。
2、不考虑先判断地址有效后再申请内存,因为mov 读取的地址有可能是在我注入代码一段时间后才无效的,而我的注入代码并没有改变,还在继续访问这个无效值。
...全文
488 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly 100% 2016-01-07
  • 打赏
  • 举报
回复
挂掉是因为访问无效内存cpu进入了 data abort中断 而这个中断你没有给他相应的中断跳转 直接将cpu挂在那了
  • 打赏
  • 举报
回复
不是很简洁,但是你既然virtualallocex可以用,那么用VirtualQuery也应该没有问题。另一种方法是用SEH来捕捉异常。
haugya2014 2015-12-27
  • 打赏
  • 举报
回复
我想在自己的注入代码中加入判断内存地址是否有效的指令(汇编),如果是用VirtualQuery,会比较简洁么?代码大概怎么弄?push 参数然后 call API 么?
  • 打赏
  • 举报
回复
用VirtualQuery获得那个地址所在页的信息。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧