Windows加载程序使用哪些PE头字段?

时间:2016-11-12 22:56:58

标签: windows portable-executable

我正在尝试了解可执行压缩程序生成的PE头文件。

我被告知Windows在这种情况下使用的所有头字段都是完整的。另一方面,所有其他包含来自PE头部视角的完整垃圾。我试图了解哪些是相关的。

假设我得到了IMAGE_DOS_HEADER

enter image description here

这是IMAGE_FILE_HEADER

enter image description here

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

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

那么,调试器如何知道0x0040005C是开始调试所需的位置?计算这个“入口点”地址的公式是什么?

我想这里的主要问题是,哪些PE头文件与windows perspective loader相关,哪些将被这些类型的打包器用于其他目的?

1 个答案:

答案 0 :(得分:0)

仅使用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

  

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

错误的调试器:)好的必须停在LdrInitializeThunk