我想反汇编我拥有的可引导 x86 磁盘的 MBR(前 512 个字节)。我已使用将 MBR 复制到文件中
dd if=/dev/my-device of=mbr bs=512 count=1
对可以反汇编文件的 Linux 实用程序有什么建议mbr
吗?
您可以使用 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 手册页
-b
= 指定 16、32 或 64 位模式。默认为 16 位模式。-o
= 指定文件的名义加载地址。此选项使 ndisasm 获取它在左边距下列出的地址,以及与 PC 相关的跳转和调用的目标地址,右边。-a
= 启用自动(或智能)同步模式,其中 ndisasm 将通过检查相对跳转的目标地址来尝试猜测应该在哪里执行同步,并将其称为反汇编。-s
= 手动指定一个同步地址,这样 ndisasm 就不会输出任何包含地址两边字节的机器指令。因此,从该地址开始的指令将被正确反汇编。mbr
= 要反汇编的文件。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建议“<a href="http://agner.org/optimize/" rel="noreferrer">Agner Fog 的 objconv 非常好。它将标签放在分支目标上,从而更容易弄清楚代码的作用。它可以反汇编成 NASM、YASM、MASM 或 AT&T (GNU) 语法。”</p>
多媒体 Mike已经知道了--adjust-vma
;ndisasm
等效是选项-o
。
例如,要反汇编sh4
代码(我使用 Debian 中的一个二进制文件进行测试),请将其与 GNU binutils 一起使用(几乎所有其他反汇编程序都仅限于一个平台,例如带有ndisasm
and的 x86 objconv
):
objdump -D -b binary -m sh -EL x
The-m
是机器,-EL
意思是 Little Endian(代替sh4eb
使用-EB
),这与存在于任一字节序中的架构相关。
试试这个命令:
sudo dd if=/dev/sda bs=512 count=1 | ndisasm -b16 -o7c00h -