【笔记】PE文件格式

0x01 PE加载情况

【笔记】PE文件格式_第1张图片

0x02 DOS头

typedef struct _IMAE_DOS_HEADER {        //DOS .EXE header                                    位置
    WORD e_magic;                        //Magic number;                                      0x00
    WORD e_cblp;                        //Bytes on last page of file                         0x02
    WORD e_cp;                          //Pages in file                                         0x04
    WORD e_crlc;                        //Relocations                                        0x06
    WORD e_cparhdr;                        //Size of header in paragraphs                       0x08
    WORD e_minalloc;                    //Minimum extra paragraphs needed                    0x0A
    WORD e_maxalloc;                    //Maximum extra paragraphs needed                    0x0C
    WORD e_ss;                          //Initial (relative) SS value                         0x0E
    WORD e_sp;                            //Initial SP value                                     0x10
    WORD e_csum;                        //Checksum                                             0x12
    WORD e_ip;                            //Initial IP value                                     0x14
    WORD e_cs;                            //Initial (relative) CS value                        0x16
    WORD e_lfarlc;                        //File address of relocation table                   0x18
    WORD e_ovno;                        //Overlay number                                     0x1A
    WORD e_res[4];                        //Reserved words                                     0x1C
    WORD e_oemid;                        //OEM identifier (for e_oeminfo)                     0x24
    WORD e_oeminfo;                        //OEM information; e_oemid specific                  0x26 
    WORD e_res2[10];                    //Reserved words                                     0x28
    LONG e_lfanew;                        //File address of new exe header                     0x3C
} IMAGE_DOS-HEADER, *PIMAGE_DOS_HEADER;

0x03 DOS存根

DOS存根(stub)在DOS头下方,是个可选项,且大小不固定(即使没有DOS存根,文件也能正常运行).DOS存根由代码与数据混合而成.

0x04 NT头

typedef struct _IMAGE_DOS_HEADER
{
    DWORD  Signature;                    //PE Signature : 50450000("PE"00)
    IMAGE_FILE_HEADER  FileHeader;                //文件头结构体
    IMAGE_ OPTIONAL_HEADER32  OptionalHeader;                //可选头结构体
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER32;

0x05 NT头:文件头

typedef struct _IMAGE_DOS_HEADER
{
    WORD  Machine;                //每个CPU都拥有唯一的machine码
    WORD  NumberOfSections;                //节区数量,当定义节区数与实际不同时会发生错误
    DWORD  TimeDateStamp;
    DWORD  PointerToSymbolTable;
    DWORD  NumberOfSymbols;
    WORD  SizeOfOptionalHeader;                //IMAGE_OPTIONAL_HEADER32结构体的大小,固定的
    WORD  Characteristics;                //文件属性,0x0002h为可执行文件,0x2000h为DLL文件
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER32;

0x06 NT头:可选头

typedef struct _IMAGE_OPTIONAL_HEADER {
WORD    Magic;            //标志字(32位时0x10Bh)
BYTE    MajorLinkerVersion;        //连接器版本号
BYTE    MinorLinkerVersion;        //
DWORD   SizeOfCode;            //代码段大小
DWORD   SizeOfInitializedData;    //已初始化数据块大小
DWORD   SizeOfUninitializedData;    //未初始化数据块大小
DWORD   AddressOfEntryPoint;     //EP的RVA值,程序最先执行代码的地址
DWORD   BaseOfCode;            //代码段起始RVA
DWORD   BaseOfData;            //数据段起始RVA
DWORD   ImageBase;            //PE文件的装载地址
DWORD   SectionAlignment;        //块对齐,节区在内存中最小单位
DWORD   FileAlignment;        //文件块对齐,节区在文件中的最小单位
WORD    MajorOperatingSystemVersion;//所需操作系统版本号
WORD    MinorOperatingSystemVersion;//
WORD    MajorImageVersion;        //用户自定义版本号
WORD    MinorImageVersion;        //
WORD    MajorSubsystemVersion;    //win32子系统版本。若PE文件是专门为Win32设计的
WORD    MinorSubsystemVersion;    //该子系统版本必定是4.0否则对话框不会有3维立体感
DWORD   Win32VersionValue;        //保留
DWORD   SizeOfImage;            //内存中整个PE映像体的尺寸
DWORD   SizeOfHeaders;        //所有头+节表的大小,即整个PE头的大小
DWORD   CheckSum;            //校验和
WORD    Subsystem;            //NT用来识别PE文件属于哪个子系统(系统驱动、GUI、CUI)
WORD    DllCharacteristics;        //
DWORD   SizeOfStackReserve;        //
DWORD   SizeOfStackCommit;        //
DWORD   SizeOfHeapReserve;        //
DWORD   SizeOfHeapCommit;        //
DWORD   LoaderFlags;            //
DWORD   NumberOfRvaAndSizes;    //指定DataDirectory数组的个数
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
//IMAGE_DATA_DIRECTORY 结构数组。每个结构给出一个重要数据结构的RVA,比如引入地址表等
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

0x07 节区头

#define IMAGE_SIZEOF_SHORT_NAME 8
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;     // 在OBJ文件中使用,重定位的偏移  
    DWORD PointerToLinenumbers;   // 行号表的偏移(供调试使用地)  
    WORD NumberOfRelocations;      // 在OBJ文件中使用,重定位项数目  
    WORD NumberOfLinenumbers;    // 行号表中行号的数目  
    DWORD Characteristics;       // 节属性如可读,可写,可执行等  
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

你可能感兴趣的:(【笔记】PE文件格式)