zoukankan      html  css  js  c++  java
  • 利用01Editor手工加壳

    主要工具: 010Editor、LordPE、OD
    实验平台:win10 64位
    实现功能:加壳。

    加壳原理

    要想弄明白怎么对PE文件加壳,首先需要对PE文件比较熟悉,而最快的熟悉PE文件的方法就是自己写一个PE解析工具和写壳了。
    先只用工具010Editor完成一个手工加壳,那么就明白加壳的原理了。

    首先进行手工加壳

    先用VS随便生成一个exe文件,我们使用它进行实验。
    可以先使用010Editor、LordPE、OD等工具查看节区个数,我实验程序的原始区段(节区)个数是8个。

    1. 给PE文件添加一个新区段

    修改文件头的NumberOfSection
    使用010Editor打开测试程序,按alt+4出现一个模板菜单找到NumberOfSection把该数字加1,这里改为了9。
    在这里插入图片描述

    2. 设置新的区段头

    添加保存之后, 重新运行010Editor的模板(或者重启010),区段就增加了一个。
    在这里插入图片描述
    设置整个新增加的区段的数据,主要需要设置的字段如下:
    在这里插入图片描述

    1. 区段名(可选)
    2. 区段数据的实际字节数Misc.VirtualSize
    3. 区段的VirtualAddress(区段数据在内存中的RVA),此值必须是: 上一个区段的VirtualAddress + 上一个区段经内存对齐粒度对齐后的大小(内存对齐大小是0x1000的整数倍)
    4. 区段以文件对齐粒度对齐后的大小SizeOfRawData(文件对齐大小是0x200的整数倍)
    5. 区段的PointerToRawData(区段数据在文件中的偏移),此值必须是:上一个区段的PointerToRawData + 上一个区段的SizeOfRawData
    6. 区段属性主要设置区段为可读可写可执行如下图
      在这里插入图片描述
      对比上一个区段修改新添加的区段里的字段。
      在这里插入图片描述
    3.添加区段数据

    区段头内容虽然设置好了,但真正重要的区段里的数据还需要插入到文件中,以扩充文件的大小,因为区段头只是一个相当于目录的存在,如果只有目录而没有内容,就会造成这个文件成为一个无效的PE文件。
    把010Editor里的数据页滚动到最下面按Ctrl+shift+i添加200h个(16进制)字节
    在这里插入图片描述
    在这里插入图片描述

    4. 修改PE文件的扩展头的SizeofImage

    现在PE文件已经被扩充了大小,扩展头中的映像大小必须更新,否则当PE文件加载到内存后,新区段的数据将无法得到正常加载。
    这个字段的值记录的是一个PE文件在内存中的大小,可以将之设置为: 最后一个区段在内存中的位置 + 最后一个区段在内存中的大小,即:
    OptionalHeader.SizeofImage = 最后一个区段.VirtualAddress + 最后一个区段.SizeOfRawData按内存对齐粒度对齐的大小
    在这里插入图片描述
    保存之后,运行该程序,就能正常运行(中间某些环节操作错了就会导致该文件无法正常运行)到此添加区段成功了。那么加壳也就成功了90%,这个新区段之后称为壳代码段。

    5.添加壳代码

    先找到扩展头的DLL属性字段,去掉随机基址,把40 81改为 00 81后保存。
    在这里插入图片描述
    在这里为了方便,就使用LordPE来操作剩下的步骤了,先记录原始的OEP入口点为11055,把他改为新区段的RVA 1F000然后点击保存。
    在这里插入图片描述
    然后再使用OD打开,进入到入口点就是41F000,因为默认加载基址是0x400000, 发现全是00 00 00的字节,没用内容。把第一行代码改为跳转到原来的入口点jmp 0x411055,然后打一个补丁,程序就能正常运行了。
    在这里插入图片描述
    这就是一个完整的壳流程了,虽然这个壳的内容只有一条跳转到原入口点的代码,但万丈高楼平地起。基础的东西弄懂了后面才能少遇见一些坑!

  • 相关阅读:
    golang获取URL
    Golang读取HTML中Table数据到二维数组
    Golang的GUI开发包fyne基本教程
    C#搭建安川机器人上位机
    程序计数器
    SpringBoot定时任务详解
    mysql 5.7安装
    springboot 配置多数据源
    mysql 查询某一天数据
    java如何获取当前日期和时间
  • 原文地址:https://www.cnblogs.com/laohaozi/p/12537616.html
Copyright © 2011-2022 走看看