PE文件头

说明

对pe文件头的解析
各种数据结构的定义都在 Winnt.h中

DOS头

typedef struct _IMAGE_DOS_HEADER {
      WORD e_magic;      // MZ头
      WORD e_cblp;
      WORD e_cp;
      WORD e_crlc;
      WORD e_cparhdr;
      WORD e_minalloc;
      WORD e_maxalloc;
      WORD e_ss;
      WORD e_sp;
      WORD e_csum;
      WORD e_ip;
      WORD e_cs;
      WORD e_lfarlc;
      WORD e_ovno;
      WORD e_res[4];
      WORD e_oemid;
      WORD e_oeminfo;
      WORD e_res2[10];
      LONG e_lfanew;      // PE头的开始位置
    } IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;

PE头

 typedef struct _IMAGE_NT_HEADERS64 {
      DWORD Signature;        //PE头
      IMAGE_FILE_HEADER FileHeader;    //文件头
      IMAGE_OPTIONAL_HEADER64 OptionalHeader;   //可选头
    } IMAGE_NT_HEADERS64,*PIMAGE_NT_HEADERS64;

文件头

IMAGE_FILE_HEADER

 typedef struct _IMAGE_FILE_HEADER {
      WORD Machine;               //可执行文件的目标CPU类型
      WORD NumberOfSections;      //PE文件的节区个数
      DWORD TimeDateStamp;        //从1970.1.1到创建该文件时的秒数
      DWORD PointerToSymbolTable;
      DWORD NumberOfSymbols;
      WORD SizeOfOptionalHeader;  //可选头的大小
      WORD Characteristics;       //文件类型(dll...)
    } IMAGE_FILE_HEADER,*PIMAGE_FILE_HEADER;

选项头

节表

节的个数由文件头的NumberOfHeader给出

地址转换

VA虚拟地址,也就是程序装载进内存的位置
RVA相对虚拟地址,地址 - 程序装载地址
FileOffset在文件中的地址
在磁盘上时,对齐 = 选项头.FileAlignment
在内存中时,对齐 = 选项头.SectionAlignment

上一篇:PE(一)


下一篇:LVM之PE