windows 加载程序使用了哪些 PE header 字段?

Which PE header fields are used by windows loader?

我正在尝试了解由可执行压缩器生成的 PE header 文件。

我被告知 Windows 在这种情况下使用的所有 header 字段都完好无损。另一方面,从 PE header 的角度来看,所有其他的都包含完整的垃圾。我正在尝试了解哪些是相关的。

假设我得到了这个 IMAGE_DOS_HEADER:

还有这个IMAGE_FILE_HEADER

当我在调试器上打开我的可执行文件时,它立即停在这个地址:

CPU Disasm
Address   Hex dump          Command                                  Comments
0040005C    53              PUSH EBX

那么,调试器如何知道 0x0040005C 是它需要开始调试的位置?计算此 "entry point" 地址的公式是什么?

我想这里的主要问题是,哪些 PE header 文件与 windows 透视加载器相关,哪些将被这些类型的打包程序用于其他目的?

来自 IMAGE_DOS_HEADER 仅使用 e_magic(用于检查)和 e_lfanew(偏移到 IMAGE_NT_HEADERSXX(32 或 64))。您需要查找 IMAGE_NT_HEADERS 个字段。入口点计算非常简单

PIMAGE_DOS_HEADER ImageBase;
if (ImageBase->e_magic == IMAGE_DOS_SIGNATURE)
{
    union {
        PVOID pv;
        PIMAGE_NT_HEADERS32 pinth32;
        PIMAGE_NT_HEADERS64 pinth64;

    };
    pv = RtlOffsetToPointer(ImageBase, ImageBase->e_lfanew);
    DWORD AddressOfEntryPoint = 0;
    switch (pinth32->OptionalHeader.Magic)
    {
    case IMAGE_NT_OPTIONAL_HDR32_MAGIC:
        AddressOfEntryPoint = pinth32->OptionalHeader.AddressOfEntryPoint;
        break;
    case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
        AddressOfEntryPoint = pinth64->OptionalHeader.AddressOfEntryPoint;
        break;
    }
    PVOID EntryPoint = AddressOfEntryPoint ? RtlOffsetToPointer(ImageBase, AddressOfEntryPoint) : 0;
}

所以看看 IMAGE_OPTIONAL_HEADER.AddressOfEntryPoint

When I open my executable on the debugger, it immediately stops at this address:

糟糕的调试器 :) 好的必须停止在 LdrInitializeThunk