逆向基础:if else结构分析

1.if…else…分支结构例子程序

首先来写一个简单的C语言代码例子,然后对例子代码进行介绍。例子代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int main()
{
int a=0,b=1,c=2;

if (a>b)
{
printf("%d \r\n",a);
}
else if(b <= c)
{
printf("%d \r\n",b);
}
else
{
printf("%d \r\n",c);
}
return 0;
}

2.逆向分析解析

上述代码非常短且很简单,用IDA看其反汇编代码。固定模式的头部和尾部省略不看,主要看其关键的反汇编代码,如下:

1
2
3
.text:00401028                 mov     [ebp+var_4], 0
.text:0040102F mov [ebp+var_8], 1
.text:00401036 mov [ebp+var_C], 2

以上3行反汇编代码是对定义的变量的初始化,在IDA中可以通过快捷键将其命名。将以上3个变量重命名后,看其余的反汇编代码,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
.text:0040103D                 mov     eax, [ebp+var_4]
.text:00401040 cmp eax, [ebp+var_8]
.text:00401043 jle short loc_401058
.text:00401045 mov ecx, [ebp+var_4]
.text:00401048 push ecx
.text:00401049 push offset Format ; "%d \r\n"
.text:0040104E call _printf
.text:00401053 add esp, 8
.text:00401056 jmp short loc_401084
.text:00401058 ; ---------------------------------------------------------------------------
.text:00401058
.text:00401058 loc_401058: ; CODE XREF: _main+33j
.text:00401058 mov edx, [ebp+var_8]
.text:0040105B cmp edx, [ebp+var_C]
.text:0040105E jg short loc_401073
.text:00401060 mov eax, [ebp+var_8]
.text:00401063 push eax
.text:00401064 push offset Format ; "%d \r\n"
.text:00401069 call _printf
.text:0040106E add esp, 8
.text:00401071 jmp short loc_401084
.text:00401073 ; ---------------------------------------------------------------------------
.text:00401073
.text:00401073 loc_401073: ; CODE XREF: _main+4Ej
.text:00401073 mov ecx, [ebp+var_C]
.text:00401076 push ecx
.text:00401077 push offset Format ; "%d \r\n"
.text:0040107C call _printf
.text:00401081 add esp, 8
.text:00401084
.text:00401084 loc_401084: ; CODE XREF: _main+46j
.text:00401084 ; _main+61j

将以上反汇编分为3段进行观察,第1段的地址范围是0040103D至00401056,第2段的地址范围是00401058至00401071,第3段的地址范围是00401073至00401081.除了第3段代码外,前面两段的代码有一个共同的特征:cmp/jxx/printf/jmp。这部分功能的特征就是if…else的特征所在。看一下IDA绘制的该段反汇编代码的反汇编流程结构,如下图所示:

在C语言代码中,影响程序流程的是两个关键的比较,分别是“>”和“<=”。在反汇编代码中,影响主要流程的是两个条件跳转指令,分别是“jle”和“jg”。在C语言代码中,“>”(大于号)在反汇编中对应的是“jle”(小于等于则跳转),“<=”(小于等于号)在反汇编中对应的是“jg”(大于则跳转)。
注意观察00401043和0040105E这两个地址,jxx指令会跳过紧接其后的指令部分,而跳转的目的地址上面都有一条jmp无条件跳转指令。也就是说,jxx和jmp之间的部分是C语言代码中比较表达式成功后执行的代码。在反汇编代码中,如果条件跳转指令没有发生跳转后,执行完相应的指令后会执行jmp指令跳到某个地址。注意观察,两条jmp指令跳转的目的地址都是0040084。

3.if…else…结构小结

从例子中可以找出C语言if…else…结构与反汇编代码的对应结构,如下:
;初始化变量
mov xxx, xxx
mov xxx, xxx
;比较跳转
cmp xxx, xxx
jxx _else if
;一系列处理指令
……
jmp _if_else 结束位置

_else_if:
mov xxx, xxx
;比较跳转
cmp xxx, xxx
jxx _else
;一系列处理治理
......
jmp _if_else结束位置
_else:
;一系列处理指令
......
_if_else 结束位置:

以上就是if…else分支结构的大体形式。

下接:switch结构分析

本文标题:逆向基础:if else结构分析

文章作者:water

发布时间:2018年07月23日 - 09:53:37

最后更新:2018年07月23日 - 21:48:41

原始链接:http://9cat.top/2018/07/23/逆向基础:if-else结构分析/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

------ 本文结束------
分享
分享