拆装机能达到100%的精度吗?



我知道正确反汇编 COST 二进制文件仍然是一个问题。但是,考虑到符号和调试信息,反汇编器能否在反汇编任何二进制文件时达到 100% 的准确性?如果没有,我想知道什么是失败的案例。

因为在某些平台上,反汇编可能没有单一的解决方案。例如,请查看此代码:

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,打开PCLSB意味着您正在运行thumb模式(不同的指令集),而操作码始终为 4 字节长(在aarch64上)。在ARMv7,它们在常规模式下长 4 个字节,在thumb模式 iirc 上长 2 个字节)。

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

最新更新