目录

PE文件实验(5):手动加节实验

为什么要做这个实验?

  1. 是因为脱壳后需要修导入表,那么导入表放哪里?
  2. 就需要手动加节,将导入表信息放到这个手动增加的新节区中

尝试新工具

  1. 010Editor这个工具,其实对于静态修改PE文件,还是挺方便的
  2. 但是先入为主,之前用惯了CFF
  3. 本实验以练习010Editor工具为主,CFF辅助验证修改情况(CFF完全可以独立支持本实验)

文件尾部添加空白段

  1. 在文件尾部添加0x200字节的空白段,现有文件大小为0x2400,Edit -> Set File Size,填入0x2600:

/manualaddsection/Image/1-%E8%AE%BE%E7%BD%AE%E6%96%87%E4%BB%B6%E5%A4%A7%E5%B0%8F.png

/manualaddsection/Image/2-%E6%96%87%E4%BB%B6%E5%B0%BE%E9%83%A8%E5%A2%9E%E5%8A%A0%E7%A9%BA%E7%99%BD%E6%AE%B5.png

  1. 保存、覆盖原程序后,此时双击是可以正常运行程序的:

/manualaddsection/Image/3-%E7%A8%8B%E5%BA%8F%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C.png

修改文件头节区数量

  1. 将原本节区数量5改成6,保存

/manualaddsection/Image/4-%E4%BF%AE%E6%94%B9%E8%8A%82%E5%8C%BA%E6%95%B0%E9%87%8F.png

  1. 双击后exe无法运行

/manualaddsection/Image/5-%E4%BF%AE%E6%94%B9%E8%8A%82%E5%8C%BA%E6%95%B0%E9%87%8F%E5%90%8E%E6%97%A0%E6%B3%95%E8%BF%90%E8%A1%8C.png

修改节表

  1. 我们关闭文件,重新将文件拖入010Editor,不重新载入的话,编辑器不会马上识别到新增节区头
  2. 这是因为我们修改为6个节区,但是有效节表的数量还是原本的5个,如图所示:

/manualaddsection/Image/6-%E6%9C%89%E6%95%88%E8%8A%82%E8%A1%A8%E6%9C%AA%E6%9B%B4%E6%96%B0.png

  1. 由于文件对齐值默认为0x200,文件头向上对齐到0x400了,所以我们添加新的节区头,并不会影响该文件在磁盘中的大小

/manualaddsection/Image/7-%E6%96%87%E4%BB%B6%E5%A4%B4%E5%AF%B9%E9%BD%90%E6%83%85%E5%86%B5.png

  1. 此时我们需要手动编辑第6个节表头的数据,这里借助CFF来辅助
    1. 因为节区跟节区之间是紧挨着的,所以要计算得到最后一个节区的PointerToRawData、SizeOfRawData、VirtualSize、VirtualAddress,就要看倒数第2个节区的数据(算出来)

/manualaddsection/Image/8-%E5%80%92%E6%95%B0%E7%AC%AC%E4%BA%8C%E4%B8%AA%E8%8A%82%E5%8C%BA%E6%95%B0%E6%8D%AE.png

  1. 填充节区头内容,节区属性给RW

/manualaddsection/Image/9-%E5%A1%AB%E5%85%85%E6%96%B0%E8%8A%82%E5%8C%BA%E5%A4%B4.png

  1. 使用CFF验证修改结果

/manualaddsection/Image/10-CFF%E9%AA%8C%E8%AF%81%E8%8A%82%E8%A1%A8.png

  1. 双击后exe无法运行

/manualaddsection/Image/11-%E4%BF%AE%E6%94%B9%E8%8A%82%E8%A1%A8%E5%90%8E%E6%97%A0%E6%B3%95%E8%BF%90%E8%A1%8C.png

修改SizeOfImage

  1. 由于我们手动加节比较简单,增加了一个0x200节区,那么内存向上对齐,就是增加0x1000,所以继续修改OptHdr->SizeOfImage

/manualaddsection/Image/12-%E4%BF%AE%E6%94%B9SizeOfImage.png

  1. 使用CFF验证

/manualaddsection/Image/13-CFF%E9%AA%8C%E8%AF%81SizeOfImage.png

  1. 双击程序,正常运行

/manualaddsection/Image/3-%E7%A8%8B%E5%BA%8F%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C.png

总结

  1. 要手动加节,那么要同时修改以下内容:
    1. 文件尾部增加0x200字节的空白区域,存放导入表足够了
    2. 修改FileHdr->NumOfSections
    3. 修改节表属性,即:RawOffset、RawSize,VirtualAddr、VirtualSize,节区属性
    4. 修改OptHdr->SizeOfImage文件在内存中的占用大小,向上对齐后的值
  2. 自己上手做一遍实验后,发现手动加节其实很简单,套路大多都是固定的,知道原理即可自己用代码实现一键添加节区,或者使用现有的工具(例如PE DIY)
PE文件结构 逆向工程