Windows PE文件内未用空间学习
未用空间,是指编译好的PE文件,整个可执行文件内,有一些空间是本exe没有用到的。有几种情况;
一种是未用的字段,PE格式定义了各种结构体,其中一些结构体的一些字段,是保留的,或者是赋什么值都不影响;
一种是大小不固定的数据块;还不太理解这种;
一种是操作系统对PE文件的强制对齐,为对齐而补足的0;
在未用空间插入一些构造好的代码,可以实现对程序打补丁的功能,或者制作病毒。对于打补丁来说,这就是可利用空间。
1 未用的字段
根据资料,PE文件的DOS头,除了e_magic和e_lfanew字段,有54字节的未用空间。
看一下为什么会有这54字节;
DOS头定义如下,
//大小为: 0x40(64)字节#define IMAGE_DOS_SIGNATURE 0x5A4D // MZtypedef struct _IMAGE_DOS_HEADER { // DOS .EXE headerWORD e_magic; // MZ标记 0x5a4dWORD e_cblp; // 最后(部分)页中的字节数WORD e_cp; // 文件中的全部和部分页数WORD e_crlc; // 重定位表中的指针数WORD e_cparhdr; // 头部尺寸以段落为单位WORD e_minalloc; // 所需的最小附加段WORD e_maxalloc; // 所需的最大附加段WORD e_ss; // 初始的SS值(相对偏移量)WORD e_sp; // 初始的SP值WORD e_csum; // 补码校验值WORD e_ip; // 初始的IP值WORD e_cs; // 初始的SS值WORD e_lfarlc; // 重定位表的字节偏移量WORD e_ovno; // 覆盖号WORD e_res[4]; // 保留字WORD e_oemid; // OEM标识符(相对m_oeminfo)WORD e_oeminfo; // OEM信息WORD e_res2[10]; // 保留字LONG e_lfanew; // NT头(PE标记)相对于文件的偏移地址} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
e_magic是可执行文件标记,e_lfanew字段是用来找NT头的,这两个必须有,其他都是没用到的。
拿工具观察一下,
只有Signature和Offset to Nex EXE Header是有用的;有54个字节不在意放什么;
其他还有,
标准PE头有12个字节的未用空间;
扩展PE头有 14+8+8+2+4+4 字节的未用空间;
有时间继续;