关键词:
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... 查看详情