5

私は小さなPEリーダーを書いているので、テストアプリケーションと一緒にdumpbinを実行して、値が正しく読み取られていることを確認します。エクスポートテーブルを除いて、これまでに機能していたすべてのもの。

私がテストしているファイルはDLLです。私のアプリケーションはファイルをバイト配列として読み込み、それが私のPEリーダークラスに渡されます。値は、RVAやエクスポートデータディレクトリのサイズなど、dumpbinによって出力された値と一致します。

        E000 [     362] RVA [size] of Export Directory

問題は、バイト配列のサイズがわずか42,496であるということです。ご想像のとおり、私のPEリーダーがE000(57,344)で読み込もうとすると、が表示されますIndexOutOfRangeException。ただし、dumpbinにはそのような問題はなく、エクスポートディレクトリを正常に読み取ります。そして、はい、ファイル全体が実際にバイト配列に読み込まれています。

これはどのように可能ですか?

4

1 に答える 1

6

PEファイルには「セクション」が含まれており、セクションには独立したベースアドレスがあります。PEは連続したメモリイメージではありません。各セクションは、連続したメモリイメージです。

まず、セクション情報を読み、それらのレイアウトのメモリマップを作成する必要があります。次に、セクションオフセットをファイルベースのオフセットに揃えることができます。

余談ですが、Windows用のフリーウェアでオープンソースのデバッガーおよび逆アセンブラーであるOllyDbgを検討してください。それはおそらくあなたがあなた自身のソフトウェアをテストするのを助けるでしょう、そしてあなたが「あなた自身を転がす」ことによってあなたが満たそうとしているまさにその目的を果たすかもしれません。

出力からの例dumpbin /all

セクションヘッダー#1
   .text名
    BC14仮想サイズ
    1000仮想アドレス(00401000〜0040CC13)
    生データのBE00サイズ
     生データへの400ファイルポインタ(00000400〜0000C1FF)
       0再配置テーブルへのファイルポインタ
       0行番号へのファイルポインタ
       0移転数
       0行番号
60000020フラグ
         コード
         読み取りを実行する

この場合、私の.textセクションはRVA 1000で始まり、RVACE00まで続きます。このセクションへのファイルポインターは400です。600を引く作業により、1000-CDFFの範囲の任意のRVAをファイルポインターに変換できます。(すべての数値は16進数です。)

「RVA」(相対仮想アドレス)に遭遇した場合は常に、次の方法を使用して、ファイルオフセット(またはバイト配列へのインデックス)に解決します。

  1. RVAが属するセクションを決定します。各セクションには、仮想アドレスからサイズまでのRVAが含まれています。セクションは重複しません。
  2. RVAからセクション仮想アドレスを減算します。これにより、セクションに対するオフセットが得られます。
  3. セクションのPointerToRawDataを、手順(2)で取得したオフセットに追加します。これは、RVAに対応するファイルオフセットです。

使用する可能性のある別のアプローチは、 dwDesiredAccess引数に設定されMapViewOfFileEx()たフラグを使用して呼び出すことです。このAPIは、PEファイルからセクションヘッダーを解析し、セクションの内容を「モジュールベース」に相対的な位置に読み取ります。FILE_MAP_EXECUTE

モジュールベースは、PEヘッダーがロードされるベースアドレスです。関数を使用してDLLをロードする場合、これは関数のメンバーlpBaseOfDllLoadLibrary()を介して取得できます。 GetModuleInformation()MODULEINFO

を使用する場合MapViewOfFileEx()、モジュールベースは単に。からの戻り値ですMapViewOfFileEx()

これらの方法でモジュールをロードする設定では、RVAを通常のポインター値に解決することは次の問題です。

  1. モジュールのベースアドレスをchar *
  2. RVAをに追加しますchar *
  3. char *を実際のデータ型にキャストし、それを逆参照します。

これらのアプローチのようにOSにファイルをマッピングさせることの欠点は、このツールを使用して疑わしいファイルを調査し、開発者がセクションヘッダーで奇妙な自由を取ったかどうかわからない場合、いくつかの貴重な情報を見逃す可能性があることです。解析のこの部分をOSに処理させることによって。

于 2009-10-15T01:54:19.313 に答える