处理未记录的汇编语言说明列表有哪些有用的策略?即使是编写汇编代码的人,我也会发现理解他人的代码有时会遇到挑战,因为汇编语言的本质意味着必须在程序执行过程中的各个时刻从心理上跟踪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编写的二进制文件的情况下,以汇编形式编写的逆向工程程序集会更困难。

评论

推ebx ecx ??是那个错字

@blabb不,这不是反汇编程序,它是平面汇编程序。

#1 楼

我的策略是:


不要为使用反编译器感到羞耻
不要花时间在理解每条指令上。分析代码使用各种输入数据给出的结果是一种更快地了解函数整体功能的方法。
google搜索“ magic constant 0x1999999A”,并查看第四个结果
启用自动注释IDA