我知道正确反汇编 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
,打开PC
LSB
意味着您正在运行thumb
模式(不同的指令集),而操作码始终为 4 字节长(在aarch64
上)。在ARMv7
,它们在常规模式下长 4 个字节,在thumb
模式 iirc 上长 2 个字节)。
然而,在实践中,大多数代码都是由编译器生成的,这种令人讨厌的技巧不会发生。所以编译器代码实际上很容易反汇编。