飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3304|回复: 2

[转贴] 反汇编分析函数

[复制链接]
  • TA的每日心情
    慵懒
    2019-3-12 17:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2010-5-16 22:46:08 | 显示全部楼层 |阅读模式
    int fun(int a, int b) {
       char var[128] = "A";
       a = 0x4455;
       b = 0x6677;
       return a + b;
    }
    int main() {
        fun(0x8899,0x1100);
        return 0;
    }
    F11跟踪到fun,alt+8看反汇编代码:
    00401078   push        1100h //参数压栈,这里遵循__cdecl调用规范,参数由右向左
    0040107D   push        8899h//压栈
    00401082   call        @ILT+0(_fun) (00401005)
    00401087   add         esp,8//被调用函数的堆栈由主调函数来清空
    1.GIF

    由上图的EIP可以看到0040B500就是下条要执行的指令,在Memory窗口中可以看到内存数据99880000和11000000,实质上是0x8899,0x1100,(intel处理器一般都是小端存储),还可以看到有内存数据87104000,实质上是00401087,在主调函数中,可以很清楚的看到00401087被调函数返回以后执行的第一条指令,也就是堆栈清空指令(遵循__cdecl调用规范)。Call指令隐含做了一个操作:就是把函数返回后执行的第一条指令压入堆栈。
    1:    int fun(int a, int b) {
    0040B500   push        ebp //
    0040B501   mov         ebp,esp //调用函数通常的做法,通过ebp基址寄存器来操作堆//栈数据
    0040B503   sub         esp,0C0h //为什么是C0h(不是因为堆栈保护,防止缓冲区overflow,而是DEBUG选项造成的)
    0040B509   push        ebx
    0040B50A   push        esi
    0040B50B   push        edi
    0040B50C   lea         edi,[ebp-0C0h]
    0040B512   mov         ecx,30h //C0h 除以4,就是30h,因为rep stos用的是dword
    0040B517   mov         eax,0CCCCCCCCh
    0040B51C   rep stos    dword ptr [edi] //用0CCCCCCCCh初始化堆栈
    2:       char var[128] = "A";
    0040B51E   mov         ax,[string "A" (0041f10c)] //此时EBP = 0012FF24
    0040B524   mov         word ptr [ebp-80h],ax //80h也就是128,写了一个字
    0040B528   mov         ecx,1Fh //1Fh是31
    0040B52D   xor         eax,eax //清零
    0040B52F   lea         edi,[ebp-7Eh]
    0040B532   rep stos    dword ptr [edi] //一共是32个双字,开始写了一个字,rep stos
    0040B534   stos        word ptr [edi]//写入了31个双字,还剩下一个字由stos完成
    //var的地址是:0x0012fea4
    3:       a = 0x4455;
    0040B536   mov         dword ptr [ebp+8],4455h
    4:       b = 0x6677;
    0040B53D   mov         dword ptr [ebp+0Ch],6677h
    5:       return a + b;
    0040B544   mov         eax,dword ptr [ebp+8]
    0040B547   add         eax,dword ptr [ebp+0Ch] //返回值通过eax保存
    6:    }
    0040B54A   pop         edi
    0040B54B   pop         esi
    0040B54C   pop         ebx //弹栈
    0040B54D   mov         esp,ebp
    0040B54F   pop         ebp  //恢复ebp寄存器
    0040B550   ret    //默认操作,恢复EIP:将堆栈中的00401087 pop给EIP

    执行完:0040B50B   push        edi 如下图:
    2.GIF

    ESP:0012FE58 与刚进入函数的时候的ESP:0012FF28 之间的堆栈图如下:
    执行完:0040B51C   rep stos    dword ptr [edi] 后EDI 为:0012FF24,如下图:
    3.GIF
    参考文章:
    1、__cdecl __fastcall与 __stdcall
    2、字节顺序(字节排列顺序)

    [ 本帖最后由 whypro 于 2010-5-16 22:48 编辑 ]

    评分

    参与人数 1飘云币 +40 收起 理由
    月之精灵 + 40 您的贴子很精彩,希望能再次分享!

    查看全部评分

    PYG19周年生日快乐!

    该用户从未签到

    发表于 2011-2-14 16:30:22 | 显示全部楼层
    看到月老的身影了
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2011-3-18 09:22:48 | 显示全部楼层
    谢谢楼主分享
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表