IF…ELSE…语句的反汇编判断

第一个 JCC 跳转到的地址前面有一个 jmp(并且 jump 是往下跳的),就可以确定是 if…else… 语句

案例分析 demo:

IF…ELSE IF…ELSE IF…多分支语句的反汇编判断

案例分析 demo:

课后作业

  1. If…else

    还原成 C :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    int G;

    void func(int x, int y) {
    int a = G;
    int b = 2;
    if (x >= y) b++;
    if (x < y) {
    G = b;
    } else {
    G = a + b;
    }
    }

    int main() {
    func(4, 5);
    return 0;
    }
  2. if…elseif…elseif…

    还原成 C:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    int func(int x, int y, int z) {
    int a = 0;
    int b = 1;
    int c = 2;

    if (x <= y) {
    a = b - 1;
    }
    else if (y >= z) {
    a = c + 1;
    }
    else if (x > z) {
    a = b + c;
    }
    else {
    a = b + c - 1;
    }

    return a + 1;
    }

    通过这个例子,可以发现 lea 可以用来当计算器用

    题目中的这一部分:

    1
    2
    3
    4
    00401116   mov         eax,dword ptr [ebp-0Ch]				
    00401119 mov ecx,dword ptr [ebp-8]
    0040111C lea edx,[ecx+eax-1]
    00401120 mov dword ptr [ebp-4],edx

    lea edx, [ecx+eax-1]实现了一条顶三条的工作量,如果用正常的算数指令,需要三行:

    1
    2
    3
    mov edx, eax
    add edx, ecx
    sub edx, 1

    但是 lea 一条就搞定了