PE文件(六)新增节-添加代码

本节的目的是在所有节的空白区都不够存放我们要添加的代码时,教会我们新增一个足够大的节来添加代码

添加节

一.判断是否有足够的空间可以添加一个节表:新增节需要新增一个节表来记录此节信息

判断方法:SizeOfHeader - (DOS + 垃圾数据 + PE标记 + 标准PE头 + 可选PE头 + 已存在节表) >= 2个节表的大小(80个字节大小)

注意:windows会根据一个结构体后面是否有至少一个同结构体大小以上的0x00来判断这个结构体是否结束,所以最后一个节表后面通常需要填补同节表宽度的0以防系统误判

二.当满足添加节表的条件时,我们可以将已有的一个节表的40字节信息复制一份紧挨着最后一个节表的末尾(节表与节表之间时连续的),然后再定义之后的40字节都是0,之后再根据新增节的信息,去修改对应节表的字段值

三.修改数据:

1.修改PE头中NumberOfSections字段(节的数量)为我们添加节以后节的总数

2.修改SizeOfImage的大小:原有值 + 新增节的大小(注意内存对齐)

3.修正新增节表的属性:

Name:按照ASCII码自定义名字,最好长度限制在8字节内

Misc.VirtualSize:内存起始偏移地址,我们通过上一个节表的VirtualAddress + VirtualSize的值再进行内存对齐后得到上一个节的结尾位置,作为新增节的内存起始偏移地址。但我们在实际操作中选择VirtualSize和SizeOfRawData中大者取值

举例:

我们有时候发现文件内存中未对齐的大小确实比文件中对齐的大小大,这是由于节中包含初始化数据的缘故。比如notepad.exe文件的第二个节.data中,内存中未对齐的大小为0x1BA8,文件中对齐后的大小为0x600。因此我们可以发现,第三个节在文件起始中应该按照上一个节在文件中对齐后的大小往后接着存放,即0x7200 + 0x600 = 0x7800,所以第三个节的PointerToRawData为0x7800。而第三个节在内存起始中应该按照上一个节在内存中对齐后的大小往后接着存放而不是再按照上一个节的文件中对齐大小挨着存放了,这是因为此时VirtualSize比SizeOfRawData大,即0x8000 + 0x1BA8 = 0x9BA8,对齐后为0xA000,因此第三个节内存偏移为0xA000

SizeOfRawData:根据文件对齐粒度来修正这个值。如果上面设定了VirtualSize的值为0x1000,说明这个节的这0x1000字节都是有用数据,那么此节在硬盘上时也应该有这0x1000字节的数据,此时需要根据文件对齐粒度来修正这个值。如果为0x200或者0x1000,就不用修改0x1000,因为已经满足是文件对齐的整数倍了

PointerToRawData:文件对齐后的文件地址,我们可以通过上一个节表的PointerToRawData + SizeOfRawData计算得到此值

Characteristics:按照我们想要的属性来修改即可(可读、可写、可执行等)

如图所示:

注意:修改SizeOfHeaders的值代价很高,所以不能随便改变。因为如果这个值变大或变小了,后面的节都要跟着往后或者往前跟着改变,其中的数据地址也会随之改变,比如这些节当中涉及到相关计算地址的数值就需要重新计算了。其他诸多类似的修改都是一个繁琐的过程,会加重我们的工作量。比如说我们上节课作业中E8和E9后面的值,是通过其他的地址计算出来的。如果SizeOfHeaders改变了,节地址也会随之改变,因此这些值也要改变。

特殊情况

当节表后面有编译器添加的数据:

在众多程序中,有一些程序会在节表到节的空白区之间添加一些信息,这些信息是否有用我们尚且未知,所以我们不可轻易修改这些信息。但是我们要添加的新节表一定要与原来的节表连续紧挨着,所以在这种情况下如果我们要添加新节表就需要使用另一种办法:已知程序的DOS头到PE签名之间有一处区域叫做DOS Stub。该区域存储的是程序的一些说明信息相关的数据,这些数据不会影响程序的运行,并且对我们来说是垃圾数据,所以我们可以将NT头到节表末尾这一部分整体上移,把Dos Stub这块数据覆盖了,但原来节表末尾的数据不进行修改。这时我们修改DOS头中的e_lfanew字段的值为上移后PE签名的地址。此时节表末尾和原节表末尾的信息之间就会空出来一部分,我们将这部分全部修改成0x00后,就可以往这片区域新增节表了

当整体上移后空白出来的空间还不够新增节表的大小时,我们可以采用扩大最后一个节的方式,将添加的代码加到最后一个节扩大的空间中,由于内存对齐的原因,我们会有很大一部分的空间供我们去添加代码。这样可以保证不影响上面的所有地址

注意事项:

文件加载到内存中,最后一个节的VirtualAddress + VirtualSize对齐后的结尾一定就是一个文件在内存中的结束位置,即SizeOfImage。文件在硬盘上时,最后一个节的PointerToRawData + SizeOfRawData的值一定就是整个文件的结尾。

所以不管是往节的空白区中添加代码还是新增节、扩大节,使用编程来实现功能时,应该在ImageBuffer中操作更方便,即拉伸以后的情况下操作,这样不管是一些值的计算还是位置的选择上都要更方便一些

注意:如果在内存中,要注意节与节之间的排列是根据VirtualAddress和VirtualSize以及内存对齐进行判断。如果在硬盘上,节与节之间的排列,是根据PointerToRawData和SizeOfRawData以及文件对齐来判断

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/839834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java常见算法

这里写目录标题 1.二分查询法2.冒泡排序算法3.快速查询算法 1.二分查询法 要求待查询的序列是有序数列, 每个取中间位置的值与目标值进行比较 如果目标值 > 中间位置, 目标值在右部分, 起始索引更新为mid 1如果目标值 中间位置, 则直接返回如果目标值 < 中间位置, 目…

全网最全爬取-b站爬取弹幕+评论之js逆向与xml降本增效

&#x1f31f; ❤️ 作者&#xff1a;yueji0j1anke 首发于公号&#xff1a;剑客古月的安全屋 字数&#xff1a;801 阅读时间: 10min 声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及…

【C语言深度解剖】(14):结构体内存对齐(详细配图讲解)

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多C语言深度解剖点击专栏链接查看&…

只有题目和摘要,能匹配到适合发发表的期刊吗

美国时间5月20日更新的Journal List中&#xff0c;SCIE期刊数据库剔除(Dropped)或停止检索(Ceased)了这2本期刊&#xff01;我们整理了期刊的详细信息供大家参考&#xff01; 01《EUROPEAN REVIEW FOR MEDICAL AND PHARMACOLOGICAL SCIENCES》 ISSN&#xff1a;1128-3602 出…

椋鸟C++笔记#3:类的默认成员函数

文章目录 类的默认成员函数构造函数&#xff08;Constructor&#xff09;构造函数的特点 析构函数 &#xff08;Destructor&#xff09;析构函数的特点 拷贝构造函数&#xff08;Copy Constructor&#xff09;拷贝构造函数的特点 运算符重载&#xff08;Operator Overloading&a…

Java中关于infinity的解释

在Java中&#xff0c;Infinity 不是一个直接的关键字或常量&#xff0c;但它是浮点数&#xff08;float 和 double&#xff09;可以表示的一个特殊值。具体来说&#xff0c;Infinity 通常与两个特殊的浮点值相关联&#xff1a;正无穷大 (POSITIVE_INFINITY) 和负无穷大 (NEGATI…

Java编程注释教程

在Java SE&#xff08;Standard Edition&#xff09;中&#xff0c;注释是用于解释说明程序的文字&#xff0c;它们不会影响程序的执行&#xff0c;但可以提高程序的可读性和可维护性。Java SE支持三种类型的注释&#xff1a; 单行注释&#xff1a; 使用两个斜杠&#xff08;/…

缩进在编程中的重要性及正确使用方法

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 前言 缩进不当引发的问题 缩进的正确使用方法 缩进错误的调试与修复 总结 前言 在编程世…

Unity 资源 之 限时免费的Lowpoly农场动物,等你来领!

Unity资源 之 Lowpoly farm animals 农村动物 前言资源包内容领取兑换码 前言 Unity 资源商店为大家带来了一份特别的惊喜——限时免费的农场动物资源&#xff01;这是一个充满趣味和实用性的资源包。 资源包内容 在这个资源包中&#xff0c;你可以找到丰富多样的低地养殖动物…

Vue3路由配置

路由其实就是一组对应关系&#xff0c;将一个路径与一个组件对应起来&#xff0c;当路径发生变化&#xff0c;路由器就可以通过路由规则&#xff0c;找到当前路径对应的组件&#xff0c;并将该组件呈现到页面上 使用路由步骤&#xff1a; 1.终端输入 npm i vue-router 2.在App…

UDP网络聊天室

前言 基于UDP的网络聊天室 一、项目需求 如果有用户登录&#xff0c;其他用户可以收到这个人的登录信息如果有人发送信息&#xff0c;其他用户可以收到这个人的群聊信息如果有人下线&#xff0c;其他用户可以收到这个人的下线信息服务器可以发送系统信息 二、步骤 1.创建UD…

Softing工业将亮相2024年阿赫玛展会——提供过程自动化的连接解决方案

您可于2024年6月10日至14日前往美因河畔法兰克福11.0号馆&#xff0c;Softing将在C25展位展出&#xff0c;欢迎莅临&#xff01; 作为工业应用中数据交换领域公认的专家&#xff0c;Softing工业致力于帮助各行各业的客户部署网络自动化和优化生产流程。 使用Softing产品&…

mybatis plus 配置多数据源(数据源进行切换)

多数据源(数据源进行切换) AbstractRoutingDataSource 根据用户定义的规则选择当前的数据源&#xff0c;这样我们可以在执行查询之前&#xff0c;设置使用的数据源。实现可动态路由的数据源&#xff0c;在每次数据库查询操作前执行。它的抽象方法 determineCurrentLookupKey()…

如何在OpenHarmony上使用SeetaFace2人脸识别库?

简介 相信大部分同学们都已了解或接触过OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;了&#xff0c;但你一定没在OpenHarmony上实现过人脸识别功能&#xff0c;跟着本文带你快速在OpenHarmony标准设备上基于SeetaFace2和OpenCV实现人脸识别。 项目效…

【Vue】Vue2路由

目录 路由作用Vue Router路由Vue Router路由的组成VueRouter常用的函数Vue Router的使用安装Vue Router创建router引入router使用 备注 Vue多级路由&#xff08;嵌套路由&#xff09;编写组件配置嵌套路由 Vue中的动态路由代码示例父组件Home.vue子组件路由配置 路由的 query 参…

黑龙江等保测评深入理解

“没有网络安全&#xff0c;就没有国家安全”&#xff0c;等级保护测评是指按照网络安全系统制定的一系列的防护过程&#xff0c;对已经有的和即将上线的商业服务的基础设施&#xff08;系统&#xff0c;数据库&#xff0c;中间件等&#xff09;所做的一系列的检查&#xff0c;…

HeyGen AI是什么?怎样使用HeyGen AI?

在数字时代&#xff0c;视频内容为王。无论是在社交媒体还是网站上&#xff0c;视频都以其独特的方式吸引着人们的眼球。然而&#xff0c;制作出专业水准的视频往往需要大量的时间和技术知识。HeyGen AI正是为了解决这一难题而诞生的。 HeyGen AI简介 HeyGen AI是一个创新的视…

618值得买的好物清单,这些数码好物你千万不能错过!

​随着618购物节的距离越来越近&#xff0c;你是不是已经开始疯狂浏览购物app&#xff0c;准备大肆采购一番了&#xff1f;但是在购物之前&#xff0c;还是得先做一做功课&#xff0c;避免陷入购物陷阱&#xff0c;而作为一名经验丰富的数码爱好者&#xff0c;想通过这次机会给…

Thinkphp内核开发盲盒商城源码v2.0 对接易支付/阿里云短信/七牛云存储

源码简介 这套系统是我从以前客户手里拿到的,100完整可用,今天测试防红链接失效了,需要修改防红API即可!前端页面展示我就不放了,懂的都懂 优点是Thinkphp开发的&#xff0c;二开容易。 源码图片 资源获取&#xff1a;Thinkphp内核开发盲盒商城源码v2.0 对接易支付/阿里云短…

kafka监控配置和告警配置——筑梦之路

kafka_exporter项目地址&#xff1a;https://github.com/danielqsj/kafka_exporter docker-compose部署kafka_exporter # docker-compose部署多个kafka_exporter&#xff0c;每个exporter对接一个kafka# cat docker-compose.ymlversion: 3.1 services:kafka-exporter-opslogs…