6.PE文件新增节

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

相关推荐
2601_962364971 小时前
企业 PC 安全升级,Windows Hello 商用生物识别模组介绍
windows·安全
2501_916007473 小时前
Windows OpenSSL 生成 iOS 证书,制作 p12 与描述文件,KXBuild 签名实操
windows·vscode·ios·objective-c·个人开发·swift·敏捷流程
椒颜皮皮虾྅5 小时前
模型部署不再卡在环境上:DeploySharp 四大推理引擎与 Windows/Linux 离线交付实战
linux·运维·开发语言·人工智能·windows·计算机视觉·cuda
昂好的day6 小时前
C# 同步异步与多线程:Thread / Task / 线程池一次讲透(上篇)
开发语言·windows·c#
垆边人似月.6 小时前
Ubuntu 配置 Samba 共享文件夹并映射到 Windows 完整指南
linux·windows·ubuntu
BIBI204917 小时前
换 Git 托管平台怎么做?基于 TortoiseGit 的跨平台迁移教程
windows·git·tortoisegit·问题解决·版本控制·最佳实践
chushiyunen18 小时前
autoHotKey、windows自动化快捷键工具
运维·windows·自动化
燃烧的枫19 小时前
Windows 下 YOLO11 Det 的 TensorRT C++ 部署
pytorch·windows·tensorrt·关键点识别·yolo11
猪八宅百炼成仙20 小时前
让 AI 帮你清理电脑而不翻车:一个 Windows 体检调优 Skill 的工程化设计
人工智能·windows
鱼宵21 小时前
取集合第一个元素,Java 为什么要写三种写法?
java·windows·python·java21