我怎么拆卸原16位x86机代码吗?
题
我想拆卸的MBR(第512字节),可启动x86盘,我有。我复制的MBR到一个文件使用
dd if=/dev/my-device of=mbr bs=512 count=1
任何建议为Linux工具,可以拆卸的文件 mbr
?
解决方案
可以使用objdump的。根据语法rel="noreferrer">是:
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代码,则通常要英特尔语法,不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
如果你的代码是小精灵(或.出(或(E)。)),可以用简短形式:
objdump -D -Mintel,i8086 a.out # disassembles the entire file
objdump -d -Mintel,i8086 a.out # disassembles only code sections
32或64位代码、省略 ,8086
;小精灵的头已经包括了这一信息。
ndisasm
, 建议的那样, jameslin, 也是不错的选择,但是 objdump
通常带有操作系统和可以处理所有的体系结构支持的GNU binutils(超集那些支持海湾合作委员会),其输出能通常被送入GNU as
(ndisasm的通常可以被送入 nasm
虽然,当然)。
彼得*科德斯 表明,"昂纳雾的objconv 是非常好的。它把标签上,分支的目标,使得更容易找出什么代码。它可以拆卸成NASM,YASM,MASM,或AT&T(GNU)语法"。
多媒体迈克 已经发现了 --adjust-vma
;的 ndisasm
相当的 -o
选项。
拆解,比如说, sh4
代码(I使用的二进制的一个从Debian测试),使用这与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 -