私が持っているブート可能なx86ディスクのMBR(最初の512バイト)を分解したいと思います。私はMBRをファイルにコピーしました
dd if=/dev/my-device of=mbr bs=512 count=1
ファイルmbr
を逆アセンブルできるLinuxユーティリティに関する提案はありますか?
Objdumpを使用できます。 この記事 によると、構文は次のとおりです。
objdump -D -b binary -mi386 -Maddr16,data16 mbr
GNUツールはobjdumpと呼ばれます。例えば:
objdump -D -b binary -m i8086 <file>
この目的でndisasm
が好きです。 NASMアセンブラが付属しています。これは無料でオープンソースであり、ほとんどのLinuxディストリビューションのパッケージリポジトリに含まれています。
ndisasm -b16 -o7c00h -a -s7c3eh mbr
説明-ndisasmマンページから
-b
= 16ビット、32ビット、または64ビットモードを指定します。デフォルトは16ビットモードです。-o
=ファイルの想定ロードアドレスを指定します。このオプションを使用すると、ndisasmはリストされているアドレスを左マージンに取得し、PC相対ジャンプとコールのターゲットアドレスを取得します。-a
=自動(またはインテリジェント)同期モードを有効にします。このモードでは、ndisasmは、相対的なジャンプのターゲットアドレスを調べ、逆アセンブルする呼び出しによって、同期を実行する場所を推測しようとします。-s
= ndisasmがアドレスの両側のバイトを含むマシン命令を出力しないように、手動で同期アドレスを指定します。したがって、そのアドレスで始まる命令は正しく逆アセンブルされます。mbr
=逆アセンブルするファイル。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
コードを逆アセンブルするには(テストにDebianの1つのバイナリを使用しました)、これをGNU binutilsとともに使用します(他のすべての逆アセンブラは、x86などの1つのプラットフォームndisasm
およびobjconv
を使用):
objdump -D -b binary -m sh -EL x
-m
はマシンであり、-EL
はリトルエンディアンを意味します(sh4eb
の代わりに-EB
を使用)。これはどちらのエンディアンにも存在するアーキテクチャに関連します。
このコマンドを試してください:
Sudo dd if=/dev/sda bs=512 count=1 | ndisasm -b16 -o7c00h -