首页 文章

如何反汇编原始x86代码?

提问于
浏览
84

我想拆解我的可启动x86磁盘的MBR(前512字节) . 我已经将MBR复制到了一个文件中

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

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

6 回答

  • 12

    你可以使用objdump . 根据this article,语法是:

    objdump -D -b binary -mi386 -Maddr16,data16 mbr
    
  • 17

    GNU工具名为 objdump ,例如:

    objdump -D -b binary -m i8086 <file>
    
  • 7

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

  • 20
    ndisasm -b16 -o7c00h -a -s7c3eh mbr
    

    Explanation - 来自ndisasm联机帮助页

    • -b =指定16位,32位或64位模式 . 默认值为16位模式 .

    • -o =指定文件的名义加载地址 . 此选项会导致ndisasm获取其左下边距列出的地址,以及PC相对跳转和调用的目标地址 .

    • -a =启用自动(或智能)同步模式,其中ndisasm将尝试通过检查相对跳转的目标地址并将其调用为反汇编来猜测应执行同步的位置 .

    • -s =手动指定同步地址,以便ndisasm不会输出任何包含地址两侧字节的机器指令 . 因此,从该地址开始的指令将被正确地分解 .

    • mbr =要反汇编的文件 .

  • 98

    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
    

    如果您的代码是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表示“Agner Fog's objconv非常好 . 它将标签放在分支目标上,使得更容易弄清楚代码的作用 . 它可以反汇编成NASM,YASM,MASM或AT&T(GNU)语法 . “

    Multimedia Mike已经发现 --adjust-vma ; ndisasm 等效于 -o 选项 .

    要反汇编代码(我使用Debian中的一个二进制文件来测试),请将它与GNU binutils一起使用(几乎所有其他反汇编程序仅限于一个平台,例如带有 ndisasmobjconv 的x86):

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

    -m 是机器, -EL 表示Little Endian(代之为 sh4eb 使用 -EB ),这与以任一字节序存在的体系结构相关 .

  • 26

    试试这个命令:

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

相关问题