1

PE 仕様から:

ロケーション0x3cで、スタブには PE 署名へのファイル オフセットがあります。この情報により、MS DOS スタブが含まれている場合でも、Windows はイメージ ファイルを適切に実行できます。このファイル オフセットは0x3c、リンク中に location に配置されます。

2.2. 署名 (イメージのみ)
MS DOS スタブの後、offset で指定されたファイル オフセットに0x3c、ファイルを PE 形式のイメージ ファイルとして識別する 4 バイトの署名があります。この署名は「PE\0\0」です (文字「P」と「E」の後に 2 つのヌル バイトが続きます)。

私はこれらのバイトを読んでみます:

using System;
using System.IO;

class Program {
  const String fileName = @".\some_application.exe";
  const Int64 peMarkerPosition = 0x3c;

  static void Main(string[] args) {
    using (FileStream fs = new FileStream(fileName, FileMode.Open,
      FileAccess.Read)) {
      Byte[] marker = new Byte[4];
      fs.Position = peMarkerPosition;
      fs.Read(marker, 0, marker.Length);
      // Now I expect 'marker'has such bytes: "PE\0\0".
      fs.Close();

      foreach (Byte b in marker) {
        Console.Write(Convert.ToChar(b)); // But I see other values...
      }

      Console.WriteLine("\nPress any key for exit...");
      Console.ReadKey();
    }
  }
}

しかし、marker変数には0x080x010x00およびx0x00バイト (最初と 2 番目は文字ではありませんP)がありEます...なぜこのような結果が得られるのでしょうか?

4

1 に答える 1

4

PE ヘッダー自体はオフセット 0x3C から開始しません。むしろ、そこに PE ヘッダーの開始位置へのポインター (ファイルの先頭からの 32 ビット ファイル オフセット) があります。

于 2015-07-30T15:36:28.343 に答える