如何反汇编原始x86代码?

时间:2009-11-15 09:36:14

标签: linux assembly x86 mbr

我想反汇编我拥有的可引导x86磁盘的MBR(前512字节)。我已使用

将MBR复制到文件中
dd if=/dev/my-device of=mbr bs=512 count=1

对可以反汇编文件mbr

的Linux实用程序的任何建议

6 个答案:

答案 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)

starbluehlovdal都有规范答案的一部分。如果你想反汇编原始的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标题已包含此信息。

jameslin建议

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 -