持っている起動可能なx86ディスクのMBR(最初の512バイト)を分解したいのですが。MBRを使用してファイルにコピーしました
dd if=/dev/my-device of=mbr bs=512 count=1
ファイルを逆アセンブルできるLinuxユーティリティの提案はありますmbr
か?
回答:
objdumpを使用できます。この記事によると、構文は次のとおりです。
objdump -D -b binary -mi386 -Maddr16,data16 mbr
--target
代わりに-b
。-D
「すべてのセクションのコンテンツを分解する」です。-b bfdname
または--target=bfdname
、指定されたオブジェクトコード形式(エルフではなく生のバイナリ)として強制的に読み取ります。-m machine
使用するアーキテクチャを指定します(このファイルには、arch infoのヘッダーはありません)。-M options
逆アセンブラのオプションです。addr16,data16
「デフォルトのアドレスサイズとオペランドサイズを指定する」に使用されます(ユニバーサルx86 disasmエンジンではコードをi8086として扱います)
GNUツールはobjdumpと呼ばれます。次に例を示します。
objdump -D -b binary -m i8086 <file>
-m i386
または-Mintel,x86-64
。i8086
は古いアーキテクチャであり、最新のコードに使用すると予期しない結果が生じる可能性があります。さらに、多くのマシンは64ビットであるため、最近ではx86-64
toを指定する-M
ことをお勧めします。を渡すintel
と-M
、構文がデフォルトのAT&TスタイルではなくIntelスタイルに変更されます。
ndisasm -b16 -o7c00h -a -s7c3eh mbr
説明 -ndisasmマンページから
-b
= 16、32、または64ビットモードを指定します。デフォルトは16ビットモードです。-o
=ファイルの想定ロードアドレスを指定します。このオプションを使用すると、ndisasmは左マージンの下にリストされているアドレスを取得し、PC相対ジャンプおよび呼び出しのターゲットアドレスを取得します。-a
=自動(またはインテリジェント)同期モードを有効にします。このモードでは、ndisasmは、相対ジャンプのターゲットアドレスを調べて、逆アセンブルを呼び出すことにより、同期を実行する場所を推測しようとします。-s
= ndisasmがアドレスの両側のバイトを含むマシン命令を出力しないように、手動で同期アドレスを指定します。したがって、そのアドレスで始まる命令は正しく逆アセンブルされます。mbr
=逆アセンブルするファイル。-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.
starblueとhlovdalはどちらも標準的な答えの一部を持っています。生の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ヘッダーにはすでにこの情報が含まれています。
ndisasm
jameslinで提案されているように、これも良い選択ですが、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
コード(とx86など、ほとんどすべての他の逆アセンブラは、1つのプラットフォームに限定されるGNUのbinutilsのでこれを使用して、(Iは、Debianからテスト1つのバイナリを使用)ndisasm
とobjconv
):
objdump -D -b binary -m sh -EL x
これ-m
はマシンであり、-EL
リトルエンディアン(代わりにsh4eb
使用-EB
)を意味します。これは、どちらかのエンディアンで存在するアーキテクチャに関連しています。
gcc -O3 -masm=intel -fverbose-asm -S -o- | less
、Cソースを微調整して適切なasmにコンパイルしようとしているためです。