PE文件解析-PE头解析-2-可选PE头

 

 

其中的空白是为了对齐时的填充值。默认硬盘的对齐是200H,在内存中的默认对齐是1000H

可选PE头

typedef struct _IMAGE_OPTIONAL_HEADER {
  //
  // Standard fields.
  //

  WORD   Magic;
  BYTE   MajorLinkerVersion;
  BYTE   MinorLinkerVersion;
  DWORD   SizeOfCode;
  DWORD   SizeOfInitializedData;
  DWORD   SizeOfUninitializedData;
  DWORD   AddressOfEntryPoint;
  DWORD   BaseOfCode;//代码开始地址
  DWORD   BaseOfData;//数据段开始地址

  //
  // NT additional fields.
  //

  DWORD   ImageBase;
  DWORD   SectionAlignment;
  DWORD   FileAlignment;
  WORD   MajorOperatingSystemVersion;
  WORD   MinorOperatingSystemVersion;
  WORD   MajorImageVersion;
  WORD   MinorImageVersion;
  WORD   MajorSubsystemVersion;
  WORD   MinorSubsystemVersion;
  DWORD   Win32VersionValue;
  DWORD   SizeOfImage;
  DWORD   SizeOfHeaders;
  DWORD   CheckSum;
  WORD   Subsystem;
  WORD   DllCharacteristics;
  DWORD   SizeOfStackReserve;
  DWORD   SizeOfStackCommit;
  DWORD   SizeOfHeapReserve;
  DWORD   SizeOfHeapCommit;
  DWORD   LoaderFlags;
  DWORD   NumberOfRvaAndSizes;
  IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

可选PE头重点字段

Magic

Magic表示是32位PE文件,还是64位PE文件,为10B就是32位PE文件,20B就是64位PE文件

SizeOfcode

存放总代码大小,但是是按照FileAlignment对齐后的大小

SectionAlignment

内存对齐大小

FileAlignment

表示文件(硬盘)中的对齐值。

SizeOfInitializedData

已初始化的数据大小,按照FileAlignment对齐

SizeOfUninitializedData

未初始化的数据大小,按照FileAlignment对齐

ImageBase

内存镜像地址,也就是程序加载进内存后的首地址

AddressOfEntryPoint --重中之重

程序入口地址--也叫OEP

也是一个偏移地址,是从程序被加载到内存后在内存中的首地址的偏移地址。

也就是说PE文件的起始地址,就等于程序加载进入内存后,把程序在内存中的首地址加上OEP的地址就是程序加载进去后跑的第一行代码的地址。

也就是 OEP+ImageBase 的地址,就是一个程序真正的入口地址

SizeOfImage

文件在内存中的大小,按SectionAlignment对齐后的大小

SizeOfHeaders

DOS头+NT头+标准PE头(文件头)+可选PE头+区段头,按照FileAlignment对齐后的大小

NumberOfRvaAndSizes:

数据目录表的个数16个 

 

  IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];

  数据目录表,一共有16个内容

 代码实现解析

https://www.cnblogs.com/Sna1lGo/p/14447218.html