我想反汇编我拥有的可引导x86磁盘的MBR(前512字节)。我已使用
将MBR复制到文件中dd if=/dev/my-device of=mbr bs=512 count=1
对可以反汇编文件mbr
?
答案 0 :(得分:99)
您可以使用objdump。根据{{3}},语法为:
objdump -D -b binary -mi386 -Maddr16,data16 mbr
答案 1 :(得分:26)
GNU工具名为 objdump ,例如:
objdump -D -b binary -m i8086 <file>
答案 2 :(得分:20)
我为此目的喜欢ndisasm
。它配备了NASM汇编程序,它是免费的开源软件,包含在大多数Linux发行版的软件包存储库中。
答案 3 :(得分:18)
ndisasm -b16 -o7c00h -a -s7c3eh mbr
解释 - 来自ndisasm联机帮助页
-b
=指定16位,32位或64位模式。默认为16位模式。-o
=指定文件的名义加载地址。此选项会导致ndisasm获取它在左侧边缘下方列出的地址,以及PC相对跳转和调用的目标地址,右侧。-a
=启用自动(或智能)同步模式,其中ndisasm将尝试通过检查相对跳转的目标地址来猜测应执行同步的位置,并将其调用为反汇编。-s
=手动指定同步地址,以便ndisasm不会输出任何包含地址两侧字节的机器指令。因此,从该地址开始的指令将被正确分解。mbr
=要反汇编的文件。答案 4 :(得分:12)
starblue和hlovdal都有规范答案的一部分。如果你想反汇编原始的i8086代码,你通常也需要英特尔语法,而不是AT&amp; 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&amp; 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>
答案 5 :(得分:7)
尝试此命令:
sudo dd if=/dev/sda bs=512 count=1 | ndisasm -b16 -o7c00h -