• pe文件结构


    1.MS-DOS头部:使得操作系统能够读取这个文件并明白他是不是和当前系统兼容,占64字节
    typedef struct _IMAGE_DOS_HEADER
    {
    USHORT e_magic;//魔术数字,用于表示MS_DOS兼容的文件类型,兼容的都将此值设置为0x5A4D,表示ASC字符MZ
    USHORT e_cblp;//文件最后页的字节数
    USHORT e_cp;//文件页数
    USHORT e_crlc;//重定义元素个数
    USHORT e_parhdr;//头部尺寸,以段落为单位
    USHORT e_minalloc;//所需的最小附加段
    USHORT e_maxalloc;//所需的最大附加段
    USHORT e_ss;//初始的SS值
    USHORT e_sp;//初始的sp值
    USHORT e_csum;//校验和
    USHORT e_ip;//初始的IP值
    USHORT e_cs;//初始的cs值(相对偏移量)
    USHORT e_lfarlc;//重分配表文件地址
    USHORT eovno;//覆盖号
    USHORT e_res[4];//保留字
    USHORT e_oemid;//OEM标识符(相对e_oeminfo)
    USHORT e_oeminfo;//OEM信息
    USHORT e_res2[10];//保留字
    LONG e_lfanew;//新exe头部的文件地址,4字节的偏移量,PE文件头由它定位
    }IAMGE_DOS_HEADER,*PIMAGE_DOS_HEADER;
    2.实模式残余程序
    装载时能够被MS_DOS运行的实际程序
    对于MS_DOS的可执行映像文件,应用程序是从这里执行的
    3.PE文件头部与标志
    MS_DOS头部的e_lfanew给出了PE文件头部的定位,给出了文件的偏移量
    #define NTSIGNTURE(a) ( (LPVOID)((BYTE*)a + ((PIMAGE_DOS_HEADER)a)->e_lfanew) )
    上面的宏定义给出了PE文件标志,并非PE文件头部的偏移量,文件头部是在DWORD标识还是DWROD标识之后,是由是否是
    WindowsNT文件标志所决定的

    ------------WINNT.H
    #define IMAGE_DOS_SIGNATURE 0x5A4D //MZ
    #define IAMGE_OS/2_SIGNATURE 0X454E //NE
    #define IMAGE_OS/2_SIGNATURE 0x454C //LE
    #define IMAGE_NT_SIGNATURE 0x00004550 //PE
    -----------
    #define PEFHDROFFSET(a) ( (LPVOID)((BYTE*)a + (PIMAGE_DOS_HEADER)a)->e_lfanew + SIZE_OF_NT_SINGATURE )

    typedef struct _IMAGE_FILE_HEADER
    {
    USHORT Machine;//用来表示可执行文件被构建的目标机器种类
    USHORT NumberOfSections;//PE文件的段数目
    ULONG TimeDateStamp;
    ULONG PointerToSymbolTable;
    ULONG NumberOfSymbols;
    USHORT SizeOfOptionalHeader;//表示IAMGE_OPTIONAL_HEADER的大小
    USHORT Characteristics;//表示文件的一些特征
    }IMAGE_FILE_HEADER,* PIMAGE_FILE_HEADER;

    4.PE可选头部
    #define OPTHDROFFSER(a) ((LPVOID)((BYTE*)a + ((PIAMGE_DOS_HEADER)a)->elfanew +
    SIZE_OF_NT_SIGNATURE + sizeof(IMAGE_FILE_HEADER) ) )

    typedef struct _IMAGE_OPTIONAL_HEADER
    {
    //Standard fields
    WORD Magic;
    BYTE MajorLinkerVersion;
    BYTE MinorLinkerVersion;
    DWORD SizeofCode; //可执行代码尺寸
    DWORD SizeOfInitializedData;已初始化数据的尺寸
    DWORD SizeOfUninitializeData;//未初始化数据的尺寸
    DWORD AddressOfEntryPoint;//程序执行入口RVA,对于黑客来说,这个位置是IAT的末尾
    DWORD BaseOfCode;//已载入映像的代码(.text段)的相对偏移量
    DWORD BaseOfData;//已载入映像的未初始化数据(.bss段)的相对偏移量

    //NT additional fields
    ULONG ImageBase;//进程映像地址空间中的首选基地址,默认为0x00400000
    ULONG SectionAlignment;//从ImageBase开始,每个段被装载时的最小空间数量,即段是关于SectionAlignment对齐的
    ULONG FileAlignment;//映像文件首先装载的信息块间隔。PE文件内的区块对齐大小,一般是0x200或0x1000
    USHORT MajorOperatingSystemVersion;//Windows NT操作系统的主版本号
    USHORT MinorOperationSystamVersion;//windows NT操作系统的次版本号
    USHORT MajorImageversion;//应用程序的主版本号
    USHORT MinorImageVersion;//应用程序的此版本号
    USHORT MajorSubsystemVersion;//Windows NT Win32子系统的主版本号
    USHORT MinorSubsystemVersion;//Widnows NT Win32子系统的次版本号
    ULONG Reserved1; //保留
    ULONG SizeOfImage;//映像装入内存后的总大小
    ULONG SizeOfHeaders;//MS_DOS头部和PE头部+区块表的总大小
    ULONG CheckSum;//映像的校验和
    USHORT Subsystem;
    USHORT DllCharacteristics;
    ULONG SizeOfStackReserve;
    ULONG SizeOfStackCommit;
    ULONG SizeofHeapReserve;
    ULONG SizeofHeapCommit;
    ULONG LoaderFlags;
    ULONG NumberOfRvaAndSizes;//用来标识接下来的数组
    IAMGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];//数据目录表
    }IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;

    typedef struct _IAMGE_DATA_DIRECTORY
    {
    ULONG VirtualAddress;
    ULONG Size;
    }IMAGE_DATA_DIRECTORY,* PIAMGE_DATA_DIRECTORY;

    段包含了文件的内容,,包括代码,数据,资源以及其他可执行信息
    每个段都有一个头部和实体

  • 相关阅读:
    带字数限制提示的输入框效果
    js快速获取数组中的最大值最小值
    js实现连线题
    js自定义图片提示效果
    为了遇见你
    为了明天(励志篇)
    你为什么总是不理我
    爱情,是我一生中最虔诚的信仰
    你是我心中永远抹不掉的痛
    爱你一万次够不够
  • 原文地址:https://www.cnblogs.com/xiaoxiaocaicai/p/3594892.html
Copyright © 2020-2023  润新知