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

你可能感兴趣的:(PE文件 -- 学习笔记)