我正在尝试了解可执行压缩程序生成的PE头文件。
我被告知Windows在这种情况下使用的所有头字段都是完整的。另一方面,所有其他包含来自PE头部视角的完整垃圾。我试图了解哪些是相关的。
假设我得到了IMAGE_DOS_HEADER
:
这是IMAGE_FILE_HEADER
:
当我在调试器上打开我的可执行文件时,它会立即停在此地址:
CPU Disasm
Address Hex dump Command Comments
0040005C 53 PUSH EBX
那么,调试器如何知道0x0040005C是开始调试所需的位置?计算这个“入口点”地址的公式是什么?
我想这里的主要问题是,哪些PE头文件与windows perspective loader相关,哪些将被这些类型的打包器用于其他目的?
答案 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