我知道正确反汇编COST二进制文件仍然是一个问题。但是,给定符号和调试信息,反汇编器可以在拆卸任何二进制文件时达到100%的准确度吗?如果不是,我想知道什么是失败的案例。
答案 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。
然而,在实践中,大多数代码都是由编译器生成的,在这些编译器中不会发生这些令人讨厌的技巧。所以编译器代码实际上很容易被反汇编。