目录
前言
老早之前学的,印象有点模糊,有些部分网上也没什么比较新的教程,写得不好请见谅
简介
壳是一些计算机软件里一段专门负责保护软件不被非法修改或反编译的程序
它们一般在代码执行前获得程序控制权完成保护软件的任务,且不影响软件的正常功能
我们通常将壳分为两类,一类是压缩壳,另一类是加密壳
压缩壳
压缩壳可以帮助缩减PE文件的大小,隐藏了PE文件内部代码和资源,便于网络传输和保存
通常压缩壳有两类用途,一种只是单纯用于压缩普通 PE 文件的压缩壳,而另一种则会对源文件进行较大变形,严重破坏 PE 文件头,经常用于压缩恶意程序
常见的压缩壳有:UPX、ASpack
加密壳
加密壳或称保护壳,应用有多种防止代码逆向分析的技术
由于加密壳的主要目的不再是压缩文件资源,所以加密壳保护的 PE 程序通常比原文件大得多。
目前加密壳大量用于对安全性要求高,对破解敏感的应用程序,同时也有恶意程序用于避免(降低)杀毒软件的检测查杀
常见的加密壳有:ASProtector、EXECryptor、Themida、VMProtect
壳的加载过程
以压缩壳为例
入口现场保存
加壳程序初始化时保存各寄存器的值,待外壳执行完毕后恢复各寄存器值,最后再跳到原程序的入口点OEP,通常用pushad/popad、pushfd/popfd指令对来保存和恢复现场环境
获取程序所需API地址
一般壳的输入表中有GetprocAddress、GetModuleHandle和LoadLibrary这几个 API 函数,也有函数在动态链接库DLL中
解密各区块数据
外壳一般按区块加密,有代码段、数据段和其他区块,程序执行时也按区块解密,并将解密的数据放回在合适的内存位置,让程序正常运行
初始化IAT
在壳的加载过程中,为了保护程序并控制对其的访问,壳会介入导入地址表IAT的初始化过程,因此在分析壳时需导入原程序所需系统API地址
调整重定位项
如果程序存在重定位项,壳可能会进行相应的调整,以适应加载到不同基地址的情况
Hook API
一些壳可能会在加载过程中,通过Hook系统API或其他技术手段,实现一些额外的保护功能,如反调试、代码混淆等
跳转回程序入口
执行相应的跳转指令,将控制权交还给程序,使其开始执行
参考资料:保护壳简介 - CTF Wiki (ctf-wiki.org)
脱壳
在介绍脱壳之前推荐个网站:爱盘 - 最新的在线破解工具包 (52pojie.cn)
方便懒懒们找工具,虽然不一定最新,但是方便
再提醒一遍,逆向工具容易报毒然后隔离,假如发现不能用可以看看电脑管家
查壳
当我们遇到一个加壳程序,第一步应该分析是什么壳,既可以根据经验直接判断,也可以通过查壳分析。
常见的查壳工具有Exeinfo PE,PEiD。虽然PEiD较经典,但年久失修,因此我们来简单讲一下Exeinfo PE如何看壳
将文件拖入Exeinfo PE
由图可知,文件名为Base.exe,64位,无加壳提示
随后我们对该文件进行UPX加壳,可以对比看一下
倒数第二行提示该文件加了UPX壳,倒数第一行给了try upx.exe -d的建议
注1:其实Exeinfo PE还有其他功能,受编者能力所限暂时不细讲
注2:UPX是简单并且常见的壳,所以我们大多以此为例子
脱壳机脱壳
网络上对于某些壳会有专门的脱壳机,服务懒懒们,拖入文件即可
但个人觉得,不是很泛用,比如这个脱壳机就不能解决upx.exe -d,会报错
命令行脱壳
某些壳开源并且广为流传,会有专门加壳脱壳文件,因此我们可以借此利用命令行进行脱壳
以UPX为例可以看这个:upx命令行脱壳_M0th@n的博客-CSDN博客
这是上述try upx.exe -d的有效解决方案
手动脱壳
当然,也会存在上述方案无法解决的情况,这就需要我们亲自调试程序的执行
常用工具有ollydbg,x64dbg,windbg
这个相对复杂,有时间再讲(狠狠地鸽一下嘿嘿嘿