我可以使用objdump反汇编平面二进制文件吗?
我熟悉使用以下方法反汇编结构化二进制可执行文件,例如ELF文件。
objdump -d file.elf
但是如果我有一个我知道应该加载的平面二进制文件,例如地址0xabcd1000,我可以要求objdump反汇编吗?我尝试提供诸如'--start-address = 0xabcd1000'之类的选项,但objdump只是声明它无法识别格式。
我有关于如何反汇编文件的其他想法,但我想知道objdump是否可以提供一个简单的解决方案。
答案 0 :(得分:34)
我在另一个论坛上找到了我自己的问题的解决方案。它看起来像这样:
objdump -b binary --adjust-vma=0xabcd1000 -D file.bin
我已对此进行了测试,但确实有效。
答案 1 :(得分:14)
starblue和hlovdal都有规范答案的一部分。如果你想反汇编原始的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标题已包含此信息。
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>