0

私はこれを約2日間試みましたが、成功しませんでした。多くの PE ファイル形式のチュートリアルを読みましたが、役に立ちませんでした。

完全に機能するCreateFileMappingを介して、32ビットの実行可能ファイルをメモリにマップします。次に、プログラムはセクション ヘッダーをループ処理し、デフォルトの特性に対して特性をチェックします (セクションが実行可能でコードであることを確認するため)。true の場合、プログラムはそのセクション ヘッダーへの (PIMAGE_SECTION_HEADER) ポインターを返します (プログラムはこれまでのところ完全に動作しています)。

ポインターを取得したので、構造体には 2 つの特定のエントリがあり、私を困惑させました。エントリを数えると、それは PointerToRawData と VirtualAddress です。VirtualSize = 4096、PointerToRawData = 1536。

PE ドキュメントで読んだことから、PointerToRawData は、ディスク上のセクションのデータの最初のバイトへの想定オフセット (RVA???) であり (正しいですか?)、アライメント値 (512 )。問題は、セクションのデータにアクセスするために使用できるポインターを取得するために、この値を何に設定するかです。メモリ マップト ファイルでは、セクションの最初のバイトを見つけるために (VirtualAddress 値 + imagebase 値) を使用する方がよいでしょうか?

もう 1 つの混乱点は、VirtualSize と SizeOfRawData です。この記事 - http://msdn.microsoft.com/en-us/library/ms809762.aspxでは、「構造内の SizeOfRawData フィールド (少し誤称のようです) が後で切り上げられた値」ですが、VirtualSize が SizeOfRawData の値よりも大きいため、どちらを使用すべきかについて混乱が生じています。

このプログラムの目的は、実行可能セクション (.text セクション) を見つけて、セクション内のすべてのビットに対してビット演算を実行し、次のセクションの前に演算を終了することです。

スプーンフィードを期待しているように思われたくないので、明確にしたいだけです.

お時間を割いていただき、ありがとうございます。

4

1 に答える 1

5

私はたまたま手元にある仕様や参照用の PE コードを持っていません (ソファから iPad でこれを書いています ;) が、理解すべき重要なポイントは、考慮すべき2 つのモードがあるということです。 RVA の数は、PE がメモリにマップされ、その位置合わせがページ位置合わせである場合にのみ関連します。ディスクからファイルを読み取る場合、オフセットはファイル オフセットであり、各セクションはファイル アライメントを使用します。

これが役立つことを願っています。

于 2012-12-26T05:19:51.393 に答える