• 逆向2--函数的调用过程


    这个程序的源代码为调用一个加法函数,打印main用来定位主函数入口,目的是分析一个函数在调用的过程中汇编中的代码是怎么样的

    打开反汇编,寻找到主函数;

     call 调用一个函数的过程是:push eip 先保存当前的eip指令指针,然后jum到函数的地址

    下面这里是按F7进入到函数里面

    一个函数的调用过程:

    00CBD300  /> 55            PUSH EBP                            ;  保存栈底指针
    00CBD301  |.  8BEC          MOV EBP,ESP                         ;  把栈顶指针给栈底,栈顶和栈底指向同一地址
    00CBD303  |.  81EC C0000000 SUB ESP,0C0                         ;  抬高栈顶0c0长度,开辟一个新的栈长度
    00CBD309  |.  53            PUSH EBX                            ;  下面三个寄存器可能会用到覆盖原来的值,先保存起来,等下怕这个函数改成什么鬼了都不知道,避免破坏原理的main函数
    00CBD30A  |.  56            PUSH ESI
    00CBD30B  |.  57            PUSH EDI
    00CBD30C  |.  8DBD 40FFFFFF LEA EDI,DWORD PTR SS:[EBP-C0]       ;  新的栈顶的首地址给了edi
    00CBD312  |.  B9 30000000   MOV ECX,30                          ;  ecx经常用来循环,循环计数器初始化
    00CBD317  |.  B8 CCCCCCCC   MOV EAX,CCCCCCCC
    00CBD31C  |.  F3:AB         REP STOS DWORD PTR ES:[EDI]         ;  rep 重复执行上面一条 把新的栈空间全部刷成cccc,初始化
    00CBD31E  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]        ;  传进来的参数
    00CBD321  |.  0345 0C       ADD EAX,DWORD PTR SS:[EBP+C]        ; 实现加法功能
    00CBD324  |.  5F            POP EDI                             ;  复原原来的值
    00CBD325  |.  5E            POP ESI
    00CBD326  |.  5B            POP EBX
    00CBD327  |.  8BE5          MOV ESP,EBP                         ;  复原原来的栈顶
    00CBD329  |.  5D            POP EBP                             ;  复原栈底
    00CBD32A  .  C3            RETN                                ;  eax 默认返回函数
  • 相关阅读:
    sql 数据库还原脚本 (kill链接+独占
    最长回文字符串
    UVa 455 Periodic Strings
    UVa 1225 Digit Counting
    UVa 340 Master-Mind Hints
    UVa 10976
    UVa 725
    UVa 11059
    POJ1887 最长下降子序列
    最大连续子序列算法(数组的连续子数组最大和(首尾不相连))
  • 原文地址:https://www.cnblogs.com/trevain/p/14643603.html
Copyright © 2020-2023  润新知