我想分解一下我拥有的可引导x86磁盘的MBR(前512个字节)。我已经使用以下方式将MBR复制到了文件中
dd if=/dev/my-device of=mbr bs=512 count=1
对可以反汇编文件的Linux实用程序mbr
有何建议?
Answers:
您可以使用objdump。根据本文的语法为:
objdump -D -b binary -mi386 -Maddr16,data16 mbr
--target
代替-b
。-D
是“分解所有部分的内容”;-b bfdname
或--target=bfdname
将强制读取为指定的目标代码格式(在本例中不是elf,而是原始二进制);或者 -m machine
将指定要使用的架构(在我们的文件中没有带有arch信息的标头)。-M options
是反汇编程序的选项;addr16,data16
用于“指定默认地址尺寸和操作数大小”(治疗代码i8086在一个通用的x86 DISASM引擎)
ndisasm -b16 -o7c00h -a -s7c3eh mbr
解释 -来自ndisasm手册页
-b
=指定16位,32位或64位模式。默认为16位模式。-o
=指定文件的名义加载地址。此选项使ndisasm获得它列出的地址在左边距的左边,而PC相对跳转和调用的目标地址在右边。-a
=启用自动(或智能)同步模式,在该模式下,ndisasm将通过检查相对跳转的目标地址并调用其分解来尝试猜测应在何处执行同步。-s
=手动指定一个同步地址,这样ndisasm将不会输出任何包含该地址两侧字节的机器指令。因此,从该地址开始的指令将被正确地反汇编。mbr
=要反汇编的文件。-b specifies 16-, 32- or 64-bit mode. The default is 16-bit mode.
-o is the notional load address for the file. This option causes ndisasm to get the addresses it lists down the left hand margin, and the target addresses of PC-relative jumps and calls, right.
-s specifies a synchronisation address, such that ndisasm will not output any machine instruction which encompasses bytes on both sides of the address. Hence the instruction which starts at that address will be correctly disassembled.
starblue和hlovdal都具有典型的答案的一部分。如果要反汇编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)提出:“ Agner Fog的objconv非常好。它将标签放在分支目标上,使弄清楚代码的作用变得容易得多。它可以分解为NASM,YASM,MASM或AT&T(GNU)语法。”
多媒体迈克已经发现了有关--adjust-vma
; 在ndisasm
相当于是-o
选项。
拆卸,比如说,sh4
代码(我用Debian的自测试一个二进制),使用与GNU binutils的(几乎所有其他反汇编限于一个平台,例如x86与ndisasm
和objconv
):
objdump -D -b binary -m sh -EL x
的-m
是机器,并-EL
意味着小端(对于sh4eb
使用-EB
代替),这是相关的存在于任一端序架构。
gcc -O3 -masm=intel -fverbose-asm -S -o- | less
,因为我通常试图将C源代码调整为编译成良好的asm。