为什么我没有得到“PE\0\0”?

And*_*man 1 .net c# coff portable-executable

从PE规格来看:

\n\n
\n

在位置0x3c,存根具有 PE​​ 签名的文件偏移量。\n 此信息使 Windows 能够正确执行映像文件,\n 即使它具有 MS DOS 存根。该文件偏移量在链接期间被放置在\n位置0x3c

\n\n

2.2. 签名(仅图像)
在 MS DOS 存根之后,在 offset 处指定的文件偏移处0x3c,是一个 4 字节签名,该签名将文件标识为 PE 格式图像文件。此签名为 \xe2\x80\x9cPE\\0\\0\xe2\x80\x9d (\n 字母 \xe2\x80\x9cP\xe2\x80\x9d 和 \xe2\x80\x9cE\xe2\x80\ x9d 后跟两个空字节)。

\n
\n\n

我尝试读取这些字节:

\n\n
using System;\nusing System.IO;\n\nclass Program {\n  const String fileName = @".\\some_application.exe";\n  const Int64 peMarkerPosition = 0x3c;\n\n  static void Main(string[] args) {\n    using (FileStream fs = new FileStream(fileName, FileMode.Open,\n      FileAccess.Read)) {\n      Byte[] marker = new Byte[4];\n      fs.Position = peMarkerPosition;\n      fs.Read(marker, 0, marker.Length);\n      // Now I expect \'marker\'has such bytes: "PE\\0\\0".\n      fs.Close();\n\n      foreach (Byte b in marker) {\n        Console.Write(Convert.ToChar(b)); // But I see other values...\n      }\n\n      Console.WriteLine("\\nPress any key for exit...");\n      Console.ReadKey();\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

marker变量有0x080x01和bytes (第一个和第二个不是和chars)...为什么我得到这样的结果0x00x0x00PE

\n

500*_*ror 5

PE 标头本身并不从偏移量 0x3C 开始 - 相反,那里有一个指向 PE 标头开始位置的指针(距文件开头的 32 位文件偏移量)。