逆向工程-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
在这段代码中,可以看到,首先是给这个函数提升了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