PE学习(12) 移动重定位表到新增节

数据目录中的表是分散在各个节里的,如果对节进行加密,操作系统找不到表,就无法加载程序。因此加密前要先把表移动到新的节里。计算重定位表的大小,首先要遍历重定位表,累加SizeOfBlock然后新增一个节,大小是表的大小文件对齐。最后把表复制到新增节的开头,然后更新数据目录的VirtualAddress指向新的重定位表

总体来说本文要比上一篇移动导出表简单一些

新增节的函数已经在上一篇博客中提到

 

解析DOS头,PE头,节表,数据目录的第六个是重定位表,将RVAFOA得到文件偏移和重定位表

计算所有重定位表块的大小,以新增对应大小的节

VASizeOfBlock非零时遍历,每次增加SizeOfBlock大小

按照文件对齐进行对齐后作为新增节的大小进行新增操作(代码在前文)

修改新增节属性为可读、含已初始化数据

拿到重定位表的指针和新增节后的最后一节(新节)的起始地址(PointerToRawData

目标是将重定位表全部复制到这里

从新增节首地址开始复制重定位表的全部内容,大小为之前计算的各个块总大小

修改数据目录中重定位表的VA值为新节的起始地址

 

完整代码

 

运行结果