pe知识复习之pe新增节

ibinary ibinary     2023-01-04     172

关键词:

             PE知识复习之PE新增节

一丶为什么新增节.以及新增节的步骤

    例如前几讲.我们的PE文件在空白区可以添加代码.但是这样是由一个弊端的.因为你的空白区节属性可能是只读的不能执行.如果你修改了属性.那么程序就可能出现问题.所以新增一个节可以实现我们的代码.

等等.

  1.新增节的步骤

    1.在最后一个节位置添加一个节.如果没有空白位置.自己需要给扩展头扩大.并且自己修正节的偏移.

    2.修改文件头中节表个数.

    3.添加的新节表修改节表的属性. 节.VirtualAddress .这个成员指定了这个节在内存哪里展开.所以需要修改.

    4.修改节表文件偏移  节.PointerToRawData   我们指定了内存中从哪里展开节.那么也需要指定这个节在文件中在哪里展开

    5.修改节表中的 节数据对齐后的大小. 节.SizeofRawData.  我们新增的节.自己需要在PE文件添加一段节数据.数据的大小按照文件对齐添加. 并且填写到这个成员中.

    6.修改扩展头的PE镜像大小. sizeofImage. 这个成员才是关键.如果不按照内存对齐修改镜像大小.那么我们的节就不会映射到内存中.或者PE文件根本无法执行.

二丶根据新增节步骤.实战手工添加一个节.

    1.添加一个节表

        添加节表的时候.需要在最后一个节后面添加.随便哪一个PE文件举例

技术分享图片

    因为扩展头中的SizeofHeaders 标明了 DOS头+NT头 +节表的大小.按照文件对齐存放.所以在400开始才是节数据.那么我们上图所示.最后一个节表为.rsrc. 我们下面有足够的空间添加一个新的节表.所以我们复制这个节表.在他后面粘贴.粘贴了一个新的.rsrc节表.

  我们为这个节重名民为 AAAA

  技术分享图片

    2.修改节表个数.在文件头属性中.

  文件头中有一个属性记录了我们节表的个数.我们新增了一个节.那么就需要在原有的个数上加1.找到文件头记录节表个数位置.并加一即可.

技术分享图片

    原为7,现在改为8即可.

    3.修正节表中的偏移.

  我们新增了一个节表.那么我们就要为这个节表指明内存中开始展开的位置. 文件中展开的位置. 以及节数据的大小.

  对应的三个成员分别是:

    节.VirtualAddress

    节.SizeOfRawData

    节.PointerToRawData

   3.1 节.VirtuallAddress修改

  首先第一个成员. 节.virtuallAddress .我们按照文件对齐.与上一个节表对齐存放即可.

    例如上一个节表对齐后的展开位置为 0x1c000 那么我们就修改为 0x1d000

技术分享图片

  3.2 节.sizeofRawData修改

  这个成员就是节数据按照文件对齐后的大小.取决于我们给这个节添加多少数据.我们可以在PE文件后面添加 0x1000个字节.

技术分享图片

技术分享图片

新增的节开始位置改成FFFFF方便我们查看.

   我们添加了0x1000的节数据.那么这个成员就修改为0x1000

技术分享图片

  3.3 节.PointerRawToData 文件偏移修改

  最后修改的就是节在文件中哪里展开的. 这个我们需要看上一个节的文件偏移.以及节数据大小. 算出来的.

例如上一个节 偏移位置为10. 那么节数据为100.  那么节数据就是从10 ~ 100都是上一个节. 我们的节展开就要从100位置展开.

  例如下图:

  技术分享图片

   上一个节开始位置是8400 节数据对齐后的大小是0x600 他俩相加则是 0x8A00. 所以我们的偏移位置在0x8A00开始.

  4.修改扩展头中PE的镜像大小 SizeofImage

我们新增了0x1000节数据大小.那么我们的镜像大小也要加0x1000大小进行映射.注意.要按照内存对齐.

技术分享图片

我们的原镜像大小以及按照内存对齐的方式存放了. 就是0x1D000. 那么我们加了0x1000的数据就是 0x1E000大小.我们修改为0x1E000

技术分享图片

保存文件

  5.保存文件内存中查看是否映射.

首先运行一下:

  技术分享图片

可以成功运行.

  去内存中查看.节表是否映射. 我们节在内存中展开的偏移是 0x1D000 加上我们的ImageBase 就是 0x41D000位置.

技术分享图片

跳转过去之后发现就是我们刚才填写FFFF的数据.已经成功映射了.至此我们就为这个PE文件新增了一个节.

 

三丶总结

   根据上面实战添加节.进行一个总结.

    1.一个节表0x28个字节.在最后一个节表位置添加.如果SizeofHeaders 有足够空间的情况下.

    2.修改文件头中节表个数. 文件.SectionNumber = 原有节个数 + 你新增节的个数. 例如: 原为7.你增加了一个节.就为8

    3.修改节属性:

      节.VirtuallAddress 内存中展开的位置.按照内存对齐.   可以参照上一个节.virtuallAddress位置.我们进行修改.

      节.SizeofRawData 节数据按照文件对齐后的大小.      节.SizeofRawData = 你添加的节数据大小. 按照文件对齐存放. 例如添加了0x1000.那么大小就是0x1000

      节.PointerToRawData 文件中的偏移.  节.PointerToRawData = ()上一个节.PointerToRawData + 上一个节.SizeofRawData. )

    4.修改扩展头SizeofImage PE镜像大小.  扩展头.SizeofImage = 内存对齐(原SizeofImage值 + 你行增节数据大小 按照内存对齐)

 

pe知识复习之pe扩大节(代码片段)

               PE知识复习之PE扩大节一丶为什么扩大节  上面我们讲了,空白区添加我们的代码.但是有的时候.我们的空白区不够了怎么办.所以需要进行扩大节.  扩大节其实很简单.修改节数据对齐后的... 查看详情

pe知识复习之pe的节表(代码片段)

          PE知识复习之PE的节表一丶节表信息,PE两种状态.以及重要两个成员解析.  确定节表位置:DOS+NT头下面就是节表.  确定节表数量:节表数量在文件头中存放着.可以准确知道节表有多少个.  节表是一个结... 查看详情

pe知识复习之pe的rva与foa的转换(代码片段)

             PE知识复习之PE的RVA与FOA的转换一丶简介PE的两种状态  首先我们知道PE有两种状态.一种是内存展开.一种是在文件中的状态.那么此时我们有一个需求.我们想改变一个全局变量的初始值.此时应该... 查看详情

pe知识复习之pe的导出表(代码片段)

                   PE知识复习之PE的导出表一丶简介 在说明PE导出表之前.我们要理解.一个PE可执行程序.是由一个文件组成的吗.答案:不是.是由很多PE文件组成.DLL也是PE文件.如果我们PE文件运行.那么就需... 查看详情

pe知识复习之pe文件空白区添加代码

          PE知识复习之PE文件空白区添加代码一丶简介  根据上面所讲PE知识.我们已经可以实现我们的一点手段了.比如PE的入口点位置.改为我们的入口位置.并且填写我们的代码.这个就是空白区添加代码.我们也可... 查看详情

pe知识复习之pe的重定位表(代码片段)

          PE知识复习之PE的重定位表一丶何为重定位      重定位的意思就是修正偏移的意思. 如一个地址位0x401234,Imagebase=0x400000.那么RVA就是1234. 如果Imagebase变了成了0x300000,那么修正之后就是ImageBase+RVA... 查看详情

pe新增一个节区细节(代码片段)

pe文件中新增一个节区的细节主要是Misc.VirtualSize为添加的实际大小,非内存对齐后的大小。LPVOIDaddSection(LPVOIDfileBuffer,PTCHARsectionName,size_tsectionCodeSize)if(strlen(sectionName)>=8)cout<<"sectionNamesize&l 查看详情

pe新增一个节区细节(代码片段)

pe文件中新增一个节区的细节主要是Misc.VirtualSize为添加的实际大小,非内存对齐后的大小。LPVOIDaddSection(LPVOIDfileBuffer,PTCHARsectionName,size_tsectionCodeSize)if(strlen(sectionName)>=8)cout<<"sectionNamesize&l 查看详情

p45新增节

新增节:1、判断是否有足够的空间,可以添加一个节表.判断条件:SizeOfHeader-(DOS+垃圾数据+PE标记+标准PE头+可选PE头+已存在节表)>=2个节表的大小2、需要修改的数据1)添加一个新的节(可以copy一份)2)在新增节后面填充一个节大小... 查看详情

pe新增一个节区细节(代码片段)

pe文件中新增一个节区的细节主要是Misc.VirtualSize为添加的实际大小,非内存对齐后的大小。LPVOIDaddSection(LPVOIDfileBuffer,PTCHARsectionName,size_tsectionCodeSize)if(strlen(sectionName)>=8)cout<<"sectionNamesize<8"<<endl;returnnullptr... 查看详情

pe之rva转foa(代码片段)

公式RVA=内存地址-ImageBase判断RVA在哪一个节上:RVA>=节n.VirtualAddressRVA<=(节n.VirtualAddress+节.SizeofRawData)内存对齐偏移=RVA-节n.VirtualAddressFOA=节n.PointerToRawData+偏移实验-对齐大小一样#include<stdio.h>charstr[]="ABC";intmain()printf(... 查看详情

pe格式:新建节并插入代码

...程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如文件加密与解密,病毒分析,外挂技术等。经过了前一章的学习相信你已经能够独立完成FOA与VA之间的互文章出处:https:... 查看详情

脱壳第三讲,upx压缩壳,以及补充壳知识

...          脱壳第三讲,UPX压缩壳,以及补充壳知识一丶什么是压缩壳.以及壳的原理在理解什么是压缩壳的时候,我们先了解一下什么是壳1.什么是壳  壳可以简单理解为就是在自己的PE文件中包含了代码.而有不影响我... 查看详情

逆向工程之pe文件格式(代码片段)

PE文件格式(一)一.介绍二.PE文件格式1.基本结构1.1基本结构1.2VA&RVA1.3PE头DOS头DOS存根1.4NT头1.5NT头:文件头1.6可选头定义1.7节表1.8节数据一.介绍PE文件是Windows操作系统下使用的可执行文件文件格式。PE文件是指32位... 查看详情

pe格式:新建节并插入代码(代码片段)

...程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如文件加密与解密,病毒分析,外挂技术等。经过了前一章的学习相信你已经能够独立完成FOA与VA之间的互转了,接下来我... 查看详情

pe格式第八讲,tls表(线程局部存储)

...所有,欢迎保留原文链接进行转载:)一丶复习线程相关知识首先讲解TLS的时候,需要复习线程相关知识, (threadlocalstorage )1.了解经典同步问题首先我们先写一段C++代码,开辟两个线程去跑,看看 查看详情

pe文件结构(代码片段)

由于一些原因,需要学习安全方面的一些知识,所以学习了PE文件的结构,这篇随笔是学习的一些心得,作为复习。希望对各位有所帮助,如果行文中有什么错误,还请各位指正。MicrosoftWindowsPortableExecutable是微软可迁移可执行软... 查看详情

pe格式第五讲,手工添加节表

          PE格式第五讲,手工添加节表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:)首先我们要用汇编编写一段汇编代码,用来生成标准PE一丶标准PE生成的汇编代码.386.model... 查看详情