本帖最后由 lyl610abc 于 2021-4-10 22:24 编辑
前言
论坛里有不少优秀前辈们的脱壳破解教程,但是关于加壳的内容比较少,于是就打算出一个加壳系列
加壳系列将一步步构建一个简单的加密壳,进一步巩固PE文件的知识
正所谓知己知彼,百战不殆。只有在了解壳是怎么来的这个前提下,才能更好地脱壳
加壳离不开PE文件的相关知识,有关PE的相关知识可以查看先前的系列:PE文件笔记一 PE介绍
该篇为:加壳系列一;主要介绍一下加壳的原理,为后续作铺垫
加壳原理
什么是壳
所谓的壳,其实就是给程序套上一层外壳;
- 通过加壳,可以增加逆向分析代码的难度,在一定程度上保护软件代码的安全
- 通过加壳,可以压缩程序的大小,使程序占用的空间更小
也可以将壳称为一种补丁
壳的种类
壳大致可以分为两种:压缩壳和加密壳
- 压缩壳:压缩程序的大小,减小空间占用
- 加密壳:反调试、反跟踪,保护程序
常见的压缩壳:ASPack、UPX
常见的加密壳:ASProtect、Armadillo、 EXECryptor、Themida、VMProtect
加壳的基本思路
极简版基本思路
- 保存相关信息到补丁并加密程序
- 修改程序入口为补丁地址
- 补丁根据先前保存的信息还原和解密程序
- 补丁最后返回原本的程序入口
简略版基本思路
- 将原本程序的PE相关代码复制到补丁中
- 加密程序
- 修改程序入口点,使得程序启动后会先运行补丁程序
- 补丁程序会根据先前复制的相关代码对程序进行解密和还原,使得程序能够正常运行
- 还原后再返回执行原本的入口点
详细版基本思路
- 在PE文件中开辟空间用于存储补丁代码
- 复制扩展PE头中的数据目录表(DataDirectory)的内容到存储补丁的空间中,复制完后清空原本的数据目录表
- 修正复制过去的数据目录表的内容
- 对修正完的数据目录表之后的数据(不包括补丁部分)进行加密
- 修改PE文件的程序入口为补丁代码
- 补丁代码还原前面被清空的数据目录表
- 补丁代码解密先前加密的数据
- 补丁代码加载导入表中需要导入的DLL
- 补丁代码修正IAT
- 补丁代码执行完后返回原本的程序入口
加壳后的程序结构
总结
- 前面所给出的只是加壳的基本思路,实际中的壳千变万化,不一定完全按照基本思路来,但基本套路如是
- 加壳的难点在于将数据目录项复制到补丁代码部分,并修正复制后的数据目录项
- 加壳中加密的核心是加密算法
|