PE文件 -- 学习笔记
-
使用SDK或Visual C++创建PE文件时,EXE默认的ImageBase为00400000,DLL默认10000000。使用DDK创建的SYS文件默认的ImageBase为10000。
-
Windows Vista之后的版本引入了ASLR安全机制,每次运行EXE文件都会被加载到随机地址,增强了系统安全性。
-
VC++中生成的PE文件的重定位节区名为.reloc,删除该节区后文件照常运行。
-
.reloc删除:
-
首先在 IMAGE_SECTION_HEADER .reloc 处查看该节区头的长度和 .reloc 节区的偏移地址,以及 Virtual Size
-
然后将 .reloc 的节区头中的值替换为0, .reloc 节区整个删除
-
删除节区后,修改 IMAGE_FILE_HEADER 中的 Number of Sections 项。
-
通过 IMAGE_OPTIONAL_HEADER - size of Image 修改映像值大小。
-
需要减去的值根据之前记录的 Virtual Size 和 IMAGE_OPTIONAL_HEADER - Section Alignment 值扩展后所得。
-
根据PE文件格式规范,IMAGE_NT_HEADERS的起始位置是“可变的”,由IMAGE_DOS_HEADER中的e_lfanew的值决定。一般拥有如下值(不同构建环境会有不同):
e_lfanew = MZ文件头大小(40) + DOS存根大小(可变:VC++下为A0) = E0
-
IMAGE_FILE_HEADER中的SizeOfOptionalHeader表示IMAGE_OPTIONAL_HEADER结构体的长度。另一层含义是确定节区头(IMAGE_SECTION_HEADER)的起始偏移。
-
从IMAGE_OPTIONAL_HEADER的起始偏移加上SizeOfOptionalHeader的值的位置开始才是IMAGE_SECTION_HEADER
-
IMAGE_OPTIONAL_HEADER在32位PE32中大小为E0,64位PE32+中的大小为F0
-
Data_Directories中Import_Table为八个字节。前四个字节为导入表的地址(RVA),后四个字节为导入表的大小(SIZE)。如下图:导入表的RVA为271EE