理解无证汇编语言有哪些有用的策略?

逆向工程 部件 x86
2021-07-10 11:51:52

处理未记录的汇编语言指令列表有哪些有用的策略?即使作为编写汇编代码的人,我发现有时理解其他人的代码也很有挑战性,因为汇编语言的本质意味着必须在程序中的各个点在精神上跟踪 CPU 状态。我已经看到通过使用记事本和笔并手工完成程序取得了一些成功。还有哪些其他策略?我们以这个函数为例:

 ; cmp     edx,10
       ; jae     internal_error
    push    ebx ecx
    push    eax
    mov    ebx,eax
    mov    ecx,edx
    shld    edx,eax,2
    sub    ebx,edx
    sbb    ecx,0
    mov    eax,ebx
    mov    ebx,1999999Ah
    mul    ebx
    mov    eax,ecx
    imul    eax,ebx
    add    eax,edx
    pop    edx
    imul    ecx,eax,10
    sub    edx,ecx
    cmp    edx,10
    jb    somewhere
    sub    edx,10
    inc    eax
    pop    ecx ebx
    retn

由于汇编语言的性质,在高层次上“这段代码实际上做了什么”并不是很明显。对我来说,理解这一点的过程是真正的“逆向工程”,但它不一定适用于从反汇编器读取,它也可能只是其他人的汇编源代码。事实上,有时如果没有 IDA Pro 或 Binary Ninja 的帮助,反汇编用 HLL 编写的二进制文件,用 aassembly 编写的逆向工程汇编会更加困难。

1个回答

我的策略是:

  • 不要以使用反编译器为耻

  • 不要花时间理解每条指令。用各种输入数据分析代码给出的结果是理解函数作为一个整体做什么的更快的方法。

  • 谷歌搜索“magic constant 0x1999999A”并查看第四个结果

  • 在 IDA 中启用自动注释

ps 如果你需要写下每条指令的作用,你要么没有合适的工具,要么做错了反转。