
. if…else…支系构造事例程序流程
最先来写一个简易的C语言编码事例,随后对事例编码开展详细介绍。事例编码如下所示:
#include<stdio.h>intmain(){inta=0,b=1,c=2;if(a>b){printf("%d\r\n",a);}elseif(b<=c){printf("%d\r\n",b);}else{printf("%d\r\n",c);}return0;}
2. 反向反编译分析
以上编码十分短且非常简单,用IDA看其反汇编代码。固定不动方式的顶部和尾端部位省去不要看,关键看其重要的反汇编代码,详细如下:
.text:00401028mov[ebp var_4],0.text:0040102Fmov[ebp var_8],1.text:00401036mov[ebp var_C],2
以上3行反汇编代码是对界定的自变量的复位,在IDA中可以利用键盘快捷键将其重新命名。将以上3个自变量重新命名后,看其他的反汇编代码,详细如下:
.text:0040103Dmoveax,[ebp var_4].text:00401040cmpeax,[ebp var_8].text:00401043jleshortloc_401058.text:00401045movecx,[ebp var_4].text:00401048pushecx.text:00401049pushoffsetFormat;"%d\r\n".text:0040104Ecall_printf.text:00401053addesp,8.text:00401056jmpshortloc_401084.text:00401058;-------------------------------------------------.text:00401058.text:00401058loc_401058:;CODEXREF:_main 33j.text:00401058movedx,[ebp var_8].text:0040105Bcmpedx,[ebp var_C].text:0040105Ejgshortloc_401073.text:00401060moveax,[ebp var_8].text:00401063pusheax.text:00401064pushoffsetFormat;"%d\r\n".text:00401069call_printf.text:0040106Eaddesp,8.text:00401071jmpshortloc_401084.text:00401073;--------------------------------------------------.text:00401073.text:00401073loc_401073:;CODEXREF:_main 4Ej.text:00401073movecx,[ebp var_C].text:00401076pushecx.text:00401077pushoffsetFormat;"%d\r\n".text:0040107Ccall_printf.text:00401081addesp,8.text:00401084.text:00401084loc_401084:;CODEXREF:_main 46j.text:00401084;_main 61j
将以上反编译分成3段开展观查,第1段的地点范畴是0040103D至00401056,第2段的地点范畴是00401058至00401071,第3段的地点范畴是00401073至00401081。除开第3段编码外,前边2段的编码有一个相同的特点:cmp / jxx / printf / jmp。这一部分作用的特点便是if…else…的特点所属。看一下IDA制作的此段反汇编代码的反编译步骤构造,如下图1所显示。

图1 if…else…反编译步骤构造
在C语言编码中,危害操作程序的是2个重要的较为,分别是“>”和“<=”。在反汇编代码中,危害关键步骤的是2个标准自动跳转命令,分别是“jle”和“jg”。C语言编码中,“>”(大于号)在反编译中相匹配的是“jle”(不大于则自动跳转),“<=”(小于等于号)在反编译中相匹配的是“jg”(超过则自动跳转)。
留意观查00401043和0040105E这两个详细地址,jxx命令会绕过随后其之后的命令一部分,而自动跳转的目地详细地址上边都是有一条jmp没有理由自动跳转命令。换句话说,jxx和jmp中间的部份是C语言编码中较为关系式取得成功后实行的编码。在反汇编代码中,假如标准自动跳转命令沒有产生自动跳转,则实行之后的命令。那样的反汇编语言指令与C语言的程序流程是一致的。当标准自动跳转命令产生自动跳转后,实行完对应的命令后会实行jmp命令跳到某一详细地址。留意观查,两根jmp自动跳转的目地详细地址都为00401084。
3. if…else…构造总结
从案例中可以找到C语言if…else…构造与反汇编代码的相匹配构造,详细如下:
;复位自变量movxxx,xxxmovxxx,xxx;较为自动跳转cmpxxx,xxxjxx_else_if;一系列解决命令……jmp_if_else完毕部位_else_if:movxxx,xxx;较为自动跳转cmpxxx,xxxjxx_else;一系列解决整治……jmp_if_else完毕部位_else:;一系列解决命令……_if_else完毕部位:
以上便是if…else…支系结构特征的大致方式。