C语言04_IF语句逆向分析下

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;

}



上一篇 C语言04_IF语句逆向分析上
因特叁

因特叁管理员

动物世界

本月创作热力图

目录