• 反汇编:函数嵌套调用


    实现的功能:两层函数调用,外层函数的传入的两个参数再传到子函数中相加,实现四个数相加返回

    004010E8  |.  6A 03         PUSH 3                                   ;  压入3
    004010EA  |.  6A 02         PUSH 2                                   ;  压入2
    004010EC  |.  6A 01         PUSH 1                                   ;  压入1
    004010EE  |.  E8 12FFFFFF   CALL StackDem.00401005                   ;  压入CALL地址+指令长度,再调用CALL
    004010F3  |.  83C4 0C       ADD ESP,0C                               ;  外平栈
    004010F6  |.  33C0          XOR EAX,EAX                              ;  清空eax
    

    进入00401005 CALL

    00401070  /> 55            PUSH EBP                                 ;  保存ebp
    00401071  |.  8BEC          MOV EBP,ESP                              ;  提升栈底
    00401073  |.  83EC 48       SUB ESP,48                               ;  提升栈顶
    00401076  |.  53            PUSH EBX                                 ;  压入ebx
    00401077  |.  56            PUSH ESI                                 ;  压入esi
    00401078  |.  57            PUSH EDI                                 ;  压入edi
    00401079  |.  8D7D B8       LEA EDI,DWORD PTR SS:[EBP-48]            ;  提升栈顶的低地址赋值给edi
    0040107C  |.  B9 12000000   MOV ECX,12                               ;  ecx 为 0x12
    00401081  |.  B8 CCCCCCCC   MOV EAX,CCCCCCCC                         ;  eax 为 0xCCCCCCCC
    00401086  |.  F3:AB         REP STOS DWORD PTR ES:[EDI]              ;  将eax的值赋值给 之前提升的栈顶和栈底之间的值
    00401088  |.  C745 FC 02000>MOV DWORD PTR SS:[EBP-4],2               ;  给初始化中的第一个地址赋值为2
    0040108F  |.  8B45 0C       MOV EAX,DWORD PTR SS:[EBP+C]             ;  将压入的第一个参数的值 赋值 给eax
    00401092  |.  50            PUSH EAX                                 ;  压入 第一个参数的值
    00401093  |.  8B4D 08       MOV ECX,DWORD PTR SS:[EBP+8]             ;  将压入的第二个参数的值 赋值 给eax
    00401096  |.  51            PUSH ECX                                 ;  压入 第二个参数的值
    00401097  |.  E8 6EFFFFFF   CALL StackDem.0040100A
    0040109C  |.  83C4 08       ADD ESP,8                                ;  恢复入CALL之前的栈顶
    0040109F  |.  8945 F8       MOV DWORD PTR SS:[EBP-8],EAX             ;  把上面的CALL返回值 赋值给这个CALL中处理的第二个参数
    004010A2  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]             ;  把子CALL中的参数赋值给当前eax
    004010A5  |.  0345 F8       ADD EAX,DWORD PTR SS:[EBP-8]             ;  上面两个值相加
    004010A8  |.  0345 10       ADD EAX,DWORD PTR SS:[EBP+10]            ;  上面两个值相加完之后再加上这个CALL中压入的第一个参数
    004010AB  |.  5F            POP EDI
    004010AC  |.  5E            POP ESI
    004010AD  |.  5B            POP EBX
    004010AE  |.  83C4 48       ADD ESP,48                               ;  恢复刚入CALL之前的栈顶
    004010B1  |.  3BEC          CMP EBP,ESP                              ;  比较栈顶和栈底是否相等
    004010B3  |.  E8 68000000   CALL StackDem.00401120                   ;  检查堆栈平衡
    004010B8  |.  8BE5          MOV ESP,EBP                              ;  把刚入CALL的时候堆栈中的栈底赋值给栈顶
    004010BA  |.  5D            POP EBP                                  ;  恢复入CALL之前的栈底
    004010BB  .  C3            RETN
    

    进入0040100A

    00401030  /> 55            PUSH EBP                                 ;  压入ebp
    00401031  |.  8BEC          MOV EBP,ESP
    00401033  |.  83EC 44       SUB ESP,44
    00401036  |.  53            PUSH EBX
    00401037  |.  56            PUSH ESI
    00401038  |.  57            PUSH EDI
    00401039  |.  8D7D BC       LEA EDI,DWORD PTR SS:[EBP-44]
    0040103C  |.  B9 11000000   MOV ECX,11
    00401041  |.  B8 CCCCCCCC   MOV EAX,CCCCCCCC
    00401046  |.  F3:AB         REP STOS DWORD PTR ES:[EDI]              ;  初始化垃圾数据
    00401048  |.  C745 FC 0A000>MOV DWORD PTR SS:[EBP-4],0A              ;  初始化的第一个数据 赋值为0x0A
    0040104F  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]             ;  把压入的第二个参数的值 赋值给eax
    00401052  |.  0345 0C       ADD EAX,DWORD PTR SS:[EBP+C]             ;  把压入的第一个参数的值 添加给eax
    00401055  |.  0345 FC       ADD EAX,DWORD PTR SS:[EBP-4]             ;  把初始化的第一个数据 加给 eax
    00401058  |.  5F            POP EDI
    00401059  |.  5E            POP ESI
    0040105A  |.  5B            POP EBX
    0040105B  |.  8BE5          MOV ESP,EBP
    0040105D  |.  5D            POP EBP
    0040105E  .  C3            RETN
    

  • 相关阅读:
    NFC学习一个记录
    谈话《百度搜索引擎的网页质量白皮书》
    EBS OAF 发展 URL商标、加密和编码
    绘制一个简单的实现接口盘
    [AngularFire2] Pagination
    [TypeScript] The Basics of Generics in TypeScript
    [TypeScript] Using Assertion to Convert Types in TypeScript
    [TypeScript] Sharing Class Behavior with Inheritance in TypeScript
    [TypeScript] Creating a Class in TypeScript
    [Angular2 Router] Preload lzay loading modules
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12337181.html
Copyright © 2020-2023  润新知