关于逆向工程:使用objdump反汇编平面二进制文件

Disassembling A Flat Binary File Using objdump

我可以使用objdump拆解平面二进制文件吗?

我熟悉如何使用以下命令反汇编结构化的二进制可执行文件(例如ELF文件):

1
objdump -d file.elf

但是,如果我知道应该在例如地址0xabcd1000处加载一个平面二进制文件,我可以要求objdump对其进行反汇编吗? 我尝试提供诸如'--start-address = 0xabcd1000'之类的选项,但objdump仅声明它无法识别格式。

关于如何反汇编文件,我还有其他想法,但我想知道objdump是否可以提供简单的解决方案。


我在另一个论坛上找到了自己的问题的解决方案。看起来像这样:

1
objdump -b binary --adjust-vma=0xabcd1000 -D file.bin

我已经对此进行了测试,并且可以正常工作。


starblue和hlovdal都有部分规范的答案。如果要反汇编i8086原始代码,通常也需要Intel语法,而不是AT&T语法,因此请使用:

1
2
3
objdump -D -Mintel,i8086 -b binary -m i386 mbr.bin
objdump -D -Mintel,i386 -b binary -m i386 foo.bin    # for 32-bit code
objdump -D -Mintel,x86-64 -b binary -m i386 foo.bin  # for 64-bit code

如果您的代码是ELF(或a.out(或(E)COFF)),则可以使用缩写形式:

1
2
objdump -D -Mintel,i8086 a.out  # disassembles the entire file
objdump -d -Mintel,i8086 a.out  # disassembles only code sections

对于32位或64位代码,省略,8086; ELF标头已包含此信息。

如jameslin所建议的,ndisasm也是一个不错的选择,但是objdump通常随操作系统一起提供,并且可以处理GNU binutils支持的所有体系结构(GCC支持的那些体系的超集),并且其输出通常可以被输入到GNU as中(当然,ndisasm通常也可以输入到nasm中)。

彼得·科德斯(Peter Cordes)表示:"阿格纳·福格(Agner Fog)的objconv非常好。它将标签放在分支目标上,使弄清楚代码的作用变得容易得多。它可以分解为NASM,YASM,MASM或AT&T(GNU)语法。"

多媒体Mike已经发现有关--adjust-vma的信息; ndisasm等效项是-o选项。

要反汇编sh4代码(我使用了Debian的一个二进制文件进行测试),请将其与GNU binutils一起使用(几乎所有其他反汇编程序都限于一个平台,例如x86和ndisasmobjconv):

1
objdump -D -b binary -m sh -EL x

-m是计算机,-EL表示小尾数法(对于sh4eb使用-EB代替),这与以两种尾数法存在的体系结构有关。