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


91

持っている起動可能なx86ディスクのMBR(最初の512バイト)を分解したいのですが。MBRを使用してファイルにコピーしました

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

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

回答:


109

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

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

指定したオプションの機能を説明できますか?
ホーケン、

11
またはの--target代わりに-b-D「すべてのセクションのコンテンツを分解する」です。-b bfdnameまたは--target=bfdname、指定されたオブジェクトコード形式(エルフではなく生のバイナリ)として強制的に読み取ります。-m machine使用するアーキテクチャを指定します(このファイルには、arch infoのヘッダーはありません)。-M options逆アセンブラのオプションです。addr16,data16「デフォルトのアドレスサイズとオペランドサイズを指定する」に使用されます(ユニバーサルx86 disasmエンジンではコードをi8086として扱います)
osgx

29

GNUツールはobjdumpと呼ばれます。次に例を示します。

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

アーキテクチャと構文にさまざまなオプションを設定することもできます。たとえば、-m i386または-Mintel,x86-64i8086は古いアーキテクチャであり、最新のコードに使用すると予期しない結果が生じる可能性があります。さらに、多くのマシンは64ビットであるため、最近ではx86-64toを指定する-Mことをお勧めします。を渡すintel-M、構文がデフォルトのAT&TスタイルではなくIntelスタイルに変更されます。
GDP2 2018年

24

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


私はこの答えが好きです。使いやすく、OS Xにnasmをインストールできます。objdumpがなく、ソースからビルドしたくありません。

22
ndisasm -b16 -o7c00h -a -s7c3eh mbr

説明 -ndisasmマンページから

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

単純なndisasmとは対照的にこれは何をしますか?あなたはオプションを説明することができます
ホーケン

4
これらのオプションの意味と説明を教えてください。回答を理解することは、回答を取得することよりも優れています。
そり

-b specifies 16-, 32- or 64-bit mode. The default is 16-bit mode. -o is the notional load address for the file. This option causes ndisasm to get the addresses it lists down the left hand margin, and the target addresses of PC-relative jumps and calls, right. -s specifies a synchronisation address, such that ndisasm will not output any machine instruction which encompasses bytes on both sides of the address. Hence the instruction which starts at that address will be correctly disassembled.
Janus Troelsen 2013年

15

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-vmandisasm同等である-oオプション。

分解し、たとえば、sh4コード(とx86など、ほとんどすべての他の逆アセンブラは、1つのプラットフォームに限定されるGNUのbinutilsのでこれを使用して、(Iは、Debianからテスト1つのバイナリを使用)ndisasmobjconv):

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

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


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

私にとっては、GNU / Linuxでそのまますぐに構築できました。しかし、はい、それはGNU binutilsとは異なり、x86 / x86-64のみです。ただし、オペランドサイズプレフィックスがIntel CPUのデコーダーでLCPストールを引き起こす可能性がある場合など、コメントとして追加する多くのx86固有のヒントがあります。必ず、回答の中でそれを述べてください。コメントの主な目的の1つは、投稿者が回答を改善できるようにすることです。これは、後の視聴者も読む必要があるものだけではありません。
Peter Cordes

1
@PeterCordesはい、私はMirBSDをメインOSとして持っています;)
mirabilos

@PeterCordesですが、生のバイナリを分解できないようです。一連の命令をフィードするために最小限のELFファイルを作成する必要がありましたが、いくつかのオプションを逃しただけですか?
ルスラン

1
@Ruslan:IDK、興味深い質問。私は通常objdumpを使用するか、ブランチラベルが必要な場合はgcc -O3 -masm=intel -fverbose-asm -S -o- | less、Cソースを微調整して適切なasmにコンパイルしようとしているためです。
Peter Cordes 2017

9

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

sudo dd if=/dev/sda bs=512 count=1 | ndisasm -b16 -o7c00h -
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.