新增节

1.先判断是否有空间增加一个节表,满足sizeOfHeaders >= sectionTable[last] + 0x28*3

2.malloc(fileSize+newSectionSize);memset(0);memcpy(newfileBuffer,fileBuffer,fileSize)

3.将代码节表拷贝一份到最后一个节表后边。修改新节的文件和内存的sie&address(根据原来的最后一个节计算偏移)。

移动导出表

1.先移动函数地址表到新节->移动名称序号表->移动名称表->移动名称->移动导出表->最后修复dataDir.

void* removeExportTable(void* fileBuffer){
//获取导出表
PE pe = resolvePE(fileBuffer);
int ReTableRVA = pe.dataDir[0].value;
int ReTableFOA = VA2FA(fileBuffer, ReTableRVA);
PIMAGE_EXPORT_DIRECTORY pImage_export_Dir =(PIMAGE_EXPORT_DIRECTORY)((int)fileBuffer + ReTableFOA);
//找到函数地址表
int AddressOfFunctionsInFileBuffer = VA2FA(fileBuffer, pImage_export_Dir->AddressOfFunctions) + (int)fileBuffer;
//定义一个游标,用来记录目标地址
BYTE* cursor = (BYTE*)((int)fileBuffer + (pe.sectionTable[pe.NumberOfSections.value - 1].PointerToRawData.value));
int RVACursor;
memcpy((void*)cursor, (void*)AddressOfFunctionsInFileBuffer, pImage_export_Dir->NumberOfFunctions * 4);
//修改导出表中函数地址表的地址,这是RVA,目标地址是新增的那个节在内存中的偏移即VirtualAddress
pImage_export_Dir->AddressOfFunctions = pe.sectionTable[pe.NumberOfSections.value - 1].VirtualAddress.value;
//移动游标
cursor += pImage_export_Dir->NumberOfFunctions * 4;
//复制函数序号表
int AddressOfNameOrdinalsInFileBuffer = VA2FA(fileBuffer, pImage_export_Dir->AddressOfNameOrdinals) + (int)fileBuffer;
memcpy((void*)cursor, (void*)AddressOfNameOrdinalsInFileBuffer, pImage_export_Dir->NumberOfNames * 2);
pImage_export_Dir->AddressOfNameOrdinals = (pe.sectionTable[pe.NumberOfSections.value - 1].VirtualAddress.value) + pImage_export_Dir->NumberOfFunctions * 4;
cursor += pImage_export_Dir->NumberOfNames * 2; //移动函数名称表
int AddressOfNamesInFileBuffer = VA2FA(fileBuffer, pImage_export_Dir->AddressOfNames) + (int)fileBuffer;
memcpy((void*)cursor, (void*)AddressOfNamesInFileBuffer, pImage_export_Dir->NumberOfNames * 4);
pImage_export_Dir->AddressOfNames = (pe.sectionTable[pe.NumberOfSections.value - 1].VirtualAddress.value) + pImage_export_Dir->NumberOfFunctions * 4 + pImage_export_Dir->NumberOfNames * 2;
//记录函数名称表新的地址
int* AddressOfNamesOfNewInFileBufer = (int*)cursor;
cursor += pImage_export_Dir->NumberOfNames * 4;
//这个游标是用来记录RVA的
RVACursor = (int)(pe.sectionTable[pe.NumberOfSections.value - 1].VirtualAddress.value) + pImage_export_Dir->NumberOfFunctions * 4 + pImage_export_Dir->NumberOfNames * 2 + pImage_export_Dir->NumberOfNames * 4;
//TODO 移动函数名称并修正函数名称表中的RVA
char* tmp;
for (size_t i = 0; i < pImage_export_Dir->NumberOfNames; i++)
{
tmp = (char*)(*((int*)AddressOfNamesInFileBuffer + i));
tmp = (char*)( VA2FA(fileBuffer, (int)tmp) + (int)fileBuffer);
strcpy((char*)cursor, tmp);
AddressOfNamesOfNewInFileBufer += i; *AddressOfNamesOfNewInFileBufer = (int)RVACursor;//修改名称地址表中的RVA指向新的名称地址
RVACursor += (strlen(tmp) + 1);
cursor += (strlen(tmp)+1);
} pImage_export_Dir;
//复制导出表
memcpy(cursor, (void*)pImage_export_Dir, 40); *(int*)((int)fileBuffer + pe.dataDir[0].address) = RVACursor;
RVACursor += 40;
cursor += 40; return fileBuffer;
}

新增节&将导出表移动到新节的更多相关文章

  1. 小甲鱼PE详解之区块表(节表)和区块(节)(PE详解04)

    到此为止,小甲鱼和大家已经学了许多关于 DOS header 和 PE header 的知识.接下来就该轮到SectionTable (区块表,也成节表).(视频教程:http://fishc.com ...

  2. 无法读取配置节 system.serviceModel 因为它缺少节声明的解决方法

    无法读取配置节 system.serviceModel 因为它缺少节声明的解决方法,需要的朋友可以参考下 在Windows Server2008 R2中的IIS7中部署WCF服务时报出如题错误: HT ...

  3. 小甲鱼PE详解之区块表(节表)和区块(节)续(PE详解05)

    这一讲我们结合实例来谈谈区块表的定义以及各个属性的含义. 首先,我们先用之前学过的一点知识在二进制文件中手动翻找区块表,这样做的好处是可以使你很快的对PE结构牢记于心.学来的东西就是能用的东西,不能用 ...

  4. HTTP 错误 500.19 - Internal Server Error 无法读取配置节 system.serviceModel 因为它缺少节声明

    服务器环境:Windows Server2008 R2 Enterprise 配置 IIS 的时候报错. 错误信息: HTTP 错误 500.19 - Internal Server Error无法访 ...

  5. CorelDRAW购物节福利开奖 | “剁手节”前的攻略来了,请查收!

    距离“剁手节” 还有不到两周的时间 相信一些线上.线下.微商.电商...都拿出了看家本领进行市场混战 一场没有硝烟的战争开始啦!! …… 当然,我也不例外 你们谁都别拦着,我要打广告了 让你变成了不折 ...

  6. 031 Spring Data Elasticsearch学习笔记---重点掌握第5节高级查询和第6节聚合部分

    Elasticsearch提供的Java客户端有一些不太方便的地方: 很多地方需要拼接Json字符串,在java中拼接字符串有多恐怖你应该懂的 需要自己把对象序列化为json存储 查询到结果也需要自己 ...

  7. sparkRDD:第1节 RDD概述;第2节 创建RDD

    RDD的特点: (1)rdd是数据集: (2)rdd是编程模型:因为rdd有很多数据计算方法如map,flatMap,reduceByKey等: (3)rdd相互之间有依赖关系: (4)rdd是可以分 ...

  8. 【记录】无法读取配置节“AppSettings”,因为它缺少节声明

    Web.config对大小写敏感, 把AppSettings改为appSettings即可.

  9. 手工给程序插入 ShellCode

    PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如 ...

  10. [zz]LyX 入门教程

    http://blog.sina.com.cn/s/blog_630e5dec0100w3jl.html The LyX Tutorial by the LyX Team 1 目录 Chapter 1 ...

随机推荐

  1. 模拟VL02N交货单批次拆分

    昨天听到一个好玩的需求,自开发交货单批次拆分的界面和实现批次拆分. 批次拆分的函数就不提了,这里来说说自开发程序怎么模拟出批次拆分的那种样子.. 效果图: 1,首先定义一个交货行项目表和拆分出来的批次 ...

  2. 袋鼠云数栈UI5.0焕新升级,全新设计语言DT Design,更懂视觉更懂你!

    数栈作为袋鼠云打造的一站式数据开发与治理平台,从2016年发布第⼀个版本开始,就始终坚持着以技术为核⼼.安全为底线.提效为⽬标.中台为战略的思想,坚定不移地⾛国产化信创路线,不断推进产品功能迭代.技术 ...

  3. Blazor学习之旅(12) JavaScript与Blazor的互操作

    大家好,我是Edison. 在上一篇我们学习了Blazor+SignalR开发简单的实时应用程序,这一篇我们了解下Blazor和JavaScript的互操作性. 有了Blazor还需要JavaScri ...

  4. C# Avalonia动态加载xaml和cs实例

    扩展请参考 https://www.cnblogs.com/dalgleish/p/18972924 NonCompiledXaml.axaml代码 <Window xmlns="ht ...

  5. Java中的队列与参数传递

    Java中的队列数据结构 定义: 队列(Queue)是一种先进先出(FIFQ)的线性数据结构 基本性质: 先进先出 主要操作 2.1 入队:向队尾插入元素 2.2 出队:从队首移除元素 只允许在队首删 ...

  6. Augment入门指南

    没有ide 和 Cursor 不同,它没有做自己的开发编辑器,而是以插件的形式发布. Jetbrains.VS Code.GitHub 以及 Slack 甚至 Vim 都可以以插件的形式去使用它! 对 ...

  7. 【6】ST表学习笔记

    前言 学习ST表,主要是倍增思想,可以理解为倍增优化后的DP.写在这里,一方面方便自己以后复习,另一方面给其他人参考. UPD on 2023/3/21 :修改了格式,使格式与其他的学习笔记统一. 倍 ...

  8. Web前端入门第 77 问:JavaScript 由程序触发绑定事件的几种方式

    开发中经常会遇这样的需求:点击 A 元素的时候,需要触发 B 元素的事件,比如:点击一个 div 元素,然后触发 input:file 的 click 事件,用来选择文件上传. click 方法 以上 ...

  9. 谷云科技AI Agent搭建平台本地部署智能体步骤拆解

    在数据安全与合规性要求日益严格的当下,越来越多的企业选择将智能体AI Agent部署在本地环境中,以实现对核心数据和业务流程的完全掌控. 企业选择本地部署AI Agent通常基于三大需求: 数据主权保 ...

  10. API管理平台,可视化统一管理企业API

    API管理平台是为开发.产品.测试人员提供接口管理服务,帮助开发者更好地管理API接口,轻松实现创建.发布.维护API. 企业数字化转型为何需要用到API管理平台? 随着企业的不断发展,各类型的业务系 ...