概述
内容如题。将函数反汇编后看看都有些什么东西。。。
代码如下:
上面这个代码简单的不能再简单了吧。这里主要分析一下函数f()的代码(main的很类似,注意是类似不是相同)
首先让大家有一个大致的了解:每一个函数在编译成机器码时,在工作代码(这里值你的函数逻辑需要干的事,方便而已,叫啥无所谓)之前和之后都会有一段辅助代码,用来维护运行时栈。工作代码之前的部分做的工作有:
- 维护上一函数的寄存器信息,即将这些寄存器的值压栈。比如ebp、ebx、esi、edi等寄存器的值。
- 分配局部存储空间(就是函数中的自动变量所需要的存储空间)。这个很简单,只需要将esp往上挪一挪就行了。
- 初始化局部存储空间。
工作代码之后的工作有:
- 将上面压栈的寄存器值弹出到相应的寄存器。
- 释放当前存储空间。
- 修改eip,函数返回。
下面就具体分析了:
0042D680 push ebp
将ebp压栈,ebp主要用来存储当前栈帧的栈底指针,所有的局部变量都是用相对于ebp的偏移来使用的。
0042D681 mov ebp,esp
0042D683 sub esp,0CCh
这个的意思是将当前栈顶作为这一栈帧的基值。并且分配了0cc*4个字节的空间。因为栈顶往上走了cc部。
0042D689 push ebx
0042D68A push esi
0042D68B push edi
这三条很明显。保存上个函数所使用的寄存器值。这里可以看到,寄存器的保存工作是由被调用函数来做的。
0042D68C lea edi,[ebp-0CCh]
0042D692 mov ecx,33h
0042D697 mov eax,0CCCCCCCCh
0042D69C rep stos dword ptr es:[edi]
这里有4条指令,其实就是在干一件事情:将刚刚0042D683 sub esp,0CCh曾加的33h*4个字节的内容变成0xcc。这里主要说一下lea指令、rep和stos指令:
lea(load effective address):这条指令是将源操作数所在的地址传送到目的操作数中去,这里的源操作数就是ebp-0cch。
rep:这条指令意为将紧跟其后的指令从夫ecx次。ecx事先放入了循环次数,这里是33h。
stos:将eax中的内容放入目的操作数指定的地址。
下面的内容大家看的懂,就不说了,贴一下我做的结果:
0x0012FE7C edi | push edi |
|
0x0012FE80 esi | push esi |
|
0x0012FE84 ebx | push ebx |
|
0x0012FE88 cc cc cc cc .... |
| 栈顶,预留空间,sub esp,0cch |
0x0012FE8C cc cc cc cc .... |
|
|
0x0012FE90 cc cc cc cc .... |
|
|
0x0012FE94 cc cc cc cc .... |
|
|
0x0012FE98 cc cc cc cc .... |
|
|
0x0012FE9C cc cc cc cc .... |
|
|
0x0012FEA0 cc cc cc cc .... |
|
|
0x0012FEA4 cc cc cc cc .... |
|
|
0x0012FEA8 cc cc cc cc .... |
|
|
0x0012FEAC cc cc cc cc .... |
|
|
0x0012FEB0 cc cc cc cc .... |
|
|
0x0012FEB4 cc cc cc cc .... |
|
|
0x0012FEB8 cc cc cc cc .... |
|
|
0x0012FEBC cc cc cc cc .... |
|
|
0x0012FEC0 cc cc cc cc .... |
|
|
0x0012FEC4 cc cc cc cc .... |
|
|
0x0012FEC8 cc cc cc cc .... |
|
|
0x0012FECC cc cc cc cc .... |
|
|
0x0012FED0 cc cc cc cc .... |
|
|
0x0012FED4 cc cc cc cc .... |
|
|
0x0012FED8 cc cc cc cc .... |
|
|
0x0012FEDC cc cc cc cc .... |
|
|
0x0012FEE0 cc cc cc cc .... |
|
|
0x0012FEE4 cc cc cc cc .... |
|
|
0x0012FEE8 cc cc cc cc .... |
|
|
0x0012FEEC cc cc cc cc .... |
|
|
0x0012FEF0 cc cc cc cc .... |
|
|
0x0012FEF4 cc cc cc cc .... |
|
|
0x0012FEF8 cc cc cc cc .... |
|
|
0x0012FEFC cc cc cc cc .... |
|
|
0x0012FF00 cc cc cc cc .... |
|
|
0x0012FF04 cc cc cc cc .... |
|
|
0x0012FF08 cc cc cc cc .... |
|
|
0x0012FF0C cc cc cc cc .... |
|
|
0x0012FF10 cc cc cc cc .... |
|
|
0x0012FF14 cc cc cc cc .... |
|
|
0x0012FF18 cc cc cc cc .... |
|
|
0x0012FF1C cc cc cc cc .... |
|
|
0x0012FF20 cc cc cc cc .... |
|
|
0x0012FF24 cc cc cc cc .... |
|
|
0x0012FF28 cc cc cc cc .... |
|
|
0x0012FF2C cc cc cc cc .... |
|
|
0x0012FF30 cc cc cc cc .... |
|
|
0x0012FF34 cc cc cc cc .... |
|
|
0x0012FF38 cc cc cc cc .... |
|
|
0x0012FF3C cc cc cc cc .... |
|
|
0x0012FF40 cc cc cc cc .... |
|
|
0x0012FF44 cc cc cc cc .... |
|
|
0x0012FF48 cc cc cc cc .... |
|
|
0x0012FF4C cc cc cc cc .... |
|
|
0x0012FF50 cc cc cc cc .... |
|
|
0x0012FF54 b8 ff 12 00 .... |
| 存的是上一栈帧的底ebp,且这时的esp为这一帧的栈底ebp |
是不是有好多cccc啊,这个就是对局部空间初始化的结果,如果你在局部空间里有字符数组就就会看见下面的东西:
最后
以上就是清脆玉米为你收集整理的函数反汇编的全部内容,希望文章能够帮你解决函数反汇编所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复