if语句的反汇编判断
if语句的反汇编判断基本是围绕JCC指令的,如果想要有深刻的理解,可以自行练习JCC指令
执行各类影响标志位的指令
jxx xxxx
1、案例一
mov eax,dword ptr [ebp+8] 分析:cmp指令 影响标志位
cmp eax,dword ptr [ebp+0Ch] jle :小于或者等于就跳转到00401059
jle 00401059
2、案例二
mov eax,dword ptr [ebp+8] 分析:cmp指令 影响标志位
cmp eax,dword ptr [ebp+0Ch] jl :小于则跳转
jl 00401059
3、案例三
mov eax,dword ptr [ebp+8] jge :大于或者等于则跳转
cmp eax,dword ptr [ebp+0Ch]
jge 00401059
4、案例四
mov eax,dword ptr [ebp+8] jg :大于则跳转
cmp eax,dword ptr [ebp+0Ch]
jg 00401059
仅列举少许,有兴趣可以尝试全部的JCC指令,以便加深理解
案例分析
在分析if语句时,我们得先有一个整体概念,即在函数调用前,先分析大段,如下:
函数调用处代码:
push 5 分析:
push 4 两个参数
call 0040100f
add esp,8
分析第一个实例:
1 00401030 push ebp
2 00401031 mov ebp,esp
3 00401033 sub esp,40h
4 00401036 push ebx
5 00401037 push esi
6 00401038 push edi
7 00401039 lea edi,[ebp-40h]
8 0040103C mov ecx,10h
9 00401041 mov eax,0CCCCCCCCh
10 00401046 rep stos dword ptr [edi]
11 00401048 mov eax,dword ptr [ebp+8]
12 0040104B cmp eax,dword ptr [ebp+0Ch]
13 0040104E jle 00401059
14 00401050 mov ecx,dword ptr [ebp+8]
15 00401053 mov dword ptr [004225c4],ecx
16 00401059 pop edi
17 0040105A pop esi
18 0040105B pop ebx
19 0040105C mov esp,ebp
20 0040105E pop ebp
21 0040105F ret
我在Excel中将其用颜色标注,上下两段颜色一样的,我们可以不用看,之前有过探究,开辟堆栈所进行的一系列操作,实际功能块就是中间紫色那块
我们的分析过程可大致分为下面五个步骤:
函数内部功能分析:
1、分析参数:
[ebp+8] : X [ebp+0Ch] :Y
2、分析局部变量
无
3、分析全局变量
mov dword ptr 004225c4,ecx
4、功能分析
mov eax,dword ptr [ebp+8]
cmp eax,dword ptr [ebp+0Ch]
将参数X存到到EAX中,然后比较EAX,与参数Y的大小
如果X<=Y 那么跳转到00401059的位置
否则,将X的值存储到全局变量中
5、返回值分析
无
分析第二个实例:
调用处代码:
push 5
push 4
call 0040100f
add esp,8
函数内部:
1 00401030 push ebp
2 00401031 mov ebp,esp
3 00401033 sub esp,44h
4 00401036 push ebx
5 00401037 push esi
6 00401038 push edi
7 00401039 lea edi,[ebp-44h]
8 0040103C mov ecx,11h
9 00401041 mov eax,0CCCCCCCCh
10 00401046 rep stos dword ptr [edi]
11 00401048 mov eax,[004225c4]
12 0040104D mov dword ptr [ebp-4],eax
13 00401050 mov ecx,dword ptr [ebp+8]
14 00401053 cmp ecx,dword ptr [ebp+0Ch]
15 00401056 jg 00401064
16 00401058 mov edx,dword ptr [ebp+0Ch]
17 0040105B add edx,dword ptr [ebp-4]
18 0040105E mov dword ptr [004225c4],edx
19 00401064 pop edi
20 00401065 pop esi
21 00401066 pop ebx
22 00401067 mov esp,ebp
23 00401069 pop ebp
24 0040106A ret
我还是在Excel中标注一下颜色:
函数内部功能分析:
1、分析参数:
Y: ebp+8 Z: ebp+c
2、分析局部变量
A:ebp-4
3、分析全局变量
Global:dword ptr [004225c4],edx
4、功能分析
a、00401048 mov eax,[004225c4]
0040104D mov dword ptr [ebp-4],eax
A = Global
b、00401050 mov ecx,dword ptr [ebp+8]
00401053 cmp ecx,dword ptr [ebp+0Ch]
参数Y与Z比较大小
c、00401056 jg 00401064
如果Y比Z大,则跳转至0x00401064,否则程序走下一步
d、00401058 mov edx,dword ptr [ebp+0Ch]
0040105B add edx,dword ptr [ebp-4]
0040105E mov dword ptr [004225c4],edx
到这一步,说明Y小于等于Z,将Z与A相加,并把相加的值赋给Global
5、返回值分析
无
6、还原成C函数
1 int Global;
2 void function(int Z, int Y)
3 {
4 int A = Global;
5 if (Y <= Z)
6 {
7 Global = A + Z;
8 }
9 }
IF...ELSE...语句的反汇编判断:
IF...ELSE...语句的反汇编判断:
IF_BEGIN:
先执行各类影响标志位的指令
jxx ELSE_BEGIN
......
IF_END:
jmp END
ELSE_BEGIN:
......
ELSE_END:
END:
特点分析:
1、如果不跳转,那么会执行到jmp处,jmp直接跳转到END处
2、如果跳转,则会直接跳过jmp END处的代码,直接执行后面的代码
总结:
跳转执行一部分代码,不跳转执行另外一部分代码
第一个jxx跳转的地址前面有一个jmp ,可以判断是if...else...语句
第一个案例分析
1 004010B0 push ebp
2 004010B1 mov ebp,esp
3 004010B3 sub esp,44h
4 004010B6 push ebx
5 004010B7 push esi
6 004010B8 push edi
7 004010B9 lea edi,[ebp-44h]
8 004010BC mov ecx,11h
9 004010C1 mov eax,0CCCCCCCCh
10 004010C6 rep stos dword ptr [edi]
11 004010C8 mov eax,[004225c4]
12 004010CD mov dword ptr [ebp-4],eax
13 004010D0 mov ecx,dword ptr [ebp+8]
14 004010D3 cmp ecx,dword ptr [ebp+0Ch]
15 004010D6 jle 004010e6
16 004010D8 mov edx,dword ptr [ebp+8]
17 004010DB add edx,dword ptr [ebp-4]
18 004010DE mov dword ptr [004225c4],edx
19 004010E4 jmp 004010f1
20 004010E6 mov eax,dword ptr [ebp+0Ch]
21 004010E9 add eax,dword ptr [ebp-4]
22 004010EC mov [004225c4],eax
23 004010F1 pop edi
24 004010F2 pop esi
25 004010F3 pop ebx
26 004010F4 mov esp,ebp
27 004010F6 pop ebp
28 004010F7 ret
函数内部功能分析:
1、分析参数:
[ebp+8] : X [ebp+0Ch] :Y
2、分析局部变量
[ebp-4] = eax = [004225c4]
3、分析全局变量
[004225c4] G
4、功能分析
a、004010C8 mov eax,[004225c4]
004010CD mov dword ptr [ebp-4],eax
Local = Global
b、004010D0 mov ecx,dword ptr [ebp+8]
004010D3 cmp ecx,dword ptr [ebp+0Ch]
比较X与Y的大小
c、如果Y<=X 那么执行
004010E6 mov eax,dword ptr [ebp+0Ch] X
004010E9 add eax,dword ptr [ebp-4] Local + X
004010EC mov [004225c4],eax Global = Local + X
d、如果Y>X 那么执行
004010D8 mov edx,dword ptr [ebp+8] Y
004010DB add edx,dword ptr [ebp-4] Local + Y
004010DE mov dword ptr [004225c4],edx Global = Local + Y
004010E4 jmp 004010f1
5、返回值分析
无
第二个案例分析
1 004010B0 push ebp
2 004010B1 mov ebp,esp
3 004010B3 sub esp,48h
4 004010B6 push ebx
5 004010B7 push esi
6 004010B8 push edi
7 004010B9 lea edi,[ebp-48h]
8 004010BC mov ecx,12h
9 004010C1 mov eax,0CCCCCCCCh
10 004010C6 rep stos dword ptr [edi]
11 004010C8 mov eax,[004225c4]
12 004010CD mov dword ptr [ebp-4],eax
13 004010D0 mov dword ptr [ebp-8],2
14 004010D7 mov ecx,dword ptr [ebp+8]
15 004010DA cmp ecx,dword ptr [ebp+0Ch]
16 004010DD jl 004010e8
17 004010DF mov edx,dword ptr [ebp-8]
18 004010E2 add edx,1
19 004010E5 mov dword ptr [ebp-8],edx
20 004010E8 mov eax,dword ptr [ebp+8]
21 004010EB cmp eax,dword ptr [ebp+0Ch]
22 004010EE jge 004010fb
23 004010F0 mov ecx,dword ptr [ebp-8]
24 004010F3 mov dword ptr [004225c4],ecx
25 004010F9 jmp 00401107
26 004010FB mov edx,dword ptr [ebp-4]
27 004010FE add edx,dword ptr [ebp-8]
28 00401101 mov dword ptr [004225c4],edx
29 00401107 pop edi
30 00401108 pop esi
31 00401109 pop ebx
32 0040110A mov esp,ebp
33 0040110C pop ebp
34 0040110D ret
分析过程如下: