もちろん公式はあります。
PE ローダーの動作を逆にするだけです。
- ファイル内で PE セクションが始まる場所を見つけます。
これらの数値は、ファイル オフセットと呼ばれます。
- ベース アドレスを基準にして、PE セクションをメモリにロードする必要がある場所を特定します。
これらのアドレスは RVA (相対仮想アドレス) と呼ばれます。
- 使用可能なベース アドレスを1つ選択し、RVA に追加します。
これらのアドレスは VA (仮想アドレス) と呼ばれ、ファイル オフセットの最終アドレスです。
以下の手順を理解するために、すべての PE セクションには特に次のプロパティがあることに注意してください。
- ファイル内でセクションが開始する開始ファイル オフセット。
- ファイル内の長さ。
- メモリ内でセクションをロードする開始メモリ アドレス (ベース アドレスを基準とする)
- 一度メモリにロードされた長さ (これはファイルの長さとは異なる場合があります)。
したがって、特定のメモリアドレス X に対して、次のことを行う必要があります。
- ベース アドレスを引きます。従来の Windows プログラムの場合、これは多くの場合 40 0000h です。
- これで RVA ができました。開始メモリ アドレスが RVA より下にあり、終了メモリ アドレスが2の後にある最初の PE セクションを見つけます。
- セクション開始メモリ アドレスを差し引くと、セクション オフセットが得られます。
- セクション開始ファイル オフセットを追加すると、ファイル オフセットが作成されます。
これを行うことができるPEEditor 1.7というツールがあります。
なんらかの理由で今は見つけるのが難しくなっていますが、インターネット上にはまだあるはずです。覚えておいてください:無料です。
Found PE editor:ここでは、パスワード tuts4you を使用して RAR アーカイブを解凍します。
(ウィンドウにドラッグするか、[参照] ボタンを使用して) ファイルを読み込み、FLC (File Location Calculator) をクリックします。新しいウィンドウで、アドレスを入力します。
1ほとんどの場合、これは実際には、ページングのおかげで、PE ヘッダーに設定されたベース アドレスが使用されることを意味します。
2メモリ開始アドレス+メモリ長-1として計算