zoukankan      html  css  js  c++  java
  • 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值 + 你行增节数据大小 按照内存对齐)

  • 相关阅读:
    devenv.exe与devenv.com
    [LeetCode 132] 回文分割II(Palindrome Partitioning II)
    [翻译]More C++ Idioms 取址器(Address of)
    [LeetCode 131] 回文分割(Palindrome Partitioning)
    [翻译]More C++ Idioms 类成员检测器
    C++类的隐式默认构造函数
    [翻译]More C++ Idioms 通过初始化挂接(Attach by Initialization)
    【转】来自微软的纯CSS下拉菜单
    引用asp.net母版页后,母版页和内容页的页面事件执行顺序
    如何解决无法显示隐藏文件/文件夹
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/11306293.html
Copyright © 2011-2022 走看看