98

所有している起動可能な x86 ディスクの MBR (最初の 512 バイト) を逆アセンブルしたいと考えています。を使用してMBRをファイルにコピーしました

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

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

4

6 に答える 6

115

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

objdump -D -b binary -mi386 -Maddr16,data16 mbr
于 2009-11-15T09:42:02.300 に答える
33

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

objdump -D -b binary -m i8086 <file>
于 2009-11-15T09:45:23.947 に答える
27

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

于 2009-11-15T09:42:11.767 に答える
23
ndisasm -b16 -o7c00h -a -s7c3eh mbr

説明-ndisasmのマンページから

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

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は、「<a href="http://agner.org/optimize/" rel="noreferrer">Agner Fog の objconv は非常に優れている」と提案しています。ブランチ ターゲットにラベルを付けて、コードが何をするかを簡単に把握できるようにします。NASM、YASM、MASM、または AT&T (GNU) 構文に分解できます。」</p>

マルチメディア マイクはすでに次のことを知っていました--adjust-vmandisasm同等のものは-oオプションです。

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

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

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

于 2015-12-22T20:44:04.853 に答える
9

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

sudo dd if=/dev/sda bs=512 count=1 | ndisasm -b16 -o7c00h -
于 2009-11-23T19:10:11.813 に答える