如何反汇编原始x86代码?

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)

  • 或者`--target`而不是`-b`.`-D`是"反汇编所有部分的内容"; `-b bfdname`或`--target = bfdname`将强制读取指定的对象代码格式(在我们的例子中不是elf,而是原始二进制); `-m machine`将指定要使用的体系结构(在我们的文件中没有带有arch信息的头文件).`-M options`是反汇编程序的选项; `addr16,data16`用于"指定默认地址大小和操作数大小"(在通用x86 disasm引擎中将代码视为i8086) (10认同)

sta*_*lue 27

GNU工具称为objdump,例如:

objdump -D -b binary -m i8086 <file>
Run Code Online (Sandbox Code Playgroud)


asv*_*kau 22

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


小智 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 =要反汇编的文件.

  • 你能解释一下这些选择意味着什么吗?理解答案比获得答案更好. (4认同)

mir*_*los 13

starbluehlovdal都具有典型的答案的一部分.如果你想反汇编原始的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),它与任何字节序中存在的体系结构相关.

  • [Agner Fog的objconv](http://agner.org/optimize/)非常好.它将标签放在branch*targets*上,使得更容易弄清楚代码的作用.它可以反汇编为NASM,YASM,MASM或AT&T(GNU)语法. (2认同)

Jas*_*son 8

sudo dd if =/dev/sda bs = 512 count = 1 | ndisasm -b16 -o7c00h -