48

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

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

objdump -d file.elf

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

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

4

2 回答 2

54

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

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

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

于 2013-01-13T00:03:23.923 回答
33

starbluehlovdal都有部分规范答案。如果你想反汇编原始 i8086 代码,你通常需要 Intel 语法,而不是 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 标头已包含此信息。

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

Peter Cordes建议“<a href="http://agner.org/optimize/" rel="noreferrer">Agner Fog 的 objconv 非常好。它将标签放在分支目标上,从而更容易弄清楚代码的作用。它可以反汇编成 NASM、YASM、MASM 或 AT&T (GNU) 语法。”</p>

多媒体 Mike已经知道了--adjust-vmandisasm等效是选项-o

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

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

The-m是机器,-EL意思是 Little Endian(代替sh4eb使用-EB),这与存在于任一字节序中的架构相关。

于 2015-12-22T20:48:37.587 回答