反汇编基本结构

反汇编基本结构

ID:37524986

大小:62.00 KB

页数:15页

时间:2019-05-24

反汇编基本结构_第1页
反汇编基本结构_第2页
反汇编基本结构_第3页
反汇编基本结构_第4页
反汇编基本结构_第5页
资源描述:

《反汇编基本结构》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、反汇编基本结构(转)1、关于函数调用,在分析汇编代码时总是要遇到无数的Call,对于这些Call,尽量要根据Call之前传递的参数和Call的返回值来判断Call的功能,特别当调用的是系统函数时,不要见Call就跟,在Call之前所做的所有PUSH动作以及对寄存器的操作都可能是在给函数传递参数,而函数的返回值十有八九在EAX里面,因为程序绝大多数都使用高级语言开发,而几乎所有的高级语言编译器都默认将函数的返回值存放到EAX。2、关于堆栈,善于使用ESP会收到事半功倍的效果,在一个算法中,任何可能使用的常量、变量和

2、函数地址都必然在当前ESP中留下蛛丝马迹,由于变量是以地址的形势进行存储的,所以建议经常使用ddESP指令来观察堆栈内容,注意在汇编代码中凡是[ESP+XXXXXXXX]都代表着堆栈中的第XXXXXXXX个房间住的那个房客。3、关于变量的赋值,能否了解到对变量的赋值过程在算法研究中是非常重要的。由于变量是用地址访问的,,因此对形如MOV[AAA],BBB的代码要高度关注,它通常是修改变量(地址为AAA,或AAA为寄存器时地址为AAA的值)的值为BBB(BBB为寄存器时取BBB的值)。1.1调用约定在分析汇编代码时

3、总是要遇到无数的Call,对于这些Call,尽量要根据Call之前传递的参数和Call的返回值来判断Call的功能。传递参数的工作必须由函数调用者和函数本身来协调,计算机提供了一种被称为栈的数据结构来支持参数传递。当参数个数多于一个时,按照什么顺序把参数压入堆栈。函数调用后,由谁来把堆栈恢复。在高级语言中,通过函数调用约定来说明这两个问题。常见的调用约定有:见图123。【例】按__stdcall约定调用函数test2(Par1,Par2)pushpar2;参数2pushpar1;参数1calltest2;{pus

4、hebp;保护现场原先的EBP指针movebp,esp;设置新的EBP指针,指向栈顶moveax,[ebp+0C];调用参数2movebx,[ebp+08];调用参数1subesp,8;若函数要用局部变量,则要在堆栈中留出点空间…addesp,8;释放局部变量占用的堆栈popebp;恢复现场的ebp指针ret8;返回(相当于ret;addesp,8)}其堆栈调用示意图:1.2局部变量在子程序内部说明的变量称为局部变量,局部变量的作用域是其所在的子程序。从汇编角度来看,局部变量就是一个临时堆栈缓存,用完释放。例如这

5、个实例:附件:local.zip其反汇编代码如下(红体字为局部变量):00401000>/$6A04push4;/Arg2=0000000400401002

6、.6A03push3;

7、Arg1=0000000300401004

8、.E816000000call0040101F;Add.0040101F00401009

9、.8BD8movebx,eax0040100B

10、.6A00push0;/ExitCode=00040100D.FF1500204000call[<&KERNEL32.ExitProcess>];E

11、xitProcess0040101F/$55pushebp;保护现场原先的EBP指针00401020

12、.8BECmovebp,esp;设置新的EBP指针,指向栈顶00401022

13、.83EC04subesp,4;分配局部变量所有空间00401025

14、.8B450Cmoveax,[ebp+C];调用参数200401028

15、.8B5D08movebx,[ebp+8];调用参数10040102B

16、.895DFCmov[ebp-4],ebx;参数1放局部变量里0040102E

17、.0345FCaddeax,[ebp-4];

18、参数2与局部变量相加00401031

19、.83C404addesp,4;释放局部变量所有空间00401034

20、.5Dpopebp;恢复现场的ebp指针00401035.C20800retn81.3返回值在调试程序时,不要见Call就跟进,在Call之前所做的所有PUSH动作以及对寄存器的操作都可能是在给函数传递参数,而函数的返回值一般都放在EAX里面,当然这个值可能是一个指针,指向一个数据结构。从汇编角度来看,主要有如下形式:1)通过寄存器返回函数值;2)通过参数按引用方式返回函数值;3)通过全局变量返回函数值;

21、4)通过处理器标志返回函数值;一般情况下,由retrun操作符返回的值放在EAX寄存器之中,如果结果超过这个寄存器的位容量,那么该结果的高32位会加载到EDX寄存器中。如果返回一个含有几百个字节的结构或者一个近似大小的对象,编译器会在不告诉程序的情况下,给函数传递一个隐式参数,这个指针指向保存的返回结果。1.4.偏移量转换为虚拟地址1.4启动函数在编写Win32应用程序时

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。