if语句逆向分析
内存图
全局变量与局部变量
全局变量的特点:
- 全局变量在程序编译完成后地址就已经确定下来了,只要程序启动,全局变量就已经存在了,启动后里面是否有值取决于声明时是否给定了初始值,如果没有,默认为0
- 全局变量的值可以被所有函数所修改,里面存储的是最后一次修改的值.
- 全局变量所占内存会一直存在,知道整个进程结束.
- 全局变量的反汇编识别:MOV 寄存器,byte/word/dword ptr ds:[0x12345678]
全局变量就是所谓的基址
局部变量的特点:
局部变量在程序编译完成后并没有分配固定的地址.
在所属的方法没有被调用时,局部变量并不会分配内存地址,只有当所属的程序被调用了,才会在堆栈中分配内存.
当局部变量所属的方法执行完毕后,局部变量所占用的内存将变成垃圾数据.局部变量消失.
局部变量只能在方法内部使用,函数A无法使用函数B的局部变量.
局部变量的反汇编识别:[ebp-4],[ebp-8],[ebp-0xc]
函数参数确认
步骤1: 观察调用处代码
push 3
push 2
push 1
call 0040100f
步骤2: 找到平衡堆栈的代码继续论证
call 0040100f
add esp,0Ch
或者函数内部
ret 4/8/0xc/0x10
最后,两者一综合,函数的参数个数基本确定
- 参数传递未必都是通过堆栈,还可能通过使用寄存器
- 函数调用处的代码无法查看.
if语句判定
来个影响标志位语句,然后jcc,极有可能就是if语句
c语言与汇编指令是反着来的,比如<=在汇编里就是jg
函数分析步骤
自行分析
1 | num = 0; |
if_else判断
if_else练习
- 参数 [ebp+8]=num1, [ebp+0xc]=num2, [ebp+0x10]=num3
- 局部变量[ebp-4]=0, [ebp-8]=1, [ebp-0xc]=2
- 全局变量无
- 功能分析直接分析代码
- 返回值存在eax里,有
1 | int func(int num1, int num2, int num3) |
本文作者:NoOne
本文地址: https://noonegroup.xyz/posts/661203e9/
版权声明:转载请注明出处!