【笔记】PE文件格式

作者: Pino_HD | 来源:发表于2017-10-05 23:45 被阅读17次

    0x01 PE加载情况

    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文件格式

        本文链接:https://www.haomeiwen.com/subject/pszkyxtx.html