【home88一必发】PE结构解析,学习笔记

by admin on 2019年3月9日

布局体源代码如下:

布局体源代码如下:

[PE结构分析] 5.IMAGE_OPTIONAL_HEADER,imageoptionalheader

布局体源代码如下:

typedef struct _IMAGE_OPTIONAL_HEADER 
{
    //
    // Standard fields.  
    //
+18h    WORD    Magic;                   // 标志字, ROM 映像(0107h),普通可执行文件(010Bh)
+1Ah    BYTE    MajorLinkerVersion;      // 链接程序的主版本号
+1Bh    BYTE    MinorLinkerVersion;      // 链接程序的次版本号
+1Ch    DWORD   SizeOfCode;              // 所有含代码的节的总大小
+20h    DWORD   SizeOfInitializedData;   // 所有含已初始化数据的节的总大小
+24h    DWORD   SizeOfUninitializedData; // 所有含未初始化数据的节的大小
+28h    DWORD   AddressOfEntryPoint;     // 程序执行入口RVA ***(必须了解)***
+2Ch    DWORD   BaseOfCode;              // 代码的区块的起始RVA
+30h    DWORD   BaseOfData;              // 数据的区块的起始RVA
    //
    // NT additional fields.    以下是属于NT结构增加的领域。
    //
+34h    DWORD   ImageBase;               // 程序的首选装载地址 ***(必须了解)***
+38h    DWORD   SectionAlignment;        // 内存中的区块的对齐大小 ***(必须了解)***
+3Ch    DWORD   FileAlignment;           // 文件中的区块的对齐大小 ***(必须了解)***
+40h    WORD    MajorOperatingSystemVersion;  // 要求操作系统最低版本号的主版本号
+42h    WORD    MinorOperatingSystemVersion;  // 要求操作系统最低版本号的副版本号
+44h    WORD    MajorImageVersion;       // 可运行于操作系统的主版本号
+46h    WORD    MinorImageVersion;       // 可运行于操作系统的次版本号
+48h    WORD    MajorSubsystemVersion;   // 要求最低子系统版本的主版本号
+4Ah    WORD    MinorSubsystemVersion;   // 要求最低子系统版本的次版本号
+4Ch    DWORD   Win32VersionValue;       // 莫须有字段,不被病毒利用的话一般为0
+50h    DWORD   SizeOfImage;             // 映像装入内存后的总尺寸
+54h    DWORD   SizeOfHeaders;           // 所有头 + 区块表的尺寸大小
+58h    DWORD   CheckSum;                // 映像的校检和
+5Ch    WORD    Subsystem;               // 可执行文件期望的子系统 ***(必须了解)***
+5Eh    WORD    DllCharacteristics;      // DllMain()函数何时被调用,默认为 0
+60h    DWORD   SizeOfStackReserve;      // 初始化时的栈大小
+64h    DWORD   SizeOfStackCommit;       // 初始化时实际提交的栈大小
+68h    DWORD   SizeOfHeapReserve;       // 初始化时保留的堆大小
+6Ch    DWORD   SizeOfHeapCommit;        // 初始化时实际提交的堆大小
+70h    DWORD   LoaderFlags;             // 与调试有关,默认为 0 
+74h    DWORD   NumberOfRvaAndSizes;     // 下边数据目录的项数,这个字段自Windows NT 发布以来一直是16
+78h    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];   
// 数据目录表 ***(必须了解,重点)*** winNT发布到win10,IMAGE_NUMBEROF_DIRECTORY_ENTRIES一直都是16
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

AddressOfEntryPoint  ***(必须询问)***

程序先导履行的地点,那是二个途胜VA(相对虚拟地址)。对于exe文件,那里是开发银行代码;对于dll文件,那里是libMain()的地方。借使在一个可执行文件上附加了一段代码并想让那段代码首先被实施,那么只需求将以此进口地址指向附加的代码就能够了。在脱壳时首先件事就是找入口点,指的正是其一值。

ImageBase  ***(必须询问)***

PE文件的事先装入地址。也正是说,当文件被执行时,要是也许的话(当前地点没有被应用),Windows优先将文件装入到由ImageBase字段钦赐的地方中。

对于EXE文件来说,由于每一种文件一连选取独立的虚拟地址空间,优先装入地址不容许被**模块占据,所以EXE总是可以依照这几个地方装入

那也意味着EXE文件不再必要重定位音信。

对于DLL文件来说,由于四个DLL文件全体施用宿主EXE文件的地方空间,不可能担保优先装入地址没有被**的DLL使用,所以DLL文件中必须包罗重一直音信防止万一。

由此,在前方介绍的 IMAGE_FILE_HEADE昂科雷 结构的 Characteristics
字段中,DLL 文件对应的 IMAGE_FILE_RELOCS_ST大切诺基IPPED
位总是为0,而EXE文件的那些标志位延续为1。

只要没有点名的话,dll文件暗中认可为0x一千0000;exe文件私下认可为0x00四千00,然而在Windows
CE平台上是0x000一千0。此值必须是64K bytes的倍数!

SectionAlignment ***(必须询问)***

【home88一必发】PE结构解析,学习笔记。内部存款和储蓄器中区块的对齐单位。区块总是对齐到那几个值的平头倍。此字段必须大于或等于
FileAlignment ,暗中认可值是系统页面包车型地铁大大小小。叁十一位cpu平常值为
0x一千(十六进制),即4096,即4KB。六十几位cpu平日为 8kB
【home88一必发】PE结构解析,学习笔记。FileAlignment ***(必须掌握)*****

pe文件中区块的对齐单位,以bytes(字节)为单位。此值必须是2的次方倍,可是必须在512和64K间距之间(闭区间[521,
64*1024=65536]),要是SectionAlignment小于系统页面包车型大巴分寸,那么Section阿里gnment的尺寸就和FileAlignment相同。pe文件中暗中同意值为
521 字节(0.5KB) 即 0x200(十六进制)。

Subsystem ***(必须询问)***

pe文件的用户界面使用的子系统类型。定义如下:

#define IMAGE_SUBSYSTEM_UNKNOWN              0   // 未知子系统
#define IMAGE_SUBSYSTEM_NATIVE               1   // 不需要子系统(如驱动程序)
#define IMAGE_SUBSYSTEM_WINDOWS_GUI          2   // Windows GUI 子系统
#define IMAGE_SUBSYSTEM_WINDOWS_CUI          3   // Windows 控制台子系统
#define IMAGE_SUBSYSTEM_OS2_CUI              5   // OS/2 控制台子系统
#define IMAGE_SUBSYSTEM_POSIX_CUI            7   // Posix 控制台子系统
#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS       8   // 镜像是原生 Win9x 驱动程序
#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI       9   // Windows CE 图形界面

诸如,Visual Studio 二〇一四中编译程序时得以在图形界面设置链接选项:

更加多请查看:

微软官方文书档案:

DataDirectory ***(必须领悟,主要)***

其一字段能够说是最关键的字段之一,它由15个一律的IMAGE_DATA_DIRECTO福特ExplorerY结构重组。其结构如下:

typedef struct _IMAGE_DATA_DIRECTORY {

   DWORD   VirtualAddress; // 相对虚拟地址 

   DWORD   Size;           // 数据块的大小

} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

也正是概念了某块的地方和分寸。

虽说PE文件中的数据是依照装入内部存款和储蓄器后的页属性归类而被放在不一致的节中的,可是那么些地处各类节中的数据依照用途能够被分成导出表、导入表、财富、重定位表等数据块,那15个IMAGE_DATA_DIRECTORubiconY结构正是用来定义三种差别用途的数据块的(如下表所示)。IMAGE_DATA_DIRECTOHighlanderY结构的概念很简短,它仅仅提出了某种数据块的岗位和长度。

#define IMAGE_DIRECTORY_ENTRY_EXPORT          0   // 导出表
#define IMAGE_DIRECTORY_ENTRY_IMPORT          1   // 导入表
#define IMAGE_DIRECTORY_ENTRY_RESOURCE        2   // 资源表
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION       3   // 异常表(具体资料不详)
#define IMAGE_DIRECTORY_ENTRY_SECURITY        4   // 安全表(具体资料不详)
#define IMAGE_DIRECTORY_ENTRY_BASERELOC       5   // 重定位表
#define IMAGE_DIRECTORY_ENTRY_DEBUG           6   // 调试表
//      IMAGE_DIRECTORY_ENTRY_COPYRIGHT       7   // (X86 usage) 版权信息
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE    7   // 版权信息
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR       8   // RVA of GP (具体资料不详)
#define IMAGE_DIRECTORY_ENTRY_TLS             9   // TLS Directory (线程位置存储,具体资料不详)
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG    10   // Load Configuration Directory (不详)
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT   11   // Bound Import Directory in headers(不详)
#define IMAGE_DIRECTORY_ENTRY_IAT            12   // 导入函数地址表
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   13   // Delay Load Import Descriptors(不详)
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14   // COM Runtime descriptor(不详)

]
5.IMAGE_OPTIONAL_HEADERAV4,imageoptionalheader 结构体源代码如下:
typedef struct _IMAGE_OPTIONAL_HEADER { // // Standard fields. //
+18h WORD Magic; // 标志…

  • 运用SDK或Visual
    C++创立PE文件时,EXE暗中认可的ImageBase为00四千00,DLL暗许10000000。使用DDK创建的SYS文件暗许的ImageBase为一千0。

  • Windows
    Vista之后的本子引入了ASL讴歌RDX安全机制,每一次运营EXE文件都会被加载到任意地址,增强了系统安全性。

  • VC++中生成的PE文件的重定位节区名为.reloc,删除该节区后文件照常运作。

  • .reloc删除:

  • 首先在 IMAGE_SECTION_HEADE奇骏 .reloc 处查看该节区头的长度和 .reloc
    节区的偏移地址,以及 Virtual Size

  • 下一场将 .reloc 的节区头中的值替换为0, .reloc 节区整个删除

  • 剔除节区后,修改 IMAGE_FILE_HEADER 中的 Number of Sections 项。

  • 通过 IMAGE_OPTIONAL_HEADEKuga – size of Image 修改影像值大小。

  • 亟需收缩的值依照从前记录的 Virtual Size 和 IMAGE_OPTIONAL_HEADE奥迪Q3 –
    Section Alignment 值增添后所得。

  • 传闻PE文件格式规范,IMAGE_NT_HEADE奇骏S的伊始地方是“可变的”,由IMAGE_DOS_HEADER中的e_lfanew的值决定。一般装有如下值(分化塑造环境会有两样):

typedef struct _IMAGE_OPTIONAL_HEADER 
{
    //
    // Standard fields.  
    //
+18h    WORD    Magic;                   // 标志字, ROM 映像(0107h),普通可执行文件(010Bh)
+1Ah    BYTE    MajorLinkerVersion;      // 链接程序的主版本号
+1Bh    BYTE    MinorLinkerVersion;      // 链接程序的次版本号
+1Ch    DWORD   SizeOfCode;              // 所有含代码的节的总大小
+20h    DWORD   SizeOfInitializedData;   // 所有含已初始化数据的节的总大小
+24h    DWORD   SizeOfUninitializedData; // 所有含未初始化数据的节的大小
+28h    DWORD   AddressOfEntryPoint;     // 程序执行入口RVA ***(必须了解)***
+2Ch    DWORD   BaseOfCode;              // 代码的区块的起始RVA
+30h    DWORD   BaseOfData;              // 数据的区块的起始RVA
    //
    // NT additional fields.    以下是属于NT结构增加的领域。
    //
+34h    DWORD   ImageBase;               // 程序的首选装载地址 ***(必须了解)***
+38h    DWORD   SectionAlignment;        // 内存中的区块的对齐大小 ***(必须了解)***
+3Ch    DWORD   FileAlignment;           // 文件中的区块的对齐大小 ***(必须了解)***
+40h    WORD    MajorOperatingSystemVersion;  // 要求操作系统最低版本号的主版本号
+42h    WORD    MinorOperatingSystemVersion;  // 要求操作系统最低版本号的副版本号
+44h    WORD    MajorImageVersion;       // 可运行于操作系统的主版本号
+46h    WORD    MinorImageVersion;       // 可运行于操作系统的次版本号
+48h    WORD    MajorSubsystemVersion;   // 要求最低子系统版本的主版本号
+4Ah    WORD    MinorSubsystemVersion;   // 要求最低子系统版本的次版本号
+4Ch    DWORD   Win32VersionValue;       // 莫须有字段,不被病毒利用的话一般为0
+50h    DWORD   SizeOfImage;             // 映像装入内存后的总尺寸
+54h    DWORD   SizeOfHeaders;           // 所有头 + 区块表的尺寸大小
+58h    DWORD   CheckSum;                // 映像的校检和
+5Ch    WORD    Subsystem;               // 可执行文件期望的子系统 ***(必须了解)***
+5Eh    WORD    DllCharacteristics;      // DllMain()函数何时被调用,默认为 0
+60h    DWORD   SizeOfStackReserve;      // 初始化时的栈大小
+64h    DWORD   SizeOfStackCommit;       // 初始化时实际提交的栈大小
+68h    DWORD   SizeOfHeapReserve;       // 初始化时保留的堆大小
+6Ch    DWORD   SizeOfHeapCommit;        // 初始化时实际提交的堆大小
+70h    DWORD   LoaderFlags;             // 与调试有关,默认为 0 
+74h    DWORD   NumberOfRvaAndSizes;     // 下边数据目录的项数,这个字段自Windows NT 发布以来一直是16
+78h    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];   
// 数据目录表 ***(必须了解,重点)*** winNT发布到win10,IMAGE_NUMBEROF_DIRECTORY_ENTRIES一直都是16
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
typedef struct _IMAGE_OPTIONAL_HEADER 
{
    //
    // Standard fields.  
    //
+18h    WORD    Magic;                   // 标志字, ROM 映像(0107h),普通可执行文件(010Bh)
+1Ah    BYTE    MajorLinkerVersion;      // 链接程序的主版本号
+1Bh    BYTE    MinorLinkerVersion;      // 链接程序的次版本号
+1Ch    DWORD   SizeOfCode;              // 所有含代码的节的总大小
+20h    DWORD   SizeOfInitializedData;   // 所有含已初始化数据的节的总大小
+24h    DWORD   SizeOfUninitializedData; // 所有含未初始化数据的节的大小
+28h    DWORD   AddressOfEntryPoint;     // 程序执行入口RVA ***(必须了解)***
+2Ch    DWORD   BaseOfCode;              // 代码的区块的起始RVA
+30h    DWORD   BaseOfData;              // 数据的区块的起始RVA
    //
    // NT additional fields.    以下是属于NT结构增加的领域。
    //
+34h    DWORD   ImageBase;               // 程序的首选装载地址 ***(必须了解)***
+38h    DWORD   SectionAlignment;        // 内存中的区块的对齐大小 ***(必须了解)***
+3Ch    DWORD   FileAlignment;           // 文件中的区块的对齐大小 ***(必须了解)***
+40h    WORD    MajorOperatingSystemVersion;  // 要求操作系统最低版本号的主版本号
+42h    WORD    MinorOperatingSystemVersion;  // 要求操作系统最低版本号的副版本号
+44h    WORD    MajorImageVersion;       // 可运行于操作系统的主版本号
+46h    WORD    MinorImageVersion;       // 可运行于操作系统的次版本号
+48h    WORD    MajorSubsystemVersion;   // 要求最低子系统版本的主版本号
+4Ah    WORD    MinorSubsystemVersion;   // 要求最低子系统版本的次版本号
+4Ch    DWORD   Win32VersionValue;       // 莫须有字段,不被病毒利用的话一般为0
+50h    DWORD   SizeOfImage;             // 映像装入内存后的总尺寸
+54h    DWORD   SizeOfHeaders;           // 所有头 + 区块表的尺寸大小
+58h    DWORD   CheckSum;                // 映像的校检和
+5Ch    WORD    Subsystem;               // 可执行文件期望的子系统 ***(必须了解)***
+5Eh    WORD    DllCharacteristics;      // DllMain()函数何时被调用,默认为 0
+60h    DWORD   SizeOfStackReserve;      // 初始化时的栈大小
+64h    DWORD   SizeOfStackCommit;       // 初始化时实际提交的栈大小
+68h    DWORD   SizeOfHeapReserve;       // 初始化时保留的堆大小
+6Ch    DWORD   SizeOfHeapCommit;        // 初始化时实际提交的堆大小
+70h    DWORD   LoaderFlags;             // 与调试有关,默认为 0 
+74h    DWORD   NumberOfRvaAndSizes;     // 下边数据目录的项数,这个字段自Windows NT 发布以来一直是16
+78h    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];   
// 数据目录表 ***(必须了解,重点)*** winNT发布到win10,IMAGE_NUMBEROF_DIRECTORY_ENTRIES一直都是16
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

AddressOfEntryPoint  ***(必须询问)***

AddressOfEntryPoint  ***(必须明白)***

e_lfanew = MZ文件头大小(40) + DOS存根大小(可变:VC++下为A0) = E0

程序早先推行的地点,那是八个HighlanderVA(相对虚拟地址)。对于exe文件,那里是开发银行代码;对于dll文件,那里是libMain()的地点。要是在一个可执行文件上附加了一段代码并想让那段代码首先被实践,那么只供给将以此进口地址指向附加的代码就能够了。在脱壳时首先件事正是找入口点,指的正是以此值。

次第起初施行的地方,那是二个昂科拉VA(相对虚拟地址)。对于exe文件,那里是运行代码;对于dll文件,那里是libMain()的地方。假设在2个可执行文件上附加了一段代码并想让那段代码首先被实施,那么只需求将那个进口地址指向附加的代码就足以了。在脱壳时首先件事便是找入口点,指的就是其一值。

  • IMAGE_FILE_HEADER中的SizeOfOptionalHeader表示IMAGE_OPTIONAL_HEADE凯雷德结构体的长度。另一层含义是鲜明节区头(IMAGE_SECTION_HEADE宝马X3)的开始偏移。

  • 从IMAGE_OPTIONAL_HEADE昂Cora的初始偏移加上SizeOfOptionalHeader的值的地点上马才是IMAGE_SECTION_HEADER

  • IMAGE_OPTIONAL_HEADE帕杰罗在叁13人PE3第22中学山大学小为E0,63人PE32+中的大小为F0

  • Data_Directories中Import_Table为三个字节。前几个字节为导入表的地方(奥迪Q5VA),后多个字节为导入表的轻重(SIZE)。如下图:导入表的景逸SUVVA为271EE

ImageBase  ***(必须精晓)***

ImageBase  ***(必须询问)***

home88一必发 1

PE文件的预先装入地址。也正是说,当文件被实施时,如果大概的话(当前地点没有被使用),Windows优先将文件装入到由ImageBase字段钦命的地址中。

PE文件的先行李装运入地址。也正是说,当文件被执行时,假设大概的话(当前地点没有被应用),Windows优先将文件装入到由ImageBase字段钦命的地方中。

对于EXE文件来说,由于各样文件连续选择独立的虚拟地址空间,优先装入地址不容许被**模块占据,所以EXE总是能够依照这么些地点装入

对于EXE文件来说,由于每一个文件一连利用独立的虚拟地址空间,优先装入地址不或者被**模块占据,所以EXE总是能够依照这一个地址装入

那也意味着EXE文件不再必要重定位音讯。

那也意味着EXE文件不再要求重定位新闻。

对于DLL文件来说,由于多个DLL文件全体应用宿主EXE文件的地方空间,无法担保优先装入地址没有被**的DLL使用,所以DLL文件中必须带有重一直音信避防万一。

对于DLL文件来说,由于多个DLL文件全体运用宿主EXE文件的地址空间,不能够确认保障优先装入地址没有被**的DLL使用,所以DLL文件中必须带有重一向新闻防止万一。

之所以,在头里介绍的 IMAGE_FILE_HEADEXC60 结构的 Characteristics
字段中,DLL 文件对应的 IMAGE_FILE_RELOCS_STHighlanderIPPED
位总是为0,而EXE文件的那个标志位一而再为1。

据此,在前面介绍的 IMAGE_FILE_HEADE福特Explorer 结构的 Characteristics
字段中,DLL 文件对应的 IMAGE_FILE_RELOCS_STSportageIPPED
位总是为0,而EXE文件的那一个标志位三番五次为1。

如若没有点名的话,dll文件私下认可为0x一千0000;exe文件暗许为0x00600000,然则在Windows
CE平台上是0x000一千0。此值必须是64K bytes的倍数!

万一没有点名的话,dll文件暗中同意为0x一千0000;exe文件默许为0x00四千00,可是在Windows
CE平台上是0x000一千0。此值必须是64K bytes的翻番!

SectionAlignment ***(必须询问)***

SectionAlignment ***(必须询问)***

内部存款和储蓄器中区块的对齐单位。区块总是对齐到那个值的平头倍。此字段必须高于或等于
FileAlignment ,暗许值是系统页面包车型地铁尺寸。3一人cpu经常值为
0x一千(十六进制),即4096,即4KB。61个人cpu经常为 8kB
FileAlignment ***(必须理解)*****

内存中区块的对齐单位。区块总是对齐到那一个值的整数倍。此字段必须超出或等于
FileAlignment ,暗中认可值是系统页面包车型大巴轻重缓急。三拾二位cpu经常值为
0x一千(十六进制),即4096,即4KB。陆拾4个人cpu平日为 8kB
FileAlignment ***(必须掌握)*****

pe文件中区块的对齐单位,以bytes(字节)为单位。此值必须是2的次方倍,可是必须在512和64K距离之间(闭区间[521,
64*1024=65536]),假如SectionAlignment小于系统页面包车型地铁轻重缓急,那么SectionAlignment的轻重缓急就和FileAlignment相同。pe文件中默认值为
521 字节(0.5KB) 即 0x200(十六进制)。

pe文件中区块的对齐单位,以bytes(字节)为单位。此值必须是2的次方倍,不过必须在512和64K间距之间(闭区间[521,
64*1024=65536]),假若SectionAlignment小于系统页面包车型大巴轻重,那么SectionAlignment的轻重就和FileAlignment相同。pe文件中暗许值为
521 字节(0.5KB) 即 0x200(十六进制)。

Subsystem ***(必须询问)***

Subsystemhome88一必发, ***(必须掌握)***

pe文件的用户界面使用的子系统类型。定义如下:

pe文件的用户界面使用的子系统类型。定义如下:

#define IMAGE_SUBSYSTEM_UNKNOWN              0   // 未知子系统
#define IMAGE_SUBSYSTEM_NATIVE               1   // 不需要子系统(如驱动程序)
#define IMAGE_SUBSYSTEM_WINDOWS_GUI          2   // Windows GUI 子系统
#define IMAGE_SUBSYSTEM_WINDOWS_CUI          3   // Windows 控制台子系统
#define IMAGE_SUBSYSTEM_OS2_CUI              5   // OS/2 控制台子系统
#define IMAGE_SUBSYSTEM_POSIX_CUI            7   // Posix 控制台子系统
#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS       8   // 镜像是原生 Win9x 驱动程序
#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI       9   // Windows CE 图形界面
#define IMAGE_SUBSYSTEM_UNKNOWN              0   // 未知子系统
#define IMAGE_SUBSYSTEM_NATIVE               1   // 不需要子系统(如驱动程序)
#define IMAGE_SUBSYSTEM_WINDOWS_GUI          2   // Windows GUI 子系统
#define IMAGE_SUBSYSTEM_WINDOWS_CUI          3   // Windows 控制台子系统
#define IMAGE_SUBSYSTEM_OS2_CUI              5   // OS/2 控制台子系统
#define IMAGE_SUBSYSTEM_POSIX_CUI            7   // Posix 控制台子系统
#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS       8   // 镜像是原生 Win9x 驱动程序
#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI       9   // Windows CE 图形界面

比如说,Visual Studio 2014中编写翻译程序时方可在图形界面设置链接选项:

譬如,Visual Studio 2014中编写翻译程序时方可在图形界面设置链接选项:

home88一必发 2

home88一必发 3

越来越多请查看:

越多请查看:

微软官方文书档案:https://msdn.microsoft.com/en-us/library/windows/desktop/ms680339(v=vs.85).aspx.aspx)

微软官方文档:https://msdn.microsoft.com/en-us/library/windows/desktop/ms680339(v=vs.85).aspx.aspx)

DataDirectory ***(必须通晓,主要)***

DataDirectory ***(必须精通,重要)***

本条字段可以说是最重点的字段之一,它由十六个一样的IMAGE_DATA_DIRECTO福特ExplorerY结构组成。其组织如下:

其一字段能够说是最要害的字段之一,它由16个一律的IMAGE_DATA_DIRECTO逍客Y结构组成。其布局如下:

typedef struct _IMAGE_DATA_DIRECTORY {

   DWORD   VirtualAddress; // 相对虚拟地址 

   DWORD   Size;           // 数据块的大小

} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
typedef struct _IMAGE_DATA_DIRECTORY {

   DWORD   VirtualAddress; // 相对虚拟地址 

   DWORD   Size;           // 数据块的大小

} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

也正是概念了某块的职位和尺寸。

也正是概念了某块的任务和尺寸。

尽管PE文件中的数据是规行矩步装入内部存款和储蓄器后的页属性归类而被放在分歧的节中的,不过这几个处在各种节中的数据依据用途能够被分为导出表、导入表、财富、重定位表等数据块,那15个IMAGE_DATA_DIRECTOLX570Y结构正是用来定义三种不相同用途的数据块的(如下表所示)。IMAGE_DATA_DIRECTOPRADOY结构的概念很简单,它只是提出了某种数据块的职位和尺寸。

就算PE文件中的数据是遵纪守法装入内部存款和储蓄器后的页属性归类而被放在分裂的节中的,不过这么些地处各类节中的数据根据用途能够被分成导出表、导入表、能源、重定位表等数据块,那17个IMAGE_DATA_DIRECTOLacrosseY结构正是用来定义三种差异用途的数据块的(如下表所示)。IMAGE_DATA_DIRECTO瑞虎Y结构的定义很简短,它仅仅建议了某种数据块的地点和长短。

#define IMAGE_DIRECTORY_ENTRY_EXPORT          0   // Export Directory
#define IMAGE_DIRECTORY_ENTRY_IMPORT          1   // Import Directory
#define IMAGE_DIRECTORY_ENTRY_RESOURCE        2   // Resource Directory
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION       3   // Exception Directory
#define IMAGE_DIRECTORY_ENTRY_SECURITY        4   // Security Directory
#define IMAGE_DIRECTORY_ENTRY_BASERELOC       5   // Base Relocation Table
#define IMAGE_DIRECTORY_ENTRY_DEBUG           6   // Debug Directory
//      IMAGE_DIRECTORY_ENTRY_COPYRIGHT       7   // (X86 usage)
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE    7   // Architecture Specific Data
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR       8   // RVA of GP
#define IMAGE_DIRECTORY_ENTRY_TLS             9   // TLS Directory
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG    10   // Load Configuration Directory
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT   11   // Bound Import Directory in headers
#define IMAGE_DIRECTORY_ENTRY_IAT            12   // Import Address Table
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   13   // Delay Load Import Descriptors
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14   // COM Runtime descriptor
#define IMAGE_DIRECTORY_ENTRY_EXPORT          0   // Export Directory
#define IMAGE_DIRECTORY_ENTRY_IMPORT          1   // Import Directory
#define IMAGE_DIRECTORY_ENTRY_RESOURCE        2   // Resource Directory
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION       3   // Exception Directory
#define IMAGE_DIRECTORY_ENTRY_SECURITY        4   // Security Directory
#define IMAGE_DIRECTORY_ENTRY_BASERELOC       5   // Base Relocation Table
#define IMAGE_DIRECTORY_ENTRY_DEBUG           6   // Debug Directory
//      IMAGE_DIRECTORY_ENTRY_COPYRIGHT       7   // (X86 usage)
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE    7   // Architecture Specific Data
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR       8   // RVA of GP
#define IMAGE_DIRECTORY_ENTRY_TLS             9   // TLS Directory
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG    10   // Load Configuration Directory
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT   11   // Bound Import Directory in headers
#define IMAGE_DIRECTORY_ENTRY_IAT            12   // Import Address Table
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   13   // Delay Load Import Descriptors
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14   // COM Runtime descriptor

交付表明:

交给说明:

Offset

Offset

(PE/PE32+)

(PE/PE32+)

Size

Size

Field

Field

Description

Description

  96/112

  96/112

8

8

Export
Table

Export
Table

The export table
address and size. For more information see section 6.3, “The .edata
Section (Image Only).”

The export table
address and size. For more information see section 6.3, “The .edata
Section (Image Only).”

104/120

104/120

8

8

Import
Table

Import
Table

The import table
address and size. For more information, see section 6.4, “The .idata
Section.”

The import table
address and size. For more information, see section 6.4, “The .idata
Section.”

112/128

112/128

8

8

Resource
Table

Resource
Table

The resource table
address and size. For more information, see section 6.9, “The .rsrc
Section.”

The resource table
address and size. For more information, see section 6.9, “The .rsrc
Section.”

120/136

120/136

8

8

Exception
Table

Exception
Table

The exception table
address and size. For more information, see section 6.5, “The .pdata
Section.”

The exception table
address and size. For more information, see section 6.5, “The .pdata
Section.”

128/144

128/144

8

8

Certificate
Table

Certificate
Table

The attribute
certificate table address and size. For more information, see section
5.7, “The Attribute Certificate Table (Image Only).”

The attribute
certificate table address and size. For more information, see section
5.7, “The Attribute Certificate Table (Image Only).”

136/152

136/152

8

8

Base Relocation
Table

Base Relocation
Table

The base relocation
table address and size. For more information, see section 6.6, “The
.reloc Section (Image
Only).”

The base relocation
table address and size. For more information, see section 6.6, “The
.reloc Section (Image
Only).”

144/160

144/160

8

8

Debug

Debug

The debug data starting
address and size. For more information, see section 6.1, “The .debug
Section.”

The debug data starting
address and size. For more information, see section 6.1, “The .debug
Section.”

152/168

152/168

8

8

Architecture

Architecture

Reserved, must be
0

Reserved, must be
0

160/176

160/176

8

8

Global Ptr

Global Ptr

The RVA of the value to
be stored in the global pointer register. The size member of this
structure must be set to zero.

The RVA of the value to
be stored in the global pointer register. The size member of this
structure must be set to zero.

168/184

168/184

8

8

TLS Table

TLS Table

The thread local
storage (TLS) table address and size. For more information, see section
6.7, “The .tls Section.”

The thread local
storage (TLS) table address and size. For more information, see section
6.7, “The .tls Section.”

176/192

176/192

8

8

Load Config
Table

Load Config
Table

The load configuration
table address and size. For more information, see section 6.8, “The Load
Configuration Structure (Image Only).”

The load configuration
table address and size. For more information, see section 6.8, “The Load
Configuration Structure (Image Only).”

184/200

184/200

8

8

Bound
Import

Bound
Import

The bound import table
address and size.

The bound import table
address and size.

192/208

192/208

8

8

IAT

IAT

The import address
table address and size. For more information, see section 6.4.4, “Import
Address Table.”

The import address
table address and size. For more information, see section 6.4.4, “Import
Address Table.”

200/216

200/216

8

8

Delay Import
Descriptor

Delay Import
Descriptor

The delay import
descriptor address and size. For more information, see section 5.8,
“Delay-Load Import Tables (Image Only).”

The delay import
descriptor address and size. For more information, see section 5.8,
“Delay-Load Import Tables (Image Only).”

208/224

208/224

8

8

CLR Runtime
Header

CLR Runtime
Header

The CLR runtime header
address and size. For more information, see section 6.10, “The .cormeta
Section (Object Only).”

The CLR runtime header
address and size. For more information, see section 6.10, “The .cormeta
Section (Object Only).”

216/232

216/232

8

8

Reserved, must be
zero

Reserved, must be
zero

 

 

现实资料见:www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx
中的pecoff.docx文档

具体资料见:www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx
中的pecoff.docx文档

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图