PE文件新增节,需要完成以下几个步骤。
1)添加一个新的节表元素(可以copy一份)
2)在新增节后面填充一个节大小的0x00(大小为40个字节,也就是说要新增节表,必须要在SizeOfHeader后面必须有80个字节的空间才能新增节,如果不够,则需要抬高PE文件头)
3)像改PE头中节的数量
4)修改SizeOfImage的大小
5)在原有数据的最后,新增一个节的数据(内存对齐的整数倍).
6)修正新增节表的属性
核心代码如下:
/*
* 添加节表
* buff 未拉伸状态的文件数据
* buffSize 未拉伸状态的文件大小
* return 新增节后的数据
*/
char* addSection(char* buff, DWORD buffSize)
{
PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)buff;
PIMAGE_NT_HEADERS ntHeader = (PIMAGE_NT_HEADERS)(buff + dosHeader->e_lfanew);
/*
* 一:将PE头和节表移到DOS头后面,防止添加不上节表
* 1.申请同样大小的内存,并初始化为0
* 2.将数据拷贝到临时内存中,并将原来的数据清空
* 3.将e_lfanew指向0x40
* 4.将数据拷贝到0x40后面
* 5.释放内存
*/
DWORD size = sizeof(ntHeader->Signature) + sizeof(ntHeader->FileHeader) + ntHeader->FileHeader.SizeOfOptionalHeader + (ntHeader->FileHeader.NumberOfSections * 0x28);
char* ntHeaderAndSectionHeaderBuf = new char[size];
memset(ntHeaderAndSectionHeaderBuf, 0x00, size);
memcpy(ntHeaderAndSectionHeaderBuf, buff + dosHeader->e_lfanew, size);
memset(buff + dosHeader->e_lfanew, 0x00, size);
dosHeader->e_lfanew = 0x40;
memcpy(buff + dosHeader->e_lfanew, ntHeaderAndSectionHeaderBuf, size);
delete[] ntHeaderAndSectionHeaderBuf;
ntHeaderAndSectionHeaderBuf = nullptr;
ntHeader = (PIMAGE_NT_HEADERS)(buff + dosHeader->e_lfanew);
/*
* 增加节表,并修复里面的参数
*/
PIMAGE_SECTION_HEADER newSectionHeader = (PIMAGE_SECTION_HEADER)(buff + dosHeader->e_lfanew + size);
PIMAGE_SECTION_HEADER preSectionHeader = newSectionHeader - 1;
// 设置节表名
newSectionHeader->Name[0] = '.';
newSectionHeader->Name[1] = 'f';
newSectionHeader->Name[2] = 'g';
newSectionHeader->Name[3] = 'c';
newSectionHeader->Name[4] = 's';
// 修复虚拟大小
newSectionHeader->Misc.VirtualSize = 0x1000;
// 修复虚拟地址
newSectionHeader->VirtualAddress = preSectionHeader->VirtualAddress + preSectionHeader->SizeOfRawData;
// 修复文件大小
newSectionHeader->SizeOfRawData = 0x1000;
// 修复文件地址
newSectionHeader->PointerToRawData = preSectionHeader->PointerToRawData + preSectionHeader->SizeOfRawData;
// 修复权限(我用的软件默认是.text这个,如果有其他情况,请自行适配)
newSectionHeader->Characteristics = (newSectionHeader - ntHeader->FileHeader.NumberOfSections)->Characteristics;
/*
* 修改SizeOfImage以及numberOfSections
*/
ntHeader->OptionalHeader.SizeOfImage += 0x1000;
ntHeader->FileHeader.NumberOfSections++;
/*
* 增加节区,我里默认增加0x1000
*/
char* newBuff = new char[buffSize + 0x1000];
memcpy(newBuff, buff, buffSize);
memset(newBuff + buffSize, 0x20, 0x1000);
delete[] buff;
buff = nullptr;
return newBuff;
}
看效果:


PE练手软件,需要的自取
链接: https://pan.baidu.com/s/1A-WqlfskJaC4RVQtD5LdEw 提取码: 198n
代码:
链接: https://pan.baidu.com/s/1P7adyWzcEt867cTDfhwKOg 提取码: mbpb