sig*_*ice 87 linux x86 assembly mbr x86-16
我想拆解我的可启动x86磁盘的MBR(前512字节).我已经将MBR复制到了一个文件中
dd if=/dev/my-device of=mbr bs=512 count=1
Run Code Online (Sandbox Code Playgroud)
对可以反汇编文件的Linux实用程序的任何建议mbr?
hlo*_*dal 100
你可以使用objdump.根据这篇文章,语法是:
objdump -D -b binary -mi386 -Maddr16,data16 mbr
Run Code Online (Sandbox Code Playgroud)
sta*_*lue 27
GNU工具称为objdump,例如:
objdump -D -b binary -m i8086 <file>
Run Code Online (Sandbox Code Playgroud)
小智 20
ndisasm -b16 -o7c00h -a -s7c3eh mbr
Run Code Online (Sandbox Code Playgroud)
解释 - 来自ndisasm联机帮助页
-b=指定16位,32位或64位模式.默认值为16位模式.-o=指定文件的名义加载地址.此选项会导致ndisasm获取其左下边距列出的地址,以及PC相对跳转和调用的目标地址.-a =启用自动(或智能)同步模式,其中ndisasm将尝试通过检查相对跳转的目标地址并将其调用为反汇编来猜测应执行同步的位置.-s=手动指定同步地址,以便ndisasm不会输出任何包含地址两侧字节的机器指令.因此,从该地址开始的指令将被正确地分解.mbr =要反汇编的文件.mir*_*los 13
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
Run Code Online (Sandbox Code Playgroud)
如果您的代码是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
Run Code Online (Sandbox Code Playgroud)
对于32位或64位代码,省略,8086; ELF标头已包含此信息.
ndisasm,正如jameslin所建议的,也是一个不错的选择,但objdump通常附带操作系统,可以处理GNU binutils支持的所有架构(GCC支持的超集),其输出通常可以输入GNU as(ndisasm通常可以nasm但是当然要被喂入.
彼得·科德斯暗示" Agner Fog的objconv非常好.它将标签放在分支目标上,使得更容易弄清楚代码的作用.它可以反汇编成NASM,YASM,MASM或AT&T(GNU)语法."
多媒体迈克已经发现了--adjust-vma; 在ndisasm相当于是-o选项.
要反汇编sh4代码(我使用Debian中的一个二进制文件进行测试),请将其与GNU binutils一起使用(几乎所有其他反汇编程序仅限于一个平台,例如带有ndisasm和的x86 objconv):
objdump -D -b binary -m sh -EL x
Run Code Online (Sandbox Code Playgroud)
它-m是机器,-EL意味着Little Endian(代替sh4eb使用-EB),它与任何字节序中存在的体系结构相关.