C++反汇编学习笔记(五)

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指令,并且它们跳转指令都一样时,可视为一个多分支结构。

 

 

posted @ 2013-08-23 17:49  我是枫子  阅读(346)  评论(0编辑  收藏  举报