98

我想反汇编我拥有的可引导 x86 磁盘的 MBR(前 512 个字节)。我已使用将 MBR 复制到文件中

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

对可以反汇编文件的 Linux 实用程序有什么建议mbr吗?

4

6 回答 6

115

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

objdump -D -b binary -mi386 -Maddr16,data16 mbr
于 2009-11-15T09:42:02.300 回答
33

GNU 工具称为objdump,例如:

objdump -D -b binary -m i8086 <file>
于 2009-11-15T09:45:23.947 回答
27

我喜欢ndisasm这个目的。它带有 NASM 汇编器,它是免费和开源的,并包含在大多数 linux 发行版的软件包存储库中。

于 2009-11-15T09:42:11.767 回答
23
ndisasm -b16 -o7c00h -a -s7c3eh mbr

说明- 来自 ndisasm 手册页

  • -b= 指定 16、32 或 64 位模式。默认为 16 位模式。
  • -o= 指定文件的名义加载地址。此选项使 ndisasm 获取它在左边距下列出的地址,以及与 PC 相关的跳转和调用的目标地址,右边。
  • -a= 启用自动(或智能)同步模式,其中 ndisasm 将通过检查相对跳转的目标地址来尝试猜测应该在哪里执行同步,并将其称为反汇编。
  • -s= 手动指定一个同步地址,这样 ndisasm 就不会输出任何包含地址两边字节的机器指令。因此,从该地址开始的指令将被正确反汇编。
  • mbr= 要反汇编的文件。
于 2011-07-08T06:44:33.367 回答
17

starbluehlovdal都有部分规范答案。如果你想反汇编原始 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建议“<a href="http://agner.org/optimize/" rel="noreferrer">Agner Fog 的 objconv 非常好。它将标签放在分支目标上,从而更容易弄清楚代码的作用。它可以反汇编成 NASM、YASM、MASM 或 AT&T (GNU) 语法。”</p>

多媒体 Mike已经知道了--adjust-vmandisasm等效是选项-o

例如,要反汇编sh4代码(我使用 Debian 中的一个二进制文件进行测试),请将其与 GNU binutils 一起使用(几乎所有其他反汇编程序都仅限于一个平台,例如带有ndisasmand的 x86 objconv):

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

The-m是机器,-EL意思是 Little Endian(代替sh4eb使用-EB),这与存在于任一字节序中的架构相关。

于 2015-12-22T20:44:04.853 回答
9

试试这个命令:

sudo dd if=/dev/sda bs=512 count=1 | ndisasm -b16 -o7c00h -
于 2009-11-23T19:10:11.813 回答