Chinese:
1、if语句转换的条件跳转指令与if的判断结果是相反的。
// C++ Code if (argc == 0) { printf("%d", argc); } 00401028 cmp dword ptr [ebp+8], 0 0040102C jne main+2Fh (0040103F) ;此处执行printf,汇编指令省略
0040103F xor eax, eax
// C++ Code if (argc > 0) { printf("%d", argc); } 0040103F cmp dword ptr [ebp+8], 0 00401043 jle MyIf+42h (00401052) ;此处执行printf,汇编指令省略
00401052 pop edi
通过两个示例,可以看出if语句在转换成汇编代码后,由于当if比较结果为假时需要跳过if语句块内的代码,因此使用了相反的条件跳转指令。
总结:
; 先执行各类影响标志位的指令
; 其后是各种条件跳转指令
jxx xxxx
如果遇到以上指令序列,可高度怀疑它是一个由if语句组成的单分支结构。
2、if..else..语句
// C++ Code if (argc == 0) { printf("argc == 0"); } else { printf("argc != 0"); } 004010B8 cmp dword ptr [ebp+8], 0 ;跳转成立,跳转到地址0x004010CD处,即else语句块的首地址 004010BC jne IfElse+2Dh (004010cd) ;此处执行printf,汇编指令省略 004010CB jmp IfElse+3Ah (004010da) ;此处执行printf,汇编指令省略 ; else语句结束处 004010DA pop edi
if语句转换的条件跳转和之前的相同,都是取相反的条件跳转指令,而在else处多了一句jmp指令这是为了在if语句比较后,如果结果为真,则程序流程执行if语句块并且跳过else语句块,反之执行else语句块。
总结:
;先执行影响标志位的相关指令
jxx ELSE_BEGIN
IF_BEGIN:
....
IF_END:
jmp ELSE_END
ELSE_BEGIN:
....
ELSE_END:
如果遇到以上指令序列,先考察其中的两个跳转指令,当第一个条件跳转指令跳转到地址ELSE_BEGIN处之前有个jmp指令,则可将其视为由if...else...组合而成的双分支结构。
3、由if构成的多分支流程
// C++ Code void IfElseIf(int argc) { if (argc > 0) { printf("argc > 0"); } else if (argc == 0) { printf("argc == 0"); } else { printf("argc == 0"); } } 00401108 cmp dword ptr [ebp+8], 0 ;若判断后结果小于等于0,则跳转到地址0x0040111D 0040110C jle IfElseIf+2Dh (0040111d) ;printf略 ;对应else,当上一条if语句被执行,执行jmp指令,跳转到地址0x0040113F处 ;该地址为多分支结构结束地址,即最后一个else或else if的结束地址 0040111B jmp IfElseIf+4Fh (0040113f) 0040111D cmp dword ptr [ebp+8], 0 ;若判断后结果不等于0,则跳转到地址0x00401132 00401121 jne IfElseIf+42h (00401132) ;printf略 00401130 jmp IfElseIf+4Fh (0040113f) ;printf略 0040113F pop edi
虽然if,else都组合到了一起,但是没给if,else又都是独立的,if仍然是由cmp/test加jxx组成,jxx指出了下一个else if的起始点,而jmp指出了整个多分支结构的末尾地址已经当前if或者else if语句块的末尾。最后的else块的边界也很容易识别,如果发现多分支块内的某一段代码在执行前没有判定,即可定义为else块。
总结:
; 会影响标志位的指令
jxx ELSE_IF_BEGIN
IF_BEGIN:
...
IF_END:
jmp END
ELSE_IF_BEGIN:
;可影响标志位的指令
jxx ELSE_BEGIN
...
IF_ELSE_END:
jmp END
ELSE_BEGIN:
...
END:
...
如果遇到这样的代码块,需要考察各跳转指令之间的关系。当每个条件跳转指令的跳转地址之前都紧跟jmp指令,并且它们跳转指令都一样时,可视为一个多分支结构。