如何反编译这个汇编代码?

逆向工程 艾达 部件 反编译
2021-07-04 09:36:33

如何将以下 IDA Pro 生成的反汇编(汇编语言)转换为高级语言?

...
mov edx, Var1
mov ecx, Var2
mov eax, edx
imul ecx
mov edx, eax
imul edx, eax
mov Var3, ecx
...

我正在尝试编写一个详细的伪代码来描述所提供的程序集片段的功能。

2个回答

请注意,汇编代码和高级语言之间没有一般的 1:1 关系,特别是如果汇编是手工制作的。即使对于编译后的代码,如果代码被大量优化,也可能没有好的翻译。

另外,请注意,逆向工程不是将汇编语言翻译成更高级别的语言,而是要弄清楚发生了什么。比如一年前,有人问了这一系列的问题[ 1 ][ 2 ][ 3 ]。那家伙小心翼翼地将大量汇编代码翻译成C,而且一点也不聪明;最后,如果他能够从代码中识别出 RSA 算法,他本可以节省 2 个月的时间。

当然,某些东西的高级语言实现可能比汇编更容易阅读,因此转换为高级语言可能是工作的一部分,但在大多数情况下并不是最大的部分。

也就是说,由于您只有 2 个操作码,其中一个mov相当于赋值:

mov edx, Var1           ; edx=Var1
mov ecx, Var2           ; ecx=Var2
mov eax, edx            ; eax=edx (=Var1)
imul ecx                ; eax=eax*ecx (=Var1*Var2)
mov edx, eax            ; edx=eax (=Var1*Var2)
imul edx, eax           ; edx=edx*eax (=(Var1*Var2)^2)
mov Var3, ecx           ; var3=ecx (=Var2)

因此,您的代码计算 (Var1*Var2)^2,但随后将 Var2 分配给 Var3,而不是计算结果。

如果这是一个家庭作业问题,我想你的老师想看看你是否注意细节。此外,它表明没有对高级语言的良好翻译,因为您通常不会在不使用结果的情况下计算任何内容。虽然,在 C 中,你可以写

(Var1*Var2)*(Var1*Var2);    // note the expression without an assignment
Var3=Var2;

但是您的编译器通常会丢弃第一行。

我相信你需要的是一个反编译器

Snowman是一个免费反编译器的例子,它很容易与 IDA 集成(可以作为插件安装)。