zoukankan      html  css  js  c++  java
  • 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指令,并且它们跳转指令都一样时,可视为一个多分支结构。

  • 相关阅读:
    【mysql+RBAC】RBAC权限处理(转载:http://www.cnblogs.com/xiaoxi/p/5889486.html 平凡希)
    【小程序】获取微信 自带的 收货地址获取和整理
    【TP3.2】跨库操作和跨域操作
    【JS】一款好用的JS日历选择插件【bootstrap-datetimepicker.js】
    Python 读写文件中w与wt, r与rt的区别
    Python 在序列上跟踪索引和值
    SoapUI 使用变量
    python 跳过可迭代对象的开始部分
    Python 迭代器切片
    Python: 类中为什么要定义__init__()方法
  • 原文地址:https://www.cnblogs.com/maplewan/p/3277969.html
Copyright © 2011-2022 走看看