如何反汇编原始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, ndisasm
和objconv
):
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 –