逆向工程-if-else语句逆向分析

逆向工程-if-else语句逆向分析

第一步 生成代码

源cpp代码

#include<Windows.h>
#include<iostream>
int __stdcall test(int a, int b, int c)
{
int e = 0;
if (a > b)
{
e = a;
}
else
{
e = c;
}
return e;
}

int main()
{
printf("begin\n");

int a = 0;
a = test(1, 2, 3);
printf("end\n");
return 0;
}

第二步用od调试分析

od下载链接:https://download.csdn.net/download/weixin_43916597/14042565

第三步找到要分析的main函数

https://www.cnblogs.com/Sna1lGo/p/14073225.html

也可以用堆栈ESP来看到调用main函数的地址

第四步找到要分析的函数

通过在main函数中调试找到自己写的调用的test函数

逆向工程-if-else语句逆向分析

 

 

最后开始分析自己写的函数中的if-else

在这段代码中,可以看到,首先是给这个函数提升了44个字节的栈空间,然后把EBX,ESI和EDI三个寄存器用来入栈和出栈用来保存临时的数据

MOV DWORD PTR SS:[EBP-4],0 将寄存器EBP的值往上移4个字节在赋值为0,意思就是在开辟的栈的空间中保存一个4字节的数且为0,这里可以猜测为一个该函数的临时变量赋值为0。

MOV EAX,DWORD PTR SS:[EBP+8] 这里因为在提升栈空间的时候就有了一个PUSH EBP,然后由于汇编语言的特性在call函数的时候也会PUSH一个下一个指针的IP值,所以这里的[EBP+8]应该就是对应的传入的入栈的最后一个参数1

CMP EAX,DWORD PTR SS:[EBP+C] 就是拿eax的值跟第二个传入的参数进行比较,也就是拿第二个参数和第三个参数进行比较,来赋值给标志寄存器

JLE SHORT xxxx JLE表示带符号数小于等于时跳转,跳转到00411626

如果不跳转的话是把最好一个入参的参数返回给临时变量a,然后在跳转到00411620把临时变量的值给EAX来保存

如果JLE跳转的话就是跳转到00411620把第一个入参的数给EAX,来保存着eax

 

上一篇:栈迁移基础


下一篇:printf(“%d,%d\n“,i--,i++)