


全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目前我们写的最简单的Main函数如下:代码:#includestdafx.hint_tmain(intargc,_TCHAR*argv)return0;利用VS编译器将运行时程序反汇编,结果如下:代码:int_tmain(intargc,_TCHAR*argv)010C13A0pushebp010C13A1movebp,esp010C13A3subesp,0C0h010C13A9pushebx010C13AApushesi010C13ABpushedi010C13ACleaedi,ebp-0C0h010C13B2movecx,30h010C13B7moveax,0CCCCCCCCh010C13BCrepstosdwordptres:edireturn0;010C13BExoreax,eax010C13C0popedi010C13C1popesi010C13C2popebx010C13C3movesp,ebp010C13C5popebp010C13C6ret看起来汇编很头疼吧,那么让我们来茅塞顿开吧。首先了解一下以前几个未知半懂的汇编指令的含义:代码:pushebpmovebp,esppush:把一个32位操作数压入栈中,这个操作导致esp被减4。ebp被用来保存这个函数执行前的esp的值,执行完毕后用ebp恢复esp。同时,调用此函数的上层函数也用ebp做同样的事情。所以先把ebp压入堆栈,返回之前弹出,避免ebp被我们改动。代码:xoreax,eaxretxoreax,eax常用来代替moveax,0。清零操作。在windows中,函数返回值都是放在eax中然后返回,外部从eax中得到返回值。这就代表return0操作。代码:leaedi,ebp-0C0hlea取得第二个参数代表的地址放入第一个参数代表的寄存器中。代码:movecx,30hmoveax,0CCCCCCCChrepstosdwordptres:edistos是串存储指令,它的功能是将eax中的数据放入edi所指的地址中,同时edi会增加4个字节。Rep使指令重复执行ecx中填写的次数。由于CPU的寄存器有限,而且操作寄存器会影响标志值,push作用是压栈,pop是退栈。即保存寄存器标志的值和寄存器本身的值,以便在函数调用完毕后恢复原有的标志值。这也是为什么我们见到在调用某个函数或者运行一个程序时,入口总是push一堆寄存器的东东,也就是这个原因。通过上面的基础知识,我们来看看main函数的反汇编解释:代码:int_tmain(intargc,_TCHAR*argv)010C13A0pushebp;保存ebp,返回之前弹出,避免ebp被我们改动。push操作使esp减小,esp不变010C13A1movebp,esp;ebp被用来保存这个函数执行前的esp的值,执行完毕后用ebp恢复esp;原ebp值已经被压栈(位于栈顶),而新的ebp又恰恰指向栈顶;此时ebp寄存器就已经处于一个非常重要的地位,该寄存器中存储着栈中的一个地址(原ebp入栈后的栈顶);从该地址为基准,向上(栈底方向)能获取返回地址、参数值(假如main中有参数,“获取参数值”会比较容易理解;向下(栈顶方向)能获取函数局部变量值,而该地址处又存储着上一层函数调用时的ebp值010C13A3subesp,0C0h;把esp往上移动一个范围,等于在栈中开辟一片空间存储main函数的局部变量;由于冯诺依曼机是小端模式,所以sub操作可以理解为将esp栈顶减去,实际上是为栈增加空间010C13A9pushebx010C13AApushesi010C13ABpushedi;保存三个寄存器的值,待main结束恢复,原来的值被破坏有可能引起系统崩溃010C13ACleaedi,ebp-0C0h;把ebp-0c0h加载到edi中,目的是保存局部变量的区域010C13B2movecx,30h010C13B7moveax,0CCCCCCCCh010C13BCrepstosdwordptres:edi;从ebp-0c0h开始的局部变量空间区域初始化成全部0CCCCCCCCh(也就是int3中断指令的机器码);局部变量不可能被执行,执行了就会出错。这样发生意外时执行堆栈里面的内容会引发调试中断提示开发者return0;010C13BExoreax,eax;返回值将放在eax返回(这就是很多软件给秒杀爆破的原因,因为eax的返回值是可以改的)010C13C0popedi010C13C1popesi010C13C2popebx;恢复原来寄存器的值,怎么“吃”进去,怎么“吐”出来010C13C3movesp,ebp;恢复ESP栈顶指针010C13C5popebp;恢复ebp,也就是恢复调用main函数之前各个寄存器的状态010C13C6ret;将返回地址存入eip,退出主函数通过以上分析,大家应该对main
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人购房合同解除及终止条件
- 海运货物保险代理服务合同范本
- 专业遴选测试题及答案
- 边城课件课教学设计
- 幼儿园管理家园合作课件
- 消防安全服务培训班通知课件
- 2025至2030中国海藻酸锂行业项目调研及市场前景预测评估报告
- 2025年智能可穿戴设备无人机飞行安全监测技术创新解析
- 2025至2030中国工业真空阀行业项目调研及市场前景预测评估报告
- 2025至2030中国毛绒布料玩具行业发展趋势分析与未来投资战略咨询研究报告
- GA/T 383-2014法庭科学DNA实验室检验规范
- 学生课程免考(修)申请表(模板)
- 横河DCS-培训讲义课件
- 部编版三年级下册语文全册课件【完整版】
- 初中数学几何1000题专项训练(含详解分析)-最新
- 电子课件-《可编程序控制器及其应用(三菱-第三版)》-A04-1724-课题一-可编程序控制器基础知识
- 实验计划样表
- 三阶魔方入门教程课件
- 青少年亲社会行为量表
- 计算机组装与维护完整版课件(全)
- 健康疗休养基本服务承诺书
评论
0/150
提交评论