PE文件头解析大全

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PE可选头部

PE可执行文件中接下来的224个字节组成了PE可选头部。虽然它的名字是“可选头部”,但是请确信:这个头部并非“可选”,而是“必需”的。OPTHDROFFSET宏可以获得指向可选头部的指针:

PEFILE.H

#define OPTHDROFFSET(a) ((LPVOID)((BYTE *)a + \

((PIMAGE_DOS_HEADER)a)->e_lfanew + \

SIZE_OF_NT_SIGNATURE + \

sizeof(IMAGE_FILE_HEADER)))

可选头部包含了很多关于可执行映像的重要信息,例如初始的堆栈大小、程序入口点的位置、首选基地址、操作系统版本、段对齐的信息等等。IMAGE_OPTIONAL_HEADER结构如下:

WINNT.H

typedef struct _IMAGE_OPTIONAL_HEADER {

//

// 标准域

//

USHORT Magic;

UCHAR MajorLinkerVersion;

UCHAR MinorLinkerVersion;

ULONG SizeOfCode;

ULONG SizeOfInitializedData;

ULONG SizeOfUninitializedData;

ULONG AddressOfEntryPoint;

ULONG BaseOfCode;

ULONG BaseOfData;

//

// NT附加域

//

ULONG ImageBase;

ULONG SectionAlignment;

ULONG FileAlignment;

USHORT MajorOperatingSystemVersion;

USHORT MinorOperatingSystemVersion;

USHORT MajorImageVersion;

USHORT MinorImageVersion;

USHORT MajorSubsystemVersion;

USHORT MinorSubsystemVersion;

ULONG Reserved1;

ULONG SizeOfImage;

ULONG SizeOfHeaders;

ULONG CheckSum;

USHORT Subsystem;

USHORT DllCharacteristics;

ULONG SizeOfStackReserve;

ULONG SizeOfStackCommit;

ULONG SizeOfHeapReserve;

ULONG SizeOfHeapCommit;

ULONG LoaderFlags;

ULONG NumberOfRvaAndSizes;

IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];

} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;

如你所见,这个结构中所列出的域实在是冗长得过分。为了不让你对所有这些域感到厌烦,我会仅仅讨论有用的——就是说,对于探究PE文件格式而言有用的。

标准域

首先,请注意这个结构被划分为“标准域”和“NT附加域”。所谓标准域,就是和UNIX可执行文件的COFF 格式所公共的部分。虽然标准域保留了COFF中定义的名字,但是Windows NT仍然将它们用作了不同的目的——尽管换个名字更好一些。

·Magic。我不知道这个域是干什么的,对于示例程序EXEVIEW.EXE示例程序而言,这个值是0x010B

或267(译注:0x010B为.EXE,0x0107为ROM映像,这个信息我是从eXeScope上得来的)。

·MajorLinkerVersion、MinorLinkerVersion。表示链接此映像的链接器版本。随Window NT build 438配套的Windows NT SDK包含的链接器版本是2.39(十六进制为2.27)。

·SizeOfCode。可执行代码尺寸。

·SizeOfInitializedData。已初始化的数据尺寸。

·SizeOfUninitializedData。未初始化的数据尺寸。

·AddressOfEntryPoint。在标准域中,AddressOfEntryPoint域是对PE文件格式来说最为有趣的了。这个域表示应用程序入口点的位置。并且,对于系统黑客来说,这个位置就是导入地址表(IAT)的末尾。以下的函数示范了如何从可选头部获得Windows NT可执行映像的入口点。

PEFILE.C

LPVOID WINAPI GetModuleEntryPoint(LPVOID lpFile)

{

PIMAGE_OPTIONAL_HEADER poh;

poh = (PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET(lpFile);

if (poh != NULL)

return (LPVOID)poh->AddressOfEntryPoint;

else

return NULL;

}

·BaseOfCode。已载入映像的代码(“.text”段)的相对偏移量。

·BaseOfData。已载入映像的未初始化数据(“.bss”段)的相对偏移量。

Windows NT附加域

添加到Windows NT PE文件格式中的附加域为Windows NT特定的进程行为提供了装载器的支持,以下为这些域的概述。

·ImageBase。进程映像地址空间中的首选基地址。Windows NT的Microsoft Win32 SDK链接器将这个值默认设为0x00400000,但是你可以使用-BASE:linker开关改变这个值。

·SectionAlignment。从ImageBase开始,每个段都被相继的装入进程的地址空间中。SectionAlignment 则规定了装载时段能够占据的最小空间数量——就是说,段是关于SectionAlignment对齐的。

相关文档
最新文档