代码之家  ›  专栏  ›  技术社区  ›  sigjuice

如何反汇编原始x86代码?

  •  83
  • sigjuice  · 技术社区  · 15 年前

    我想分解我拥有的可引导x86磁盘的MBR(前512字节)。我已将MBR复制到一个文件,使用

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

    对Linux实用程序的任何建议都可以反汇编该文件 mbr ?

    6 回复  |  直到 9 年前
        1
  •  97
  •   hlovdal    15 年前

    你可以用objdump。根据 this article 语法是:

    objdump -D -b binary -mi386 -Maddr16,data16 mbr
    
        2
  •  26
  •   starblue    15 年前

    GNU工具被称为 反汇编 例如:

    objdump -D -b binary -m i8086 <file>
    
        3
  •  20
  •   asveikau    15 年前

    我喜欢 ndisasm 为此目的。它附带了NASM汇编程序,它是免费的、开源的,并且包含在大多数Linux发行版的包存储库中。

        4
  •  17
  •   Drew Chapin    11 年前
    ndisasm -b16 -o7c00h -a -s7c3eh mbr
    

    解释 -来自Ndisasm手册页

    • -b =指定16位、32位或64位模式。默认为16位模式。
    • -o =指定文件的名义加载地址。此选项使ndism从左侧空白处获取其列出的地址,并从右侧获取PC相对跳转和调用的目标地址。
    • -a =启用自动(或智能)同步模式,在这种模式下,ndism将通过检查相对跳转的目标地址并调用它来猜测应在何处执行同步。
    • -s =手动指定同步地址,这样ndism将不会输出包含地址两侧字节的任何机器指令。因此,从该地址开始的指令将被正确地反汇编。
    • mbr =要反汇编的文件。
        5
  •  11
  •   Community CDub    7 年前

    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_s通常可以输入 nasm 当然了)。

    Peter Cordes 表明__ Agner Fog's objconv 非常好。它将标签放在分支目标上,这样就可以更容易地了解代码的作用。它可以分解成NASM、YASM、MASM或AT&T(GNU)语法。

    Multimedia Mike 已经知道关于 --adjust-vma ; NDIASM 等价物是 -o 选择权。

    拆卸,比如, sh4 代码(我使用了一个从Debian到Test的二进制代码),将其与gnu binutils一起使用(几乎所有其他反汇编程序都局限于一个平台,如x86和 不一致 objconv ):

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

    这个 -m 是机器,和 -EL 意思是小尾数 sh4eb 使用 -EB 相反,它与存在于任意一个endianness中的体系结构相关。

        6
  •  7
  •   Jason    15 年前

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