当前位置: 首页 > news >正文

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;
}

看效果:

练手软件及代码,需要的自取:

百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/s/1bpFzbCPZQ86_J0PzwN_YfA

提取码:st6t


http://www.mrgr.cn/news/94539.html

相关文章:

  • 【算法】动态规划
  • 扩散模型:AIGC领域的核心引擎,解锁图像生成新维度
  • 【2025最新】深度学习框架PyTorch——从入门到精通(1)下载与安装
  • spring 创建单例 Bean 源码分析
  • k8s集群-kubeadm init
  • 压敏电阻结构特点及选型指南
  • 【图论】并查集的学习和使用
  • 卫语句优化多层if else嵌套
  • 计算机视觉cv2入门之边缘检测
  • Python Matplotlib面试题精选及参考答案
  • Python精进系列:隐藏能力之魔术方法
  • 315周六复盘(118)本周回顾
  • 入门基础项目-前端Vue_02
  • UE4-UE5虚幻引擎,前置学习一--Console日志输出经常崩溃,有什么好的解决办法
  • MySQL开发陷阱与最佳实践:第1章:MySQL开发基础概述-1.2 MySQL开发环境搭建
  • 链表·简单归并
  • 【技术支持】记一次mac电脑换行符差异问题
  • 精通游戏测试笔记(持续更新)
  • 【云原生技术】容器技术的发展史
  • 高频面试题(含笔试高频算法整理)基本总结回顾48