如何反汇编原始x86代码?

我想反汇编我有一个可启动的x86磁盘的MBR(前512字节)。 我已经使用MBR复制到一个文件

dd if=/dev/my-device of=mbr bs=512 count=1 

任何可以反汇编文件mbr的Linux实用程序的build议?

你可以使用objdump。 根据这篇文章的语法是:

 objdump -D -b binary -mi386 -Maddr16,data16 mbr 

GNU工具被称为objdump ,例如:

 objdump -D -b binary -m i8086 <file> 

我喜欢ndisasm为此目的。 它附带了NASM汇编程序,它是免费的,开源的,并包含在大多数Linux发行版的软件包仓库中。

 ndisasm -b16 -o7c00h -a -s7c3eh mbr 

解释 – 从ndisasm的manpage

  • -b =指定16,32或64位模式。 默认是16位模式。
  • -o =指定文件的名义加载地址。 这个选项会导致ndisasm得到它在左边空白处列出的地址,以及PC相对跳转和调用的目标地址。
  • -a =启用自动(或智能)同步模式,其中ndisasm将通过检查相对跳转的目标地址来尝试猜测应执行同步的位置,并调用它进行反汇编。
  • -s =手动指定一个同步地址,这样ndisasm将不会输出任何包含地址两边字节的机器指令。 因此,从该地址开始的指令将被正确拆卸。
  • mbr =要拆卸的文件。

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)),则可以使用简写forms:

 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所build议的那样 ,也是一个不错的select,但是objdump通常和操作系统一起提供,可以处理GNU binutils支持的所有体系结构(GCC支持的超集),它的输出通常可以as当然,ndisasm通常可以被喂入nasm )。

彼得·科尔德 ( Peter Cordes)认为“ Agner Fog的objconv非常好。 它将标签放在分支目标上,使得更容易找出代码的作用。 它可以反汇编成NASM,YASM,MASM或AT&T(GNU)语法。“

多媒体Mike已经发现了--adjust-vma ; ndisasm相当于-o选项。

为了反汇编sh4代码(我使用了Debian的一个二进制文件来testing),在GNU binutils中使用它(几乎所有的反汇编程序都被限制在一个平台上,比如x86, ndisasmobjconv ):

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

-m是机器, -EL表示Little Endian(对于sh4eb使用-EB来代替),这对于以任何一种字节顺序存在的体系结构都是相关的。

sudo dd if = / dev / sda bs = 512 count = 1 | ndisasm -b16 -o7c00h –