pe文件结构新增节
首先先了解一下节表
如下图,打开一个exe文件,我们可以看到有多个节表。
为什么要有这么多节表呢?每个节表都有自己的任务与功能,所以我们可以手动添加一个节来实现我们自己想实现的功能。
然后我们在了解一下节表的主要成员:
typedef struct _IMAGE_SECTION_HEADER { |
重点了解以下成员
Name[IMAGE_SIZEOF_SHORT_NAME]:我们可以随便起一个自己喜欢的名字 VirtualSize:是在内存中的真实大小
VirtualAddress:是加载到内存中第一个字节的偏移地址 SizeOfRawData:该节在文件对齐后的大小
了解过节表以后,我们再来整理一下操作步骤。
[TOC]
1.判断是否有空间新增一个节。
使用工具打开一个exe文件,我们只需要40个字节,所以空间足够
2.在节表的最后一个成员后新增一个成员。
添加的新成员我们可以选择直接复制text节表,因为text作为代码段,可读可写可执行,非常完美。如下图,我们已经添加好了数据。
3.修改节的数量。
标准pe头中有一个字段为 NumberOfSections,该字段控制文件中节的数量
,所以我们讲该字段的值加一,如下图,原来为08,我们修改为09
4.修改sizeOfImage的大小
修改前:
可选头中:SizeofImage :000AC000
我们新增了0x1000节数据大小.那么我们的镜像大小也要加0x1000大小进行映射.注意.要按照内存对齐。
我们的原镜像大小以及按照内存对齐的方式存放了. 就是0xAC000. 那么我们加了0x1000的数据就是 0x1E000大小.我们修改为0xAD000。
5.再原有数据的最后,新增一个节的数据(内存对齐的整数倍)
插入了0x1000字节,填充为0
6.添加新增节表的属性
想要添加一个节表,首先我们需要为这个节表指明内存中开始展开的位置,文件中展开的位置,以及节表的大小。
这三个属性的字段分别是VirtualAddress、PointerToRawData、SizeOfRawData。然后我们在pe中把他们找出来并修改。
例如上一个节表对齐后的展开位置为 0xAc000 那么我们就修改为 0xAd000
修改前:
修改后:
节.sizeofRawData修改
这个成员就是节数据按照文件对齐后的大小.取决于我们给这个节添加多少数据,这里我们之前添加了0x1000个字节。
这里修改为1000
节.PointerRawToData 文件偏移修改
最后修改的就是节在文件中哪里展开的. 这个我们需要看上一个节的文件偏移.以及节数据大小. 算出来的.
例如:
新增节的上一个节,偏移位置为1000,节数据在文件中对齐后的尺寸为100,那么1000-1100都是上一个节的数据
.tttt上一个节在文件中的偏移为8200,大小为600;
那么tttt节的文件偏移就为8800
节.VirtualSize修改
申请的新节空间大小,1000
节.PointerRawToData 文件偏移修改
我们新增节一般都是要求可读可写可执行的,所以这里直接修改为60000020。
实验结果:
新增节后的文件正常执行
部分内容转载于:https://blog.csdn.net/weixin_43742894/article/details/115376779