那么只需要将这个入口地址指向附加的代码就可

作者: 操作系统  发布:2019-10-01

结构体源代码如下:

[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文件默以为0x00600000,不过在Windows CE平台上是0x00010000。此值必得是64K bytes的翻番!

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

内部存款和储蓄器中区块的对齐单位。区块总是对齐到这么些值的整好数倍。此字段必得高出或等于 FileAlignment ,默许值是系统页面包车型客车轻重。三十三个人cpu经常值为 0x1000(十六进制),即4096,即4KB。六十二位cpu平常为 8kB
FileAlignment ***(必得询问)*****

pe文件中区块的对齐单位,以bytes(字节)为单位。此值必需是2的次方倍,可是必需在512和64K间隔之间(闭区间[521, 64*1024=65536]),假若SectionAlignment小于系统页面包车型大巴大小,那么SectionAlignment的轻重缓急就和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_DIRECTOEnclaveY结构构成。其协会如下:

typedef struct _IMAGE_DATA_DIRECTORY {

   DWORD   VirtualAddress; // 相对虚拟地址 

   DWORD   Size;           // 数据块的大小

} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

也正是概念了某块的职责和分寸。

虽说PE文件中的数据是遵循装入内部存储器后的页属性归类而被放在差异的节中的,不过那个地处种种节中的数据依照用途能够被分为导出表、导入表、能源、重定位表等数据块,那拾柒个IMAGE_DATA_DIRECTO奔驰M级Y结构就是用来定义多样不相同用途的数据块的(如下表所示)。IMAGE_DATA_DIRECTOLANDY结构的概念很简短,它只有提出了某种数据块的地方和长短。

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

  • 应用SDK或Visual C++创制PE文件时,EXE暗中同意的ImageBase为00五千00,DLL暗许一千0000。使用DDK成立的SYS文件暗许的ImageBase为10000。

  • Windows Vista之后的版本引进了ASL奥迪Q5安全部制,每趟运转EXE文件都会被加载到自由地址,加强了系统安全性。

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

  • .reloc删除:

  • 首先在 IMAGE_SECTION_HEADE途乐 .reloc 处查看该节区头的尺寸和 .reloc 节区的撼动地址,以及 Virtual Size

  • 然后将 .reloc 的节区头中的值替换为0, .reloc 节区整个删除

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

  • 通过 IMAGE_OPTIONAL_HEADEWrangler - size of Image 修改影象值大小。

  • 亟需减弱的值依照从前记录的 Virtual Size 和 IMAGE_OPTIONAL_HEADEOdyssey - Section Alignment 值扩充后所得。

  • 根据PE文件格式标准,IMAGE_NT_HEADEEnclaveS的开头地点是“可变的”,由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

次第开首实行的地址,那是四个凯雷德VA(相对虚构地址)。对于exe文件,这里是运行代码;对于dll文件,这里是libMain()的地点。如果在二个可推行文件上附加了一段代码并想让这段代码首先被推行,那么只需求将那个进口地址指向附加的代码就足以了。在脱壳时首先件事正是找入口点,指的正是以此值。

  • IMAGE_FILE_HEADER中的SizeOfOptionalHeader表示IMAGE_OPTIONAL_HEADE哈弗结构体的长短。另一层意思是规定节区头(IMAGE_SECTION_HEADEKuga)的起先偏移。

  • 从IMAGE_OPTIONAL_HEADE卡宴的伊始偏移加上SizeOfOptionalHeader的值的职责上马才是IMAGE_SECTION_HEADER

  • IMAGE_OPTIONAL_HEADE哈弗在31人PE3第22中学山大学小为E0,六十一人PE32+中的大小为F0

  • Data_Directories中Import_Table为八个字节。前八个字节为导入表的地点(奥德赛VA),后几个字节为导入表的深浅(SIZE)。如下图:导入表的HighlanderVA为271EE

ImageBase  ***(必得询问)***

9159金沙官网 1

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平台上是0x00010000。此值必需是64K bytes的翻番!

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

内部存储器中区块的对齐单位。区块总是对齐到这么些值的卡尺头倍。此字段必需大于或等于 FileAlignment ,默许值是系统页面的分寸。三12个人cpu经常值为 0x一千(十六进制),即4096,即4KB。60个人cpu经常为 8kB
FileAlignment ***(必得精晓)*****

pe文件中区块的对齐单位,以bytes(字节)为单位。此值必需是2的次方倍,不过必需在512和64K距离之间(闭区间[521, 64*1024=65536]),假如SectionAlignment小于系统页面包车型大巴高低,那么SectionAlignment的高低就和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 二零一四中编写翻译程序时得以在图形界面设置链接选项:

9159金沙官网 2

更加多请查看:

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

DataDirectory ***(必得询问,主要)***

其一字段能够说是最关键的字段之一,它由14个一律的IMAGE_DATA_DIRECTOLacrosseY结构组成。其组织如下:

typedef struct _IMAGE_DATA_DIRECTORY {

   DWORD   VirtualAddress; // 相对虚拟地址 

   DWORD   Size;           // 数据块的大小

} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

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

尽管PE文件中的数据是安份守己装入内部存款和储蓄器后的页属性归类而被放在不一致的节中的,然而那个处在种种节中的数据依照用途能够被分为导出表、导入表、财富、重定位表等数据块,那16个IMAGE_DATA_DIRECTOENCOREY结构正是用来定义二种分裂用途的数据块的(如下表所示)。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

  96/112

8

Export Table

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

104/120

8

Import Table

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

112/128

8

Resource Table

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

120/136

8

Exception Table

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

128/144

8

Certificate Table

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

136/152

8

Base Relocation Table

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

144/160

8

Debug

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

152/168

8

Architecture

Reserved, must be 0

160/176

8

9159金沙官网 ,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.

168/184

8

TLS Table

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

176/192

8

Load Config Table

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

184/200

8

Bound Import

The bound import table address and size.

192/208

8

IAT

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

200/216

8

Delay Import Descriptor

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

208/224

8

CLR Runtime Header

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

216/232

8

Reserved, must be zero

 

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

本文由9159.com发布于操作系统,转载请注明出处:那么只需要将这个入口地址指向附加的代码就可

关键词: