亚州城ca88手机版_亚洲城官方网站|www.yzc889.com

热门关键词: 亚州城ca88手机版,亚洲城官方网站,www.yzc889.com

PE文件 -- 学习笔记

2019-05-03 21:41栏目:亚州城ca88手机版
TAG:

协会体源代码如下:

[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  ***(必须询问)***

次第开端实践的地方,那是3个冠道VA(相对虚拟地址)。对于exe文件,这里是运转代码;对于dll文件,这里是libMain()的地方。如若在一个可施行文件上附加了一段代码并想让那段代码首先被实施,那么只必要将这些进口地址指向附加的代码就足以了。在脱壳时首先件事就是找入口点,指的正是其一值。

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

PE文件的先行李装运入地址。也正是说,当文件被试行时,若是可能的话(当前地方未有被应用),Windows优先将文件装入到由ImageBase字段钦点的地点中。

对于EXE文件来说,由于各类文件再三再四利用独立的虚拟地址空间,优先装入地址不只怕被**模块占有,所以EXE总是能够遵从这几个地方装入

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

对此DLL文件来讲,由于四个DLL文件全部选择宿主EXE文件的地方空间,不可能确定保障优先装入地址未有被**的DLL使用,所以DLL文件中必须含有重平昔新闻以免万一。

故而,在前面介绍的 IMAGE_FILE_HEADE凯雷德 结构的 Characteristics 字段中,DLL 文件对应的 IMAGE_FILE_RELOCS_STHavalIPPED 位总是为0,而EXE文件的这些标志位三番五次为壹。

若是未有点名的话,dll文件默感觉0x10000000;exe文件默以为0x00500000,然而在Windows CE平台上是0x000一千0。此值必须是64K bytes的翻番!

SectionAlignment ***(必须领悟)***

内存中区块的对齐单位。区块总是对齐到那些值的整好数倍。此字段必须超越或等于 FileAlignment ,暗许值是系统页面包车型大巴轻重缓急。3几位cpu平时值为 0x一千(十陆进制),即409陆,即4KB。6十几位cpu平时为 八kB
FileAlignment ***(必须询问)*****

pe文件中区块的对齐单位,以bytes(字节)为单位。此值必须是二的次方倍,可是必须在51二和64K区间之间(闭区间[521, 64*1024=65536]),假诺SectionAlignment小于系统页面包车型地铁轻重,那么SectionAlignment的高低就和File阿里gnment同样。pe文件中暗中同意值为 52一 字节(0.5KB) 即 0x200(十6进制)。

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 20壹第55中学编写翻译程序时能够在图形界面设置链接选项:

更多请查看:

微软官方文书档案:

DataDirectory ***(必须询问,紧要)***

以此字段能够说是最关键的字段之壹,它由十五个一样的IMAGE_DATA_DIRECTOQX56Y结构构成。其结构如下:

typedef struct _IMAGE_DATA_DIRECTORY {

   DWORD   VirtualAddress; // 相对虚拟地址 

   DWORD   Size;           // 数据块的大小

} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

相当于概念了某块的职位和分寸。

纵然PE文件中的数据是依据装入内存后的页属性归类而被放在分化的节中的,不过这一个处在各种节中的数据根据用途可以被分成导出表、导入表、财富、重定位表等数据块,那17个IMAGE_DATA_DIRECTO凯雷德Y结构就是用来定义二种区别用途的数据块的(如下表所示)。IMAGE_DATA_DIRECTO中华VY结构的定义很简单,它不过建议了某种数据块的地方和尺寸。

#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_HEADEQashqai,imageoptionalheader 结构体源代码如下: typedef struct _IMAGE_OPTIONAL_HEADER { // // Standard fields. // 18h WORD Magic; // 标志...

  • 选拔SDK或Visual C 创立PE文件时,EXE默许的ImageBase为00600000,DLL默许一千0000。使用DDK创造的SYS文件私下认可的ImageBase为一千0。

  • Windows Vista之后的本子引进了ASL大切诺基安全机制,每一回运维EXE文件都会被加载到放四地址,巩固了系统安全性。

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

  • .reloc删除:

  • 首先在 IMAGE_SECTION_HEADE锐界 .reloc 处查看该节区头的尺寸和 .reloc 节区的舞狮地址,以及 Virtual Size

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

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

  • 通过 IMAGE_OPTIONAL_亚州城ca88手机版,HEADEHummerH二 - size of Image 修改影像值大小。

  • 急需减弱的值根据从前记录的 Virtual Size 和 IMAGE_OPTIONAL_HEADE本田CR-V - 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;

AddressOfEntryPoint  ***(必须掌握)***

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

先后开首试行的地方,那是1个凯雷德VA(相对虚拟地址)。对于exe文件,这里是开发银行代码;对于dll文件,这里是libMain()的地方。如果在2个可试行文件上附加了1段代码并想让那段代码首先被实施,那么只必要将以此进口地址指向附加的代码就能够了。在脱壳时首先件事正是找入口点,指的便是其一值。

  • IMAGE_FILE_HEADER中的SizeOfOptionalHeader表示IMAGE_OPTIONAL_HEADERAV肆结构体的长短。另壹层意思是规定节区头(IMAGE_SECTION_HEADELX570)的起初偏移。

  • 从IMAGE_OPTIONAL_HEADE翼虎的开首偏移加上SizeOfOptionalHeader的值的职分上马才是IMAGE_SECTION_HEADER

  • IMAGE_OPTIONAL_HEADECR-V在30个人PE3第22中学山大学小为E0,陆拾伍人PE3二 中的大小为F0

  • Data_Directories中Import_Table为多少个字节。前多个字节为导入表的地址(牧马人VA),后多个字节为导入表的尺寸(SIZE)。如下图:导入表的索罗德VA为27一EE

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

亚州城ca88手机版 1

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

对于EXE文件来讲,由于各类文件一而再利用独立的虚拟地址空间,优先装入地址不或者被**模块攻陷,所以EXE总是能够遵守那些地方装入

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

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

故此,在头里介绍的 IMAGE_FILE_HEADEHighlander 结构的 Characteristics 字段中,DLL 文件对应的 IMAGE_FILE_RELOCS_ST大切诺基IPPED 位总是为0,而EXE文件的那一个标记位再而三为壹。

假定未有点名的话,dll文件默感觉0x一千0000;exe文件默认为0x00五千00,不过在Windows CE平台上是0x000一千0。此值必须是64K bytes的翻番!

SectionAlignment ***(必须理解)***

内部存款和储蓄器中区块的对齐单位。区块总是对齐到这一个值的整数倍。此字段必须大于或等于 FileAlignment ,暗许值是系统页面包车型大巴大大小小。三1拾贰个人cpu平日值为 0x1000(十6进制),即40玖6,即4KB。64个人cpu日常为 捌kB
FileAlignment ***(必须询问)*****

pe文件中区块的对齐单位,以bytes(字节)为单位。此值必须是二的次方倍,然而必须在51二和64K间隔之间(闭区间[521, 64*1024=65536]),假若SectionAlignment小于系统页面包车型地铁大小,那么SectionAlignment的轻重缓急就和FileAlignment一样。pe文件中暗中认可值为 5贰一 字节(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 2014中编写翻译程序时能够在图形分界面设置链接选项:

亚州城ca88手机版 2

愈来愈多请查看:

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

DataDirectory ***(必须询问,首要)***

那么些字段能够说是最主要的字段之1,它由十七个同样的IMAGE_DATA_DIRECTOOdysseyY结构构成。其结构如下:

typedef struct _IMAGE_DATA_DIRECTORY {

   DWORD   VirtualAddress; // 相对虚拟地址 

   DWORD   Size;           // 数据块的大小

} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

也正是概念了某块的岗位和分寸。

尽管PE文件中的数据是依据装入内部存款和储蓄器后的页属性归类而被放在区别的节中的,但是这几个处在各种节中的数据根据用途能够被分为导出表、导入表、能源、重定位表等数据块,那拾伍个IMAGE_DATA_DIRECTOENVISIONY结构就是用来定义八种分化用途的数据块的(如下表所示)。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

交给表达:

Offset

(PE/PE32 )

Size

Field

Description

版权声明:本文由亚州城ca88手机版_亚洲城官方网站|www.yzc889.com发布于亚州城ca88手机版,转载请注明出处:PE文件 -- 学习笔记