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新增节的更多相关文章

  1. PE知识复习之PE合并节

    PE知识复习之PE合并节 一丶简介 根据上一讲.我们为PE新增了一个节. 并且属性了各个成员中的相互配合. 例如文件头记录节个数.我们新增节就要修改这个个数. 那么现在我们要合并一个节.以上一讲我们例 ...

  2. PE知识复习之PE的节表

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

  3. PE知识复习之PE的重定位表

    PE知识复习之PE的重定位表 一丶何为重定位 重定位的意思就是修正偏移的意思.  如一个地址位 0x401234 ,Imagebase = 0x400000 . 那么RVA就是 1234.  如果Im ...

  4. PE知识复习之PE的导入表

    PE知识复习之PE的导入表 一丶简介 上一讲讲解了导出表. 也就是一个PE文件给别人使用的时候.导出的函数  函数的地址 函数名称 序号 等等. 一个进程是一组PE文件构成的.  PE文件需要依赖那些 ...

  5. PE知识复习之PE的导出表

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

  6. PE知识复习之PE扩大节

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

  7. PE知识复习之PE文件空白区添加代码

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

  8. PE知识复习之PE的RVA与FOA的转换

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

  9. PE知识复习之PE的各种头属性解析

    PE知识复习之PE的各种头属性解析 一丶DOS头结构体 typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; // M ...

随机推荐

  1. Javascript 的变量提升与预解析

    一.什么是变量提升 在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分 二.怎么实现 ...

  2. vue Error: No PostCSS Config found in

    最近在做一个vue的移动端的项目,遇到一个问题,我本地的项目运行正常,可是上传到github上的一启动就报错,就是标题上的错误,找了很久,刚开始以为是某个css没有配置,就把本地的复制过去还是报错,无 ...

  3. C# yield return 和 yield break

    yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,yield break用于终止循环遍历. 以下对比了使用yield return与不使用yie ...

  4. ES6-个人学习大纲

    1,let   const学习补充 1.1,let的知识点: 01-作用域只限制在当前代码块内,代码块形式如下: { var str = '张三'; console.log(str); let str ...

  5. VIM常用快捷键(转载)

    移动光标 h,j,k,l 上,下,左,右 ctrl-e 移动页面 ctrl-f 上翻一页 ctrl-b 下翻一页 ctrl-u 上翻半页 ctrl-d 下翻半页 w 跳到下一个字首,按标点或单词分割 ...

  6. LeetCode编程训练 - 合并查找(Union Find)

    Union Find算法基础 Union Find算法用于处理集合的合并和查询问题,其定义了两个用于并查集的操作: Find: 确定元素属于哪一个子集,或判断两个元素是否属于同一子集 Union: 将 ...

  7. Vue 学习笔记 — filter

    简书 对将要插入html的对象进行处理 一个简单的Vue示例 基本过滤器用法 带参数的过滤器 全局过滤器 (这张图片有点问题,最后显示的应该是 hello world不是null) 过滤器的简单应用 ...

  8. 美图App的移动端DNS优化实践:HTTPS请求耗时减小近半

    本文引用了颜向群发表于高可用架构公众号上的文章<聊聊HTTPS环境DNS优化:美图App请求耗时节约近半案例>的部分内容,感谢原作者. 1.引言 移动互联网时代,APP 厂商之间的竞争非常 ...

  9. [Swift]LeetCode243.最短单词距离 $ Shortest Word Distance

    Given a list of words and two words word1 and word2, return the shortest distance between these two ...

  10. [Swift]LeetCode650. 只有两个键的键盘 | 2 Keys Keyboard

    Initially on a notepad only one character 'A' is present. You can perform two operations on this not ...