P45新增节
Posted cspecialr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P45新增节相关的知识,希望对你有一定的参考价值。
新增节:
1、判断是否有足够的空间,可以添加一个节表.
判断条件:
SizeOfHeader - (DOS + 垃圾数据 + PE标记 + 标准PE头 + 可选PE头 + 已存在节表) >= 2个节表的大小
2、需要修改的数据
1) 添加一个新的节(可以copy一份)
2) 在新增节后面 填充一个节大小的000
3) 修改PE头中节的数量
4) 修改sizeOfImage的大小
5) 再原有数据的最后,新增一个节的数据(内存对齐的整数倍).
6)修正新增节表的属性
我们怎么修改新的节表的属性
1)VirtualSize的修正:跟内存对齐相等即可,内存对齐的倍数就行
2)VirtualAddress的修正:看上一个节表的属性,如果文件对齐和内存对齐相等,就等于上一个节的VirtualAdress+RawSize,如果文件和内存对齐不相等,就等于上一个节的VirtualAdress+RawSize(内存对齐后的大小)
3)SizeOfRaw的修正:和VirtualSize一样即可
4)PointToRawData的修正:上一个节的PointToRawData+SizeOfRaw
PE 新增一个节区细节
pe 文件中新增一个节区的细节
主要是Misc.VirtualSize
为添加的实际大小,非内存对齐后的大小。
LPVOID addSection(LPVOID fileBuffer, PTCHAR sectionName, size_t sectionCodeSize)
if (strlen(sectionName) >= 8)
cout << "sectionName size < 8" << endl;
return nullptr;
auto ntHeader = getNtHeader(fileBuffer);
size_t fileAlign = ntHeader->OptionalHeader.FileAlignment;
size_t fileSize = peSize(fileBuffer);
size_t outFileSize = fileSize + align(sectionCodeSize, fileAlign);
auto newFileBuffer = malloc(outFileSize);
memset(newFileBuffer, 0, outFileSize);
memcpy(newFileBuffer, fileBuffer, fileSize);
free(fileBuffer);
auto newFileNtHeader = getNtHeader(newFileBuffer);
auto newOptionHeader = &newFileNtHeader->OptionalHeader;
auto newFileSectionHeader =
(PIMAGE_SECTION_HEADER) ((PTCHAR) newOptionHeader +
sizeof(*newOptionHeader));
if ((newFileSectionHeader->PointerToRawData -
(DWORD) (newFileSectionHeader + newFileNtHeader->FileHeader.NumberOfSections)) < 0x50)
cout << "table space not enought" << endl;
return nullptr;
size_t sectionAlign = newFileNtHeader->OptionalHeader.SectionAlignment;
auto newFileLatestSectionHeader =
(PIMAGE_SECTION_HEADER) (newFileSectionHeader + (newFileNtHeader->FileHeader.NumberOfSections - 1));
auto addSectionHeader = newFileLatestSectionHeader + 1;
//最多为8个字节
memcpy(addSectionHeader->Name, (LPVOID)".import", 8);
//Misc.VirtualSize 为新增字节的真实长度,非内存对齐后的长度
addSectionHeader->Misc.VirtualSize = sectionCodeSize;
cout << sectionCodeSize << endl;
addSectionHeader->VirtualAddress = align(
newFileLatestSectionHeader->VirtualAddress + newFileLatestSectionHeader->Misc.VirtualSize,
sectionAlign);
addSectionHeader->SizeOfRawData = align(sectionCodeSize, fileAlign);
addSectionHeader->PointerToRawData =
newFileLatestSectionHeader->PointerToRawData + newFileLatestSectionHeader->SizeOfRawData;
addSectionHeader->Characteristics = IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE;
newFileNtHeader->FileHeader.NumberOfSections += 1;
newFileNtHeader->OptionalHeader.SizeOfImage += align(sectionCodeSize, sectionAlign);
newFileNtHeader->OptionalHeader.SizeOfHeaders += sizeof(*addSectionHeader);
return newFileBuffer;
以上是关于P45新增节的主要内容,如果未能解决你的问题,请参考以下文章