对ReverseMe进行逆向的时候一点思考与问题*

首先函数调用的过程,都是先把函数要用的参数压入栈中,然后进行call操作,然后函数执行完后,刚才压入栈中的数据全部出栈,栈顶指针回到调用函数前的状态。可见API函数是根据栈中的数据进行调用的

然后是GetModuleHandle函数,
见https://blog.csdn.net/zhaodaozhang/article/details/32714969
这里的参数正好是0,返回值是00400000,存放在EAX里面,
首先返回值都存放在EAX里面这是可以理解的,但是为什么是00400000,ctrl+G跟随后发现00400000是其他不相干的数据,为什么
这是因为使用该函数获得的是程序的“基址”,从基址到真正代码的部分是文件头
在文件头部分可以在0040003C找到真正的PE signature与基址间的偏移
可以得到真正的PE signature部分,在这一部分中找到AddressOfEntryPoint,即代码开始部分与基址间的偏移原始值位1000,可以通过在内存单元里修改变成1024跳过开始的NAG部分(PE结构

也可通过将关键修改成jmp nop等
也可以将MessageBox的OwnerHandle参数改变

调用函数前

调用函数后
在这里插入图片描述

然后程序主对话框的显示模块是在程序下面的,地址是00401052
跟踪其进入后,更验证了ShowWindow和UpdateWindow的不同
执行到ShowWindow函数时,程序只显示一个白色的对话框,执行到UpdateWindow时才显示文本,这是因为其发送了WM_PAINT消息

但是无法理解ExitProcess函数,它的参数是退出代码,但是调用它之后栈顶指针从0019FF70变成了00E9FE7C 不知道为什么,同时也程序也跑到了77B62C7C、
这个函数的原理是什么?

调用函数前
在这里插入图片描述
调用函数后
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值