PE3-19 新增节-添加代码
新增节-添加代码
新增节需要满足的条件:
确保新增节后,节表区域仍有剩余空间以容纳一个节表。计算公式如下:
1 | SizeOfHeader - DOS文件头 - 可选PE头 - 节表数量 * 0x28 > 80 |
**解释:**新增节后需留出一个节表的空间(遵循Windows规则)。若不遵守规则,可能导致程序异常。
修改的内容与步骤:
- 添加新的节表
- 在现有节表末尾新增一个节,可以直接复制已有节表数据进行初始化。
- 填充新增节后的空间
- 在新增节后,填充一个节大小的
0x00
,确保数据完整。
- 在新增节后,填充一个节大小的
- 修改PE头中的节表数量
- 找到PE头中的
NumberOfSections
字段,增加1,更新节表数量。
- 找到PE头中的
- 更新
SizeOfImage
字段- 修改PE头中的
SizeOfImage
字段,增加内存对齐后的新增节大小。
- 修改PE头中的
- 在文件末尾新增节数据
- 在原有数据末尾,添加一个内存对齐后的新增节数据区域。
- 修正新增节的属性
- 确保新增节的属性字段设置正确(如只读、可执行等)。根据需要调整其
Characteristics
字段。
- 确保新增节的属性字段设置正确(如只读、可执行等)。根据需要调整其
- 填充新增节数据
- 在新增节区域内写入有效数据,避免数据为空导致程序运行失败。
当节表区空间不足时的处理方法:
- 方法:前移NT头
- 将NT头整体前移
0x20
个字节,覆盖DOS头后面的字符串部分,为节表区腾出额外空间。
- 将NT头整体前移
- 注意事项:
- 确保调整后,PE结构完整且头部的偏移量正确。
- 修改后及时校验文件是否能够正常运行。
Exercise
添加新的节表
找到节表所在位置和一共有几个表,由图中可知有四个表
由图可得红色区域到第一个节表开始都是空白区
复制40个字节即第一个节表到空白区,创建新的节表
把节的数量改成5
假设新增大小为1000字节的节表,找到sizeofimage加上1000
在文件结尾插入1000h大小的字节
大小增大为20D000h
可以根据前一个节表的值来填新节表的信息
Name即节表的名字。可以随便改但不要超过限制大小;Virtual Size即内存中的大小(对齐前的长度),这里直接填1000即可;Virtual Offset即内存中的偏移(Virtual Address),根据前一个节表的信息可知这里应填0003E000+001CE000=0020C000;Raw Size即文件中大小(对齐后的长度),这里和Virtual Size填一样即可(1000),因为这个文件对齐前后没有拉伸;同理Raw Offset即文件中偏移,和Virtual Offset填一样即可(0020C000);Characteristics即块属性(标志),看需要填写,这里保持和第一个节表相同即可(可读)
保存后重新打开可以正常运行,说明修改成功
用PE Tools打开可以看到已经成功添加节表
若剩余空间不够,前移NT头增加剩余空间
通过查看e_lfanew的值可以找到NT头的起始地址,而e_lfanew和NT头之间即为垃圾数据,将NT头前移覆盖这些垃圾数据即可增加剩余空间(注意要复制整个NT头)
复制后修改e_lfanew的值为新的NT头的起始地址,即下一行
将NT头后面的数据都清0,之后可以在这些多出来的空间新增节表
保存后重新打开可以正常运行,说明修改成功
用PE Tools打开可以看到PE Address即e_lfanew的值已成功修改
Work
示例代码
1 |
|