私はPEファイルパーサーを作成しているところですが、PEファイル内の実際のコードを解析して解釈したいところに到達しました。これはx86オペコードとして保存されていると想定しています。
例として、DLL内の各エクスポートは、関数がメモリ内に格納されるRVA(相対仮想オフセット)を指し、これらのRVAを物理ファイルオフセットに変換する関数を作成しました。
問題は、これらは本当にオペコードなのか、それとも他の何かなのかということです。
関数がファイル内にどのように格納されるかはコンパイラ/リンカに依存しますか、それとも1バイトまたは2バイトのX86オペコードですか。
例として、Windows 7 DLL'BWContextHandler.dll'には、メモリにロードされ、システム内で使用できるようにする4つの関数が含まれています。最初にエクスポートされる関数は「DllCanUnloadNow」で、ファイル内のオフセット0x245Dにあります。このデータの最初の4バイトは次のとおりです。0xA10x5C0xF10xF2
それで、これらの1バイトまたは2バイトのオペコードですか、それともまったく別のものですか?
誰かがこれらを調べる方法についての情報を提供することができれば、それはありがたいです。
ありがとう!
さらに少し読んで、IDAのデモバージョンでファイルを実行した後、最初のバイト0xA1は1バイトのオペコード(mov eaxを意味する)であると言ったのは正しいと思います。私はここからそれを得ました:http://ref.x86asm.net/geek32.html#xA1そして私はそれが当分の間正しいと思います。
ただし、後続のバイトが残りの命令をどのように構成するかについては、少し混乱しています。私が知っているx86アセンブラーから、移動命令には宛先とソースの2つのパラメーターが必要なので、命令は(何かを)eaxレジスターに移動することであり、何かが次のバイトにあると想定しています。しかし、私はまだその情報を読む方法を知りません:)