PE学习(5) 扩大最后一节

扩大节一般选择最后一节,因为拓展中间的节可能会覆盖有用的内存

本文使用的是海哥的思路:

实际上可以不进行拉伸,直接在FileBuffer层面进行操作

不过本文的思路和代码都采用了海哥的视频

 

准备工作

处理PE头和NT头部分代码同上文

拿到最后一节各个字段的指针,用于修改设置新属性

海哥举例使用的扩大0x1000字节,这个数不能直观地看到对齐信息,所以我选0x1234

保存一份原来的对其前节大小OldVirtualSize然后设置节对齐前大小增加0x1234

 

对齐计算

先来整一个对齐函数:如果除尽认为对齐,有余数则做一些简单的计算来对齐

首先计算文件中的对齐,由于VirtualSize增加了0x1234字节,对应的SizeOfRawData至少会增加0x1234字节,由于增加这样一个不寻常的值,所以无法对齐,需要利用上述的函数通过FileAlignment对齐

内存对齐需要修改的是SizeOfImage属性,参考开头的图片,该属性表示了整个ImageBuffer的大小。先保存一份旧SizeOfImage后续使用,计算出新的最后一节的对齐大小NewLastSize(将目前的VirtualSize按照SectionAlignment对齐)之后根据原始VirtualAddress偏移加新对齐大小,得到总大小SizeOfImage

NOTEPAD.EXE最后一节扩大后,输出如图,符合预期(文件对齐200内存对齐1000)

接下来的思路是拉伸FileIBuffer得到一个扩大后的ImageBuffer然后调用之前写的缩小函数,将这个拉伸后的ImageBuffer再次缩小为FileBuffer后保存

按照NewImageSize分配内存,初始化为0后复制头部不变的信息

 

内存清理

创建一个临时指针pTempSectionHeader用于遍历复制所有节,其中遇到最后一节时,记录对齐前VirtualSize处的偏移,后续清理内存使用该偏移

LastOff减去0x1234字节得到最初的VirtualSize处偏移,意味着从该处往后是内存对齐数据,这部分数据可以进行清理初始化,设置为0供后续使用,具体应该设置新旧SizeOfImage之差的数量

使用二进制编辑器打开文件,观察到末尾都是0,成功清理

 

代码

整个函数的代码如下