拆卸器可以达到100%的准确度吗?

时间:2016-12-08 06:37:52

标签: disassembly

我知道正确反汇编COST二进制文件仍然是一个问题。但是,给定符号和调试信息,反汇编器可以在拆卸任何二进制文件时达到100%的准确度吗?如果不是,我想知道什么是失败的案例。

1 个答案:

答案 0 :(得分:0)

因为在某些平台上,反汇编可能不会只有一个解决方案。查看此代码,例如:

mov rax, 0x1111111111E8
call get_eip
get_eip:
pop rax
sub rax, 13
jmp rax

汇编成以下内容:

48 B8 E8 11 11 11 11 11 00 00 E8 00 00 00 00 58 48 2D 0D 00 00 00 FF E0 

jmp rax实际上会跳转到mov rax, 0x1111111111E8操作码的中间位置,特别是字节:E8 11 11 11 11,形成有效的相对调用操作码。

那么,你如何反汇编上面的二进制文件? :)

在其他平台(例如ARM)上,值或eip(ARM上的pc)确定架构。在某些ARM上,LSB PC表示您正在运行thumb模式(不同的指令集),而操作码总是4个字节长(在aarch64上。在ARMv7上,他们在常规模式下长4个字节,在thumb模式下长2个字节iirc。

然而,在实践中,大多数代码都是由编译器生成的,在这些编译器中不会发生这些令人讨厌的技巧。所以编译器代码实际上很容易被反汇编。