PE文件解析

来源:互联网 发布:办公室新装修 知乎 编辑:程序博客网 时间:2024/06/05 06:12



MS-DOS头:64字节数据,最后四个字节为e_lfanew,代表PE头距离文件头的距离。

PE文件头:

        Signiture: 4字节PE文件标识, PE00

        IMAGE_FILE_HEADER: 20字节映像文件头,第16、17字节定义了IMAGE_OPTIONAL_HEADER的大小

        IMAGE_OPTIONAL_HEADER: 该结构非固定大小,但一般为0xE0 (224)字节;主要定义了PE文件更为详尽的属性字段。其结构如下:

       

01.typedefstruct _IMAGE_OPTIONAL_HEADER {
02.    //
03.    // Standard fields.
04.    //
05.  
06.    00hWORD    Magic;                  //幻数,32位pe文件总为010bh
07.    02hBYTE    MajorLinkerVersion;     //连接器主版本号
08.    03hBYTE    MinorLinkerVersion;     //连接器副版本号
09.    04hDWORD   SizeOfCode;             //代码段总大小
10.    08hDWORD   SizeOfInitializedData;  //已初始化数据段总大小
11.    0chDWORD   SizeOfUninitializedData;//未初始化数据段总大小
12.    10hDWORD   AddressOfEntryPoint;    //程序执行入口地址(RVA)
13.    14hDWORD   BaseOfCode;             //代码段起始地址(RVA)
14.    18hDWORD   BaseOfData;             //数据段起始地址(RVA)
15.  
16.    //
17.    // NT additional fields.
18.    //
19.  
20.    1chDWORD   ImageBase;              //程序默认的装入起始地址
21.    20hDWORD   SectionAlignment;       //内存中区块的对齐单位
22.    24hDWORD   FileAlignment;          //文件中区块的对齐单位
23.    28hWORD    MajorOperatingSystemVersion;//所需操作系统主版本号
24.    2ahWORD    MinorOperatingSystemVersion;//所需操作系统副版本号
25.    2chWORD    MajorImageVersion;      //自定义主版本号
26.    2ehWORD    MinorImageVersion;      //自定义副版本号
27.    30hWORD    MajorSubsystemVersion;  //所需子系统主版本号
28.    32hWORD    MinorSubsystemVersion;  //所需子系统副版本号
29.    34hDWORD   Win32VersionValue;      //总是0
30.    38hDWORD   SizeOfImage;            //pe文件在内存中的映像总大小
31.    3chDWORD   SizeOfHeaders;          //从pe文件开始到节表(包含节表)的总大小
32.    40hDWORD   CheckSum;               //pe文件CRC校验和
33.    44hWORD    Subsystem;              //用户界面使用的子系统类型
34.    46hWORD    DllCharacteristics;     //为0
35.    48hDWORD   SizeOfStackReserve;     //为线程的栈初始保留的虚拟内存的默认值
36.    4chDWORD   SizeOfStackCommit;      //为线程的栈初始提交的虚拟内存的大小
37.    50hDWORD   SizeOfHeapReserve;      //为进程的堆保留的虚拟内存的大小
38.    54hDWORD   SizeOfHeapCommit;       //为进程的堆初始提交的虚拟内存的大小
39.    58hDWORD   LoaderFlags;            //为0
40.    5chDWORD   NumberOfRvaAndSizes;    //数据目录结构数组的项数,总为 00000010h
41.    60h IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; //数据目录结构数组
42.} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

        数据目录表,标识数据块的起始RVA地址和数据块长度。一般为16个该结构组成。其结构如下

1.typedefstruct _IMAGE_DATA_DIRECTORY {
2.    DWORD  VirtualAddress;// 相对虚拟地址
3.    DWORD  Size;           //大小
4.} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
    该表距离PE头,0x78 == 120字节。
image

        区段表:区段名、区段加载到内存的起始地址、大小等信息(一个结构体为40个字节)。其结构如下:

       

typedef struct _IMAGE_SECTION_HEADER{

   BYTE   Name[IMAGE_SIZEOF_SHORT_NAME];     //8个字节的区块名

   union {                                    //区块尺寸

           DWORD  PhysicalAddress;

           DWORD  VirtualSize;

             } Misc;

   DWORD  VirtualAddress;                    //区块的RVA地址

   DWORD  SizeOfRawData;                     //文件对齐后的尺寸

   DWORD  PointerToRawData;                  //文件偏移

   DWORD  PointerToRelocations;

   DWORD  PointerToLinenumbers;

   WORD   NumberOfRelocations;

   WORD   NumberOfLinenumbers;

   DWORD  Characteristics;                   //区块的属性

} IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER;





0 0
原创粉丝点击