PE头部IMAGE_NT_HEADERS

PE头部是真正用来装载Win32程序的头部,PE头的定义为IMAGE_NT_HEADERS,该结构体包含PE标识符、文件头与可选头这三部分。

该头部具有32位和64位之分。

32位的PE文件格式,IMAGE_NT_HEADERS32定义如下:

[cpp]  view plain  copy
  1. typedef struct _IMAGE_NT_HEADERS {         
  2.     DWORD Signature;                              //位置在e_lfanew上  
  3.     IMAGE_FILE_HEADER FileHeader;                 //e_lfanew + 0x4         文件头结构体  
  4.     IMAGE_OPTIONAL_HEADER32 OptionalHeader;       //e_lfanew + 0x18        可选头结构体  
  5. } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;  

该结构体中的Signature就是PE标识符,该部分占四个字节,在Winnt.h头文件中的宏定义为:

[cpp]  view plain  copy
  1. #define IMAGE_NT_SIGNATURE 0x50450000 // PE00  

在PE头中,除了IMAGE_NT_HEADERS 以外,还有两个重要的结构体,分别是IMAGE_FILE_HEADER(文件头) 和 IMAGE_OPTIONAL_HEADER32(可选头)。


IMAGE_FILE_HEADER(文件头)

该结构体是IMAGE_NT_HEADERS中的第一个结构体,该结构体紧接在PE标识符的后面。该结构体大小为20个字节。

[cpp]  view plain  copy
  1. typedef struct _IMAGE_FILE_HEADER {  
  2.     WORD Machine;                   //位置为 e_lfanew + 0x4 //该字段表示可执行文件的目标CPU类型  
  3.     WORD NumberOfSections;          //e_lfanew + 0x6        //该字段表示PE文件的节区的个数  
  4.     DWORD TimeDateStamp;            //e_lfanew + 0x8        //该字段表明文件时何时被创建的,这个值是自1970年1月1日以来用格林  
  5.                                                             //威治时间计算的秒数  
  6.     DWORD PointerToSymbolTable;     //e_lfanew + 0xC        //  
  7.     DWORD NumberOfSymbols;          //e_lfanew + 0x10       //  
  8.     WORD SizeOfOptionalHeader;      //e_lfanew + 0x12       //该字段指定IMAGE_OPTIONAL_HEADER结构的大小  
  9.     WORD Characteristics;           //e_lfanew + 0x14       //该字段指定文件的类型  
  10. } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;   //大小20字节  
  11.   
  12.   
  13. //Machine字段取值  
  14. //          宏定义                 值           意义  
  15. // IMAGE_FILE_MACHINE_I386        0x014c       Intel  
  16. // IMAGE_FILE_MACHINE_ALPHA       0x0184      DEC Alpha  
  17. // IMAGE_FILE_MACHINE_IA64        0x0200    Intel(64 - bit)  
  18. // IMAGE_FILE_MACHINE_AXP64       0x0284    DEC Alpha(64 - bit)  
  19.   
  20.   
  21. //Characteristics字段取值  
  22. //          宏定义                 值                意义  
  23. // IMAGE_FILE_RELOCS_STRIPPED     0x0001     文件中不存在重定位信息  
  24. // IMAGE_FILE_EXECUTABLE_IMAGE    0x0002     文件可执行  
  25. // IMAGE_FILE_LINE_NUMS_STRIPPED  0x0004     行号信息已从文件中移除  
  26. // IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008     符号信息已从文件中移除  
  27. // IMAGE_FILE_DLL                 0x2000     DLL文件  
  28. // IMAGE_FILE_SYSTEM              0x1000     系统文件  
  29. // IMAGE_FILE_32BIT_MACHINE       0x0100     目标平台为32位平台  

IMAGE_OPTIONAL_HEADER32(可选头)

[cpp]  view plain  copy
  1. typedef struct _IMAGE_OPTIONAL_HEADER {  
  2.     WORD Magic;                         //位置为 e_lfanew + 0x18                       //文件的状态类型  
  3.     BYTE MajorLinkerVersion;            //e_lfanew + 0x1A                               //主链接版本号  
  4.     BYTE MinorLinkerVersion;            //e_lfanew + 0x1B                               //次链接版本号  
  5.     DWORD SizeOfCode;                   //e_lfanew + 0x1C                               //代码节的大小  
  6.     DWORD SizeOfInitializedData;        //e_lfanew + 0x20                               //已初始化数据块的大小  
  7.     DWORD SizeOfUninitializedData;      //e_lfanew + 0x24                               //未初始化数据块的大小  
  8.     DWORD AddressOfEntryPoint;          //e_lfanew + 0x28                               //程序执行的入口,相对虚拟地址,简称EP  
  9.     DWORD BaseOfCode;                   //e_lfanew + 0x2C                               //代码段的起始相对虚拟地址  
  10.     DWORD BaseOfData;                   //e_lfanew + 0x30                               //数据段的起始相对虚拟地址  
  11.     DWORD ImageBase;                    //e_lfanew + 0x34                               //内存首选装载地址  
  12.     DWORD SectionAlignment              //e_lfanew + 0x38                               //节在内存中的对齐值  
  13.     DWORD FileAlignment                 //e_lfanew + 0x3C                               //节在文件中的对齐值  
  14.     WORD MajorOperatingSystemVersion;   //e_lfanew + 0x40                               //要求最低操作系统的主版本号  
  15.     WORD MinorOperatingSystemVersion;   //e_lfanew + 0x42                               //要求最低操作系统的次版本号  
  16.     WORD MajorImageVersion;             //e_lfanew + 0x44                               //可执行文件的主版本号      
  17.     WORD MinorImageVersion;             //e_lfanew + 0x46                               //可执行文件的次版本号  
  18.     WORD MajorSubsystemVersion;         //e_lfanew + 0x48                               //要求最低子系统的主版本号  
  19.     WORD MinorSubsystemVersion;         //e_lfanew + 0x4A                               //要求最低子系统的次版本号  
  20.     DWORD Win32VersionValue;            //e_lfanew + 0x4C                               //该成员变量是被保留的  
  21.     DWORD SizeOfImage;                  //e_lfanew + 0x50                               //可执行文件装入内存后的总大小  
  22.     DWORD SizeOfHeader;                 //e_lfanew + 0x54                               //PE头的大小,包括DOS头、PE头、节表的总和大小  
  23.     DWORD CheckSum;                     //e_lfanew + 0x58                               //校验和  
  24.     WORD Subsystem;                     //e_lfanew + 0x5C                               //可执行文件的子系统类型  
  25.     WORD DllCharacteristics;            //e_lfanew + 0x5E                               //指定DLL文件的属性,该值大部分时候为0  
  26.     DWORD SizeOfStackReserve;           //e_lfanew + 0x60                               //为线程保留的栈大小  
  27.     DWORD SizeOfStackCommit;            //e_lfanew + 0x64                               //为线程已经提交的栈大小  
  28.     DWORD SizeOfHeapReserve;            //e_lfanew + 0x68                               //为线程保留的堆大小  
  29.     DWORD SizeOfHeapCommit;             //e_lfanew + 0x6C                               //为线程已经提交的堆大小  
  30.     DWORD LoaderFlags;                  //e_lfanew + 0x70                               //被废弃的成员值  
  31.     DWORD NumberOfRvaandSizes;          //e_lfanew + 0x74                               //数据目录项的个数  
  32.     IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];   //e_lfanew + 0x78   //数据目录表  
  33.     //#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16            
  34. } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;      //大小224字节  
  35.   
  36.   
  37. //Magic取值  
  38. //          宏定义                 值                意义  
  39. // IMAGE_NT_OPTIONAL_HDR_MAGIC     0x10b          可执行文件  
  40. // IMAGE_ROM_OPTIONAL_HDR_MAGIC    0x107          ROM文件  
  41.   
  42.   
  43. //Subsystem取值  
  44. //          宏定义                 值                意义  
  45. // IMAGE_SUBSYSTEM_UNKNOWN          0             未知子系统  
  46. // IMAGE_SUBSYSTEM_NATIVE           1            不需要子系统  
  47. // IMAGE_SUBSYSTEM_WINDOWS_GUI      2            图形子系统  
  48. // IMAGE_SUBSYSTEM_WINDOWS_CUI      3            控制台子系统  
  49.   
  50.   
  51. //IMAGE_DATA_DIRECTORY  
  52. typedef struct _IMAGE_DATA_DIRECTORY {  
  53.     DWORD VirtualAddress;  
  54.     DWORD Size;  
  55. } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;  
  56.   
  57. //取值  
  58. //            宏定义                    值                 意义  
  59. // IMAGE_DIRECTORY_ENTRY_EXPORT     0          导出表在数组中的索引  
  60. // IMAGE_DIRECTORY_ENTRY_IMPORT     1           导入表在数组中的索引  
  61. // IMAGE_DIRECTORY_ENTRY_RESOURCE   2           资源在数组中的索引  
  62. // IMAGE_DIRECTORY_ENTRY_BASERELOC  5          重定位表在数组中的索引  
  63. // IMAGE_DIRECTORY_ENTRY_IAT        12         导入地址表在数组中的索引  


IMAGE_SECTION_HEADER(节区详解)

 

[cpp]  view plain  copy
  1. typedef struct _IMAGE_SECTION_HEADER {          //第一个节区,每个节区依次往后推40字节即可  
  2.     BYTE Name[IMAGE_SIZEOF_SHORT_NAME];         //位置为 e_lfanew + 0xF8                   //保存节的名称  
  3.     union {                                       
  4.         DWORD PhysicalAddress;                  //e_lfanew + 0x100                          //  
  5.         DWORD VirtualSize;                      //e_lfanew + 0x104                          //数据实际的节区大小  
  6.     } Misc;  
  7.     DWORD VirtualAddress;                       //e_lfanew + 0x108                          //该节区载入到内存后的相对虚拟地址  
  8.     DWORD SizeOfRawData;                        //e_lfanew + 0x10C                          //该节区在磁盘上的大小  
  9.     DWORD PointerToRawData;                     //e_lfanew + 0x110                          //该节区在磁盘文件上的偏移值  
  10.     DWORD PointerToRelocations;                 //e_lfanew + 0x114  
  11.     DWORD PointerToLinenumbers;                 //e_lfanew + 0x118  
  12.     WORD NumberOfRelocations;                   //e_lfanew + 0x11C  
  13.     WORD NumberOfLinenumbers;                   //e_lfanew + 0x11E  
  14.     DWORD Characteristics;                      //e_lfanew + 0x120                          //节区属性  
  15. } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;   //该数据结构大小为40字节  
  16.   
  17. //Characteristics(节区属性)取值  
  18. //          宏定义                 值                意义  
  19. // IMAGE_SCN_CNT_CODE          0x00000020       该节区含代码  
  20. // IMAGE_SCN_MEM_SHARED        0x10000000       该节区为可共享  
  21. // IMAGE_SCN_MEM_EXECUTE       0x20000000       该节区为可执行  
  22. // IMAGE_SCN_MEM_READ          0x40000000       该节区为可读  
  23. // IMAGE_SCN_MEM_WRITE         0x80000000       该节区为可写  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值