web-dev-qa-db-ja.com

生の16ビットx86マシンコードを逆アセンブルするにはどうすればよいですか?

私が持っているブート可能なx86ディスクのMBR(最初の512バイト)を分解したいと思います。私はMBRをファイルにコピーしました

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

ファイルmbrを逆アセンブルできるLinuxユーティリティに関する提案はありますか?

86
sigjuice

Objdumpを使用できます。 この記事 によると、構文は次のとおりです。

objdump -D -b binary -mi386 -Maddr16,data16 mbr
100
hlovdal

GNUツールはobjdumpと呼ばれます。例えば:

objdump -D -b binary -m i8086 <file>
26
starblue

この目的でndisasmが好きです。 NASMアセンブラが付属しています。これは無料でオープンソースであり、ほとんどのLinuxディストリビューションのパッケージリポジトリに含まれています。

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

説明-ndisasmマンページから

  • -b = 16ビット、32ビット、または64ビットモードを指定します。デフォルトは16ビットモードです。
  • -o =ファイルの想定ロードアドレスを指定します。このオプションを使用すると、ndisasmはリストされているアドレスを左マージンに取得し、PC相対ジャンプとコールのターゲットアドレスを取得します。
  • -a =自動(またはインテリジェント)同期モードを有効にします。このモードでは、ndisasmは、相対的なジャンプのターゲットアドレスを調べ、逆アセンブルする呼び出しによって、同期を実行する場所を推測しようとします。
  • -s = ndisasmがアドレスの両側のバイトを含むマシン命令を出力しないように、手動で同期アドレスを指定します。したがって、そのアドレスで始まる命令は正しく逆アセンブルされます。
  • mbr =逆アセンブルするファイル。
19
jameslin

starbluehlovdal の両方に正解の一部があります。生のi8086コードを逆アセンブルする場合、通常はAT&T構文ではなくIntel構文も必要になるため、次を使用します。

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ヘッダーにはすでにこの情報が含まれています。

ndisasmjameslin で示唆されているように、良い選択ですが、objdumpは通常OSに付属しており、GNU binutils(GCCでサポートされるもののスーパーセット)、およびその出力は通常GNU as(ndisasmの通常はnasmしかし、もちろん)。

Peter Cordes は、「 Agner Fogのobjconv は非常に素晴らしい」と示唆しています。ブランチターゲットにラベルを付けて、コードが何をするのかを簡単に把握できるようにします。 NASM、YASM、MASM、またはAT&T(GNU)構文に分解できます。」

マルチメディアマイク すでに--adjust-vmaについてわかっています;同等のndisasm-oオプションです。

たとえば、sh4コードを逆アセンブルするには(テストにDebianの1つのバイナリを使用しました)、これをGNU binutilsとともに使用します(他のすべての逆アセンブラは、x86などの1つのプラットフォームndisasmおよびobjconvを使用):

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

-mはマシンであり、-ELはリトルエンディアンを意味します(sh4ebの代わりに-EBを使用)。これはどちらのエンディアンにも存在するアーキテクチャに関連します。

12
mirabilos

このコマンドを試してください:

Sudo dd if=/dev/sda bs=512 count=1 | ndisasm -b16 -o7c00h -
7
Jason