IF BEGIN:
mov eax,dword ptr [ebp+8]
0040103B cmp eax,dword ptr [ebp+0Ch]
0040103E jle ifreverse+2Ah (0040104a)
......
IF END:
jmp END
ELSE BEGIN:
......
ELSE END:
END:
1、如果不跳转,那么会执行到jmp处,jmp直接跳转到END处
2、如果跳转,则会直接跳过jmp END处的代码,直接执行后面的代码|
从图上可以很明显的看到 执行if执行会有影响标志位的判断 然后if满足 继续执行if代码 执行完之后 执行一个jmp跳转到END 而不满足if 满足else则会跳转到jmp的下一行 也就是else的开始代码 一直执行就是END
练习
Pasted image 20260901224733.png
函数内部功能分析:
1、分析参数:
[ebp+8]
[ebp+C]
2、分析局部变量
[ebp-4]
[ebp-8]
3、分析全局变量
004225c4
4、功能分析
首先用用全局变量给局部变量a赋值 局部变量2赋值2 比较参数1和参数2 如果参数1大于等于参数2 则变量b = b+1下一个if 为什么不是else 因为没有jmp所以不是 所以这是俩个if 第二个if是if else 再次比较参数1和参数2 如果参数1小于参数2 把变量b赋值给全局变量 如过大于等于则把变量a b加起来赋值给全局变量
5、返回值分析
无
6、还原成C函数
// ifelse逆向.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include <stdio.h>
int r;
void ifreverse(int x,int y)
{
int a = r;
int b = 2;
if (x>=y)
{
b = b+1;
}
if (b<a)
{
r = b;
}
else
{
r=a+b;
}
}
int main(int argc, char* argv[])
{
ifreverse(2,3);
}
if elseif
IF BEGIN
cmp
jcc
IF END
JMP END
ELSE IF BEGIN...
ELSE IF END
JMP END
ELSE BEGIN
ELSE END
END:
恢复堆栈
判断if else if 的逆向
1、当每个条件跳转指令要跳转的地址前面都有jmp 指令
2、这些jmp指令跳转的地址都是一样的
3、如果某个分支没有条件判断,则为else部分
源代码:
// ifelse逆向.cpp : Defines the entry point for the console application.
//
#include <stdio.h>
void ifreverse(int x,int y)
{
int a = 3;
int b = 2;
if (x>=y)
{
b = b+1;
}
else if (x>a)
{
b=b+1;
}
else if (x>b)
{
b=b+1;
}
else
{
a = a+1;
}
}
int main(int argc, char* argv[])
{
ifreverse(2,3);
return 0;
}
案例分析
同我们自己写的if else if的代码逆向一样,jmp前是if的结尾 jmp后是else if的开头,jmp的位置都是一个地方,这也标志着,if else if只要有一个条件满足 剩下的都不再执行
函数内部功能分析:
1、分析参数:
[ebp+8] X
[ebp+0Ch] Y
[ebp+10h] Z
2、分析局部变量
[ebp-4] = A = 0
[ebp-8] = B = 1
[ebp-0Ch] = C = 2
3、分析全局变量
无
4、功能分析
if(x>y)
{
A = B+1;
}
else if(x>z)
{
A = C+1;
}
else if(x>z)
{
A = B+C
}
else
{
A = B+C+1;
}
return A;
练习

1、分析参数:
[ebp+8] X
[ebp+0Ch] Y
[ebp+10h] Z
2、分析局部变量
[ebp-4] = a = 0
[ebp-8] = b = 1
[ebp-0Ch] = c = 2
3、分析全局变量
无
4、功能分析
a=0 b=1 c = 2
IF
比较参数1和2 若小于等于则X = Y-1
ELSE IF
比较参数2和参数3 若大于等于则X=Z+1
ELSE IF
比较参数1和参数3 若大于则X=Y+Z
ELSE
eax = Z ecx = y
x = z-y
return
return x+1;
先纠正一个最常见误区
❌ 错误理解:lea 是「取出括号里内存单元的地址」
✅ 本质定义:lea = 计算中括号里面那个数学表达式的值,然后把这个数字送到寄存器
5、返回值分析
a+1
6、还原C语言代码
// ifelse逆向.cpp : Defines the entry point for the console application.
//
#include <stdio.h>
void ifreverse(int x,int y,int z)
{
int a = 0;
int b = 1;
int c = 2;
if (x<=z)
{
a = b-1;
}
else if (y>=z)
{
a=c+1;
}
else if (x>z)
{
a = b+c;
}
else
{
a = b+c-1;
}
return a+1;
}
int main(int argc, char* argv[])
{
ifreverse(2,3,1);
return 0;
}