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
我正在尝试了解由可执行压缩器生成的 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