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
変数には0x08
、0x01
、0x00
およびx0x00
バイト (最初と 2 番目は文字ではありませんP
)がありE
ます...なぜこのような結果が得られるのでしょうか?