所有している起動可能な 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
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 ヘッダーには、この情報が既に含まれています。
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-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 -