我是靠谱客的博主 清脆玉米,最近开发中收集的这篇文章主要介绍函数反汇编,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

内容如题。将函数反汇编后看看都有些什么东西。。。

代码如下:

 

上面这个代码简单的不能再简单了吧。这里主要分析一下函数f()的代码(main的很类似,注意是类似不是相同)

首先让大家有一个大致的了解:每一个函数在编译成机器码时,在工作代码(这里值你的函数逻辑需要干的事,方便而已,叫啥无所谓)之前和之后都会有一段辅助代码,用来维护运行时栈。工作代码之前的部分做的工作有:

  1. 维护上一函数的寄存器信息,即将这些寄存器的值压栈。比如ebp、ebx、esi、edi等寄存器的值。
  2. 分配局部存储空间(就是函数中的自动变量所需要的存储空间)。这个很简单,只需要将esp往上挪一挪就行了。
  3. 初始化局部存储空间。

工作代码之后的工作有:

 

  1. 将上面压栈的寄存器值弹出到相应的寄存器。
  2. 释放当前存储空间。
  3. 修改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 esp0cch

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啊,这个就是对局部空间初始化的结果,如果你在局部空间里有字符数组就就会看见下面的东西:

 

最后

以上就是清脆玉米为你收集整理的函数反汇编的全部内容,希望文章能够帮你解决函数反汇编所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部