首页
社区
课程
招聘
[原创]自己编写的小程序实现简单的加壳脱壳
发表于: 2020-1-21 14:05 14432

[原创]自己编写的小程序实现简单的加壳脱壳

2020-1-21 14:05
14432

首先自己编写一个 “Hello World!” 小程序,对它进行加壳
图片描述
步骤:

使用 LoadPE 打开程序,添加一个区段,默认名为 .NewSec
图片描述
图片描述
添加完成后发现无法打开程序,是因为添加的虚拟大小、文件大小都是空的,还未填写任何内容
图片描述
接下来使用 LoadPE 编辑区段信息,添加虚拟大小和文件大小都为 0x200
图片描述
然后使用 010Editor 添加文件数据,新加的区段的起始地址是 0x9800,大小是 0x200,保存后再次打开程序,发现能够运行
图片描述

图片描述

修改 OEP,增加 OEP 代码
将程序的入口点改为新添加区段的 RVA,原程序区段入口点为 0x11343
图片描述
转到原 OEP 处执行代码

加密代码段
代码段信息
图片描述
在 010Editor 中操作,选中代码段
图片描述
异或加密代码段
图片描述

图片描述

脱壳目的:

脱壳步骤:

脱自己写的壳:

  • 使用 15PB OD 打开程序,直接跳转到原来的 OEP 即可成功,jmp 指令后是相对偏移
    图片描述
  • 获取基地址再跳转,call 指令后将 0x100005 入栈,pop eax 即 eax = 0x100005,然后减去 0x20005 得到模块基址,再加上原来的 OEP 即为正确的入口地址
    图片描述
  • 将上面的 sub add 合并计算出偏移,入口点地址+5-(入口点地址-新OEP+原OEP)
    图片描述
    代码演化,去掉随机基址
  • 在新的 OEP 处直接跳转到原来的 OEP
    图片描述
  • 在新的 OEP 处定义出模块基址,然后加上原始 OEP 的 RVA
    图片描述
  • 在新的 OEP 处通过 call pop 组合获取当前指令地址,再减去偏移,计算出模块基地址
    图片描述
  1. 使用 LoadPE 打开程序,添加一个区段,默认名为 .NewSec
    图片描述
    图片描述
    添加完成后发现无法打开程序,是因为添加的虚拟大小、文件大小都是空的,还未填写任何内容
    图片描述
    接下来使用 LoadPE 编辑区段信息,添加虚拟大小和文件大小都为 0x200
    图片描述
    然后使用 010Editor 添加文件数据,新加的区段的起始地址是 0x9800,大小是 0x200,保存后再次打开程序,发现能够运行
    图片描述

    图片描述

  2. 修改 OEP,增加 OEP 代码
    将程序的入口点改为新添加区段的 RVA,原程序区段入口点为 0x11343
    图片描述
    转到原 OEP 处执行代码

  1. 加密代码段
    代码段信息
    图片描述
    在 010Editor 中操作,选中代码段
    图片描述
    异或加密代码段
    图片描述

    图片描述

  2. 增加解密代码段
    由于代码本身有重定位信息,加密之后重定位会出现问题,故应去掉随机基址
    在 010Editor 中将 40 81 改为 00 81
    将 .text 段的标志设为可写入
    图片描述
    在程序入口点编辑代码进行异或解密
    图片描述
  1. Cracker 脱壳、解密、破解
  2. 杀毒引擎解密、查杀病毒、扫描特征
  1. 找到原始 OEP
    一般来说,找到原始 OEP 或跟踪到原始 OEP 时,程序都会完成解密操作
  2. dump 内存到文件
    当可执行文件在内存中完成解密后,将内存中代码数据转储(dump)到文件,就可以进一步分析
  3. 修复文件(常见于修复 IAT,重建导入表)
    从内存中转储的内存数据代码有一些与原文件中的内容不一致,比如 IAT 表,内存中 IAT 表会被初始化为函数地址表,而文件中 IAT 表与 INT 表内容一致,所以想要程序正常运行,一般都要修复 IAT,加壳后程序一般会自己处理导入表、IAT 及重定位等
  1. 找到原始 OEP
    单步跟踪,在 POPAD 附近寻找
  2. dump 内存到文件
    在原始 OEP 处进行 dump 内存,因为这时内存未做太多的初始化,右击,选择 用OllyDump脱壳调试进程
    图片描述
    填入当前模块的起始地址和原来的 OEP,取消选择 重建输入表,脱壳
  3. 修复 IAT 或修复导入表
    使用 ImportREC 15pb专用版
    图片描述
    打开该工具,选择脱壳进程,设置 OEP,方便查找 IAT,点击 自动查找IAT,获取 IAT 信息,点击 获取输入表,获取输入表信息,若输入表函数有无效的,就需要修复,最后将输入表信息转储到文件,完成修复
  • 使用 LoadPE 打开程序,添加一个区段,默认名为 .NewSec
    图片描述
    图片描述
    添加完成后发现无法打开程序,是因为添加的虚拟大小、文件大小都是空的,还未填写任何内容
    图片描述
    接下来使用 LoadPE 编辑区段信息,添加虚拟大小和文件大小都为 0x200
    图片描述
    然后使用 010Editor 添加文件数据,新加的区段的起始地址是 0x9800,大小是 0x200,保存后再次打开程序,发现能够运行
    图片描述

    图片描述

  • 修改 OEP,增加 OEP 代码
    将程序的入口点改为新添加区段的 RVA,原程序区段入口点为 0x11343
    图片描述
    转到原 OEP 处执行代码


  • [培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

    上传的附件:
    收藏
    免费 2
    支持
    分享
    最新回复 (4)
    雪    币: 1115
    活跃值: (160)
    能力值: ( LV3,RANK:20 )
    在线值:
    发帖
    回帖
    粉丝
    2
    2020-1-21 14:09
    0
    雪    币: 2166
    活跃值: (3226)
    能力值: (RANK:260 )
    在线值:
    发帖
    回帖
    粉丝
    4
    相信楼主对PE结构有了更加深入的认识,再接再厉
    2020-1-26 16:38
    0
    雪    币: 26245
    活跃值: (63297)
    能力值: (RANK:135 )
    在线值:
    发帖
    回帖
    粉丝
    5
    感谢分享!
    2020-2-12 21:39
    0
    游客
    登录 | 注册 方可回帖
    返回
    //