c语言if else代码程序,网络安全编程:C语言逆向之if…else…结构分析

fb7ad95a84b68c7a5ae7cfef26a79dc6.png

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

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

#include

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看其反汇编代码。固定模式的头部和尾部位置省略不看,主要看其关键的反汇编代码,具体如下:

.text:00401028 mov [ebp+var_4], 0

.text:0040102F mov [ebp+var_8], 1

.text:00401036 mov [ebp+var_C], 2

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

.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绘制的该段反汇编代码的反汇编流程结构,如图1所示。

63d9e25d18a2fa36eb4b8ccde5ef387c.png

图1  if…else…反汇编流程结构

在C语言代码中,影响程序流程的是两个关键的比较,分别是“>”和“<=”。在反汇编代码中,影响主要流程的是两个条件跳转指令,分别是“jle”和“jg”。C语言代码中,“>”(大于号)在反汇编中对应的是“jle”(小于等于则跳转),“<=”(小于等于号)在反汇编中对应的是“jg”(大于则跳转)。

注意观察00401043和0040105E这两个地址,jxx指令会跳过紧接着其后面的指令部分,而跳转的目的地址上面都有一条jmp无条件跳转指令。也就是说,jxx和jmp之间的部分是C语言代码中比较表达式成功后执行的代码。在反汇编代码中,如果条件跳转指令没有发生跳转,则执行其后的指令。这样的反汇编指令与C语言的流程是相同的。当条件跳转指令发生跳转后,执行完相应的指令后会执行jmp指令跳到某个地址。注意观察,两条jmp跳转的目的地址都为00401084。

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…分支结构的大体形式。

【编辑推荐】

【责任编辑:庞桂玉 TEL:(010)68476606】

点赞 0

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值