>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
今天在学习PE的过程中通过通过手动对PE文件进行节的添加,过程中遇到了一些问题,写下来以便今后及时复习
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
[1] 确定节的对齐尺寸和内存对齐尺寸,在_IMAGE_OPTIONAL_HEADER下的(DWORD)SectionAlignment和(DWORD)FileAlignment可得到对应的节和文件的对齐尺寸
SrctionAlignment -> 00 10 00 00
FileAlignment -> 00 02 00 00
[2] 查看当前PE文件的节总数,根据_IMAGE_FILE_HEADER下的(WORD)NumberOfSections可得到节的总数
NumberOfSection -> 03 00
[3] 修改节的总数+1
[4] 在最后一个节表的末尾添加新的节表
上图中.xxxx就是添加的节表,即红色部分。这里有一点得注意,添加的节的后面必须留出40个空字节,系统解析必须。如果添加节表后,后面的空字节区不足40字节时,则不能用这种方法进行添加。
现在分析我们添加的节的信息:
- [2E 78 78 78 78 00 00 00]BYTE Name[8]这8个字节对应的是节的名称,任意
- [00 02 00 00]DWORD VirtualSize 实际大小(为了方便,与新增的200字节相同)
- [00 40 00 00]DWORD VirtualAddress 节区的RVA地址(上一个节.rsrc的VirtualAddress为3000H,SizeOfRawData为400H,
相加后根据内存对齐1000即得到新加节的VirtualAddress为4000H)
- [00 02 00 00]DWORD SizeOfRawData 文件中对齐后的尺寸(添加了200个字节的空字节区,对齐后大小为200)
- [00 0C 00 00]DWORD PointerToRawData物理文件中偏移地址(上面一个.rsrc的PointerToRawData为800H,加.rsrc节的SizeOfRawData得值400H等于C00H 刚好对齐200H)
后面紧跟着得四个成员默认为00即可,最后的DWORD Characteristics为内存属性,按需修改即可
[5] 在文件的末尾填充512(即200H)字节大小的空白字节区
这里暂时没有加入shellcode,默认填充为00即可
[6] 修改ImageBase大小,注意对齐后的尺寸
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
修改完成后的,查看我们增加的节的信息如下:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
总结:
1) 上面的过程,不一定的按部就班的来,但查看对齐尺寸是首选
2) 添加新节表的时候,一定要留意后面是否还有空白的40字节大小的00区间
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
END