使用objdump反汇编平面二进制文件

时间:2013-01-12 06:21:49

标签: reverse-engineering disassembly objdump

我可以使用objdump反汇编平面二进制文件吗?

我熟悉使用以下方法反汇编结构化二进制可执行文件,例如ELF文件。

objdump -d file.elf

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

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

2 个答案:

答案 0 :(得分:34)

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

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

我已对此进行了测试,但确实有效。

答案 1 :(得分:14)

starbluehlovdal都有规范答案的一部分。如果你想反汇编原始的i8086代码,你通常也需要英特尔语法,而不是AT& T语法,所以使用:

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)),您可以使用简短形式:

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's objconv非常好。它将标签放在分支目标上,使得更容易弄清楚代码的作用。它可以反汇编成NASM,YASM,MASM或AT& T(GNU)语法。“

Multimedia Mike已经发现--adjust-vma; ndisasm等效项是-o选项。

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

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

-m是机器,-EL表示Little Endian(代替sh4eb使用-EB),这与任何字节序中存在的体系结构相关。< / p>