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

55

我能否使用objdump来反汇编一个扁平的二进制文件?

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

objdump -d file.elf

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

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


这不是一个平面二进制文件。看起来像是一个ELF文件。 - Calmarius
在上面的例子中,我提到了一个ELF文件(file.elf),以说明我熟悉基本的反汇编原理。然而,我感兴趣的文件是一个纯二进制文件。文件中的前几个字节就是将要执行的第一个操作码。没有头文件。 - Multimedia Mike
可能是 如何反汇编原始的 x86 代码? 的重复问题。 - Ciro Santilli OurBigBook.com
2个回答

61

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

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

我已经测试过这个,它可以正常工作。


23
返回值无法反汇编,因为架构未知!看起来你在我的情况下错过了机器选项“-m i386”。 - Oussama L.
1
谢谢你的指出。我怀疑这是因为在Linux/x86环境下,标准的objdump处理两种架构。当我运行它时,我使用的是只处理一种架构(在我的情况下是SH-4)的版本。 - Multimedia Mike
2
你可以忽略 --adjust-vma=0xabcd1000。 - Thorsten Staerk
8
对于 x86-64 架构,需要将架构指定为 -m i386:x86-64 - ead
2
当您想要考虑代码在内存中编译的不同起始地址时,--adjust-vma=.. 是非常有用的。否则,它将按照从内存地址0开始加载的方式进行反汇编,这可能并不是实际情况。您也可以使用 --start-address=.. 从二进制文件中的不同起始偏移量进行反汇编。 - BarbaraKwarc
对于arm-v8,您可能需要使用arm-none-eabi-objdump -b binary -D -m armv8-m.main file.bin - LinconFive

40

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头已经包含了这个信息。

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

Peter Cordes建议“Agner Fog的objconv非常好用。它会在跳转目标上打标签,使得更容易理解代码的作用。它可以反汇编为NASM、YASM、MASM或AT&T(GNU)语法。”

Multimedia Mike已经发现了关于--adjust-vma的内容;而ndisasm的等价选项是-o

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

objdump -D -b binary -m sh -EL x
< p > < code > -m 是指机器,而 < code > -EL 表示小端序(如果使用 < code > sh4eb 则应使用 < code > -EB ),这与存在于任一字节顺序的体系结构有关。


对于架构,我使用了-m i386:x86-64以便能够列出AMD64二进制文件。默认情况下,只有i386会给你32位指令。-Mintel,x86-64对我没有用... - Alexis Wilke
@AlexisWilke 嗯,对我来说没问题...(Debian bullseye 和 unstable 都可以) - mirabilos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接