10.1.4 加壳

10.1.4 加壳

1.PC端

(1)壳的概念

在自然界中,植物用壳来保护种子,动物用壳来保护身体等。同样,在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。它们附加在原程序上通过Windows加载器载入内存后,先于原始程序执行,得到控制权,执行过程中对原始程序进行解密、还原,还原完成后再把控制权交还给原始程序,执行原来的代码的部分。加上外壳后,原始程序代码在磁盘文件中一般是以加密后的形式存在的,只在执行时在内存中还原,这样就可以比较有效地防止破解者对程序文件的非法修改,同时也可防止程序被静态反编译。由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,就把这样的程序称为“壳”了,如图10.5所示。

图10.5 程序加壳示意图

最早提出“壳”这个概念的,是当年推出脱壳软件RCOPY 3的作者熊焰先生。在DOS时代,“壳”一般都是指磁盘加密软件的段加密程序,可能是那时候的加密软件还刚起步不久,所以大多数的加密软件(加壳软件)所生成的“成品”在“壳”和需要加密的程序之间总有一条比较明显的“分界线”。有经验的人可以在跟踪软件的运行以后找出这条分界线来。

脱壳技术的进步,促进且推动了当时的加壳技术的发展。LOCK95和BITLOK等所谓的“壳中带籽”加密程序纷纷出笼,真是各出奇谋,把小小的软盘也折腾得够辛苦的了。国内的加壳软件和脱壳软件正在较量得火红的时候,国外的“壳”类软件早已经发展到像LZEXE之类的压缩壳了。这类软件其实就是一个标准的加壳软件,它把.EXE文件压缩了以后,再在文件上加上一层在软件执行时自动把文件解压缩的“壳”来达到压缩.EXE文件的目的。接着,这类软件越来越多,比如PKEXE、AINEXE、UCEXE和WWPACK都属于这类软件。奇怪的是,当时看不到一个国产的同类软件。

过了一段时间,可能是国外淘汰了磁盘加密,转向使用软件序列号加密方法,保护.EXE文件不被动态跟踪和静态反编译就显得非常重要了。所以专门实现这样功能的加壳程序便诞生了。MESS、CRACKSTOP、HACKSTOP、TRAP、UPS等都是比较有名气的本类软件代表。这样的软件才能算是正宗的加壳软件。

由于Microsoft保留了Windows 95的很多技术上的秘密,即便Windows 95已经推出三年多的时间,也没见过在其上面运行的“壳”类软件。直到1998年的中期,这样的软件才迟迟出现,而这个时候Windows 98也发布了一段日子。这类的软件不发布尚可,一旦发布就一大批地涌现出来。先是加壳类的软件,如BJFNT、PELOCKNT等,它们的出现使暴露三年多的Windows下的PE格式.EXE文件得到很好的保护。接着出现的就是压缩壳(Packers),因为Windows下运行的.EXE文件“体积”一般都比较大,所以它的实用价值比起DOS下的压缩软件要大很多。这类软件也很多,UPX、ASPack、PECompact等都是其中的佼佼者。随着软件保护的需要,出现了加密壳(Protectors),它用上了各种反跟踪技术保护程序不被调试、脱壳等,其加壳后的文件体积大小不是其考虑的主要因素,如ASProtect、Armadillo、EXECryptor等。随着加壳技术的发展,这两类软件之间的界线越来越模糊,很多加壳软件除具有较强的压缩性能,同时也有了较强的保护性能。

加壳软件一般都有良好的操作界面,使用也比较简单。除了一些商业壳,还有一些个人开发的壳,种类较多。壳对软件提供了良好保护的同时,也带来了兼容性的问题,选择一款壳保护软件后,要在不同硬件和系统上多测试。由于壳能保护自身代码,因此许多木马程序或病毒都喜欢用壳来保护和隐藏自己。对于一些流行的壳,杀毒引擎能对目标软件脱壳,再进行病毒检查。而大多数私人壳,杀毒软件不会专门开发解压引擎,而是直接把壳当成木马程序或病毒处理。

有加壳就一定会有脱壳。一般的脱壳软件多是专门针对某加壳软件而编写的,虽然针对性强、效果好,但收集麻烦,因此掌握手动脱壳技术十分必要。

(2)压缩引擎

一些加壳软件能将文件压缩,大多数情况下,压缩算法是调用现成的压缩引擎。目前压缩引擎种类比较多,不同的压缩引擎有不同特点,如一些对图像压缩效果好,一些对数据压缩效果好。而加壳软件选择压缩引擎有一个特点,在保证压缩比的条件下,压缩速度慢些无关紧要,但解压速度一定要快,这样加了壳的.EXE文件运行起来速度才不会受太大的影响。如下面几个压缩引擎就能满足这个要求:aPLib、JCALG1、LZMA。

(3)压缩壳

不同的外壳所侧重的方面也不一样,有的侧重于压缩,有的则侧重于加密。压缩壳的特点就是减小软件体积大小,加密保护不是其重点。目前兼容性和稳定性比较好的压缩壳有UPX、ASPack、PECompact等。

1)UPX

UPX是一个以命令行方式操作的可执行文件免费压缩程序,兼容性和稳定性很好。UPX包含DOS、Linux和Windows等版本,并且开源。官方主页:http://upx.sourceforge.net。

UPX的命令格式为:upx[-123456789dlth VL][-qvfk][-o file]file..

UPX早期版本压缩引擎是自己实现的,3.x版本也支持LZMA第三方压缩引擎。UPX除了对目标程序进行压缩外,也可解压缩。UPX的开发近乎完美,它不包含任何反调试或保护策略。另外,UPX保护工具UPXPR、UPX-Scrambler等可修改UPX加壳标志,使UPX自解压缩功能失效。

2)ASPack

ASPack是一款Win32可执行文件压缩软件,可压缩Win32位可执行文件.EXE、.DLL、.OCX,具有很好的兼容性和稳定性。官方主页:http://www.aspack.com。

(4)加密壳

加密壳种类比较多,不同的壳侧重点不同,一些壳单纯保护程序,另一些壳还提供额外的功能,如提供注册机制、使用次数、时间限制等。加密壳还有一个特点,越是名气大的加密売,研究的人也越多,其被脱壳或破解的可能性也越大,所以不要太依赖壳的保护。加密壳在强度与兼容性上做得好的并不多,这里向大家介绍几款常见的。

1)ASProtect

ASProtect是一款非常强大的Win32位保护工具,这款壳开创了壳的新时代。它拥有压缩、加密、反跟踪代码、CRC校验和花指令等保护措施。它使用Blowfish、Twofish、TEA等强劲的加密算法,还有RSA1024作为注册密钥生成器。它还通过API钩子与加壳的程序进行通信,并且ASProtect为软件开发人员提供SDK,实现加密程序内外结。SDK支持VC、VB、Delphi等。

ASProtect创建者是俄国人Alexey Solodovnikov,其将ASPack中的一些开发经验运用到ASProtect,该壳的编写简单而精巧,是一款经典之作。ASProtect特别注重于兼容性和稳定性,因此没有采用过多的反调试策略。

ASProtect目前有两个系列,一个系列是ASProtect 1.3x,另一个系列是ASProtect SKE 2.x。ASProtect SKE系列已采用了部分虚拟机技术,主要是在Protect Original EntryPoint与SDK上。保护过程中建议大量使用SDK,SDK使用请参考其帮助文档及安装目录下的样例,在使用时注意SDK不要嵌套,并且同一组标签用在同一个子程序段里。

由于ASProtect在共享软件里使用得相当广,因此大家研究的也多些,其各类保护机制已被研究得很透了,甚至可能都有脱壳机的存在。

2)Armadillo

Armadillo也称“穿山甲”,是一款应用面较广的商业保护软件。可以运用各种手段来保护你的软件,同时也可以为软件加上种种限制,包括时间、次数、启动画面等。其官方主页:http://www.siliconrealms.com。Armadillo对外发行时有Public、Custom两个版本。Public是公开演示的版本,Custom是注册用户拿到的版本。只有Custom才有完整的功能,如强大的Nanomites保护。Public版有功能限制,没什么强度,不建议采用。

Armadillo有如下保护功能:Nanomites、Import Table Elimination、Strategic Code Splicing、Memory-Patching Protections等。其中Nanomites功能最为强大,使用时,需要在程序里加入Nanomites标签。

用NANOBEGIN和NANOEND标签将需要保护的代码包括在内,Armadillo加壳时,会扫描程序,处理标签里的跳转指令,将所有跳转指令换成INT3指令,其机器码是CC。此时Armadillo运行时,是双进程,子进程遇到CC异常,由父进程截获这个INT3异常,计算出跳转指令的目标地址并反馈给子进程,子进程继续运行。由于INT3机器码是CC,因此也称这种保护是CC保护。

3)EXECryptor

EXECryptor是一款商业保护软件,官方主页:http://www.strongbit.com。其可以为目标软件加上注册机制、时间限制、使用次数等附加功能。这款壳的特点是Anti-Debug比较强大,同时做得比较隐蔽,另外就是采用了虚拟机保护一些关键代码。若使这款壳有强大的保护,必须合理使用SDK功能,将关键的功能代码用虚拟机保护起来。

4)Themida

Themida是Oreans的一款商业保护软,官方链接:www.oreans.com。Themida 1.1以前版本带驱动,稳定性有些影响。Themida最大特点就是其虚拟机保护技术,因此在程序中擅用SDK,将关键的代码让Themida用虚拟机保护起来。Themida最大的缺点就是生成的软件文件体积有些大。Win License这款壳和Themida是同一个公司的一个系列产品,Win License主要多了一个协议,可以设定使用时间、运行次数等功能,两者核心保护是一样的。

2.移动端

Android软件加壳实现对核心应用程序进行加固和保护,加大应用程序被逆向破解的难度。加壳的Android程序运行时,首先运行“壳”程序,“壳”程序解密并释放核心程序。“壳”程序中实现了对核心程序的加密和保护以防止被恶意分析和破解。常用的Android软件保护壳有ASProtect,Themida等。Android软件加壳技术对软件保护的效果较为明显。目前Android软件的核心程序为APK文件中的so库和.dex文件,对Android应用程序加壳主要是针对这两个核心文件采取相应的保护措施。

以Android应用运行原理的分层结构分析加固应用程序,其基本的构架具体如图10.6所示。

图10.6 Android应用加固基本框架

Android应用程序运行时在系统中以进程形式体现,进程创建完毕后从外存将.dex文件映射到进程的内存空间中,完成一系列的初始化后,由应用框架层抽象应用的主要运行逻辑。

在DVM、支持库中对应用框架层进行具体实现,从而完成程序的运行。而加固应用利用Android程序运行原理,在壳进程启动后,主动解密和加载被保护程序字节码,利用应用框架层中完成进程的生命周期;在运行时层实现了具体的安全加固技术,增加自我保护技术等,以实现对应用程序的加固。

(1)简单的加壳方案

加壳是在二进制的程序中植入一段代码,在运行时优先取得程序的控制权,做一些额外的工作。大多数病毒就是基于此原理。PC平台.EXE文件加壳的过程如图10.7所示。

图10.7 PC平台.EXE简单加壳的过程

(2)加壳作用

加壳的程序可以有效阻止对程序的反汇编分析,以达到它不可告人的目的。这种技术也常用来保护软件版权,防止被软件破解。

(3)Android Dex文件加壳原理

PC平台现在已存在大量的标准的加壳和解壳工具,但是Android作为新兴平台还未出现APK加壳工具。Android Dex文件大量使用引用给加壳带来了一定的难度,但是从理论上讲,Android APK加壳也是可行的。

在这个过程中,涉及三个角色。

①加壳程序:加密源程序为解壳数据、组装解壳程序和解壳数据。

②解壳程序:解密解壳数据,运行时通过DexClass Loader动态加载。

③源程序:需要加壳处理的被保护代码。

(4)两种Android Dex加壳方法

根据解壳数据在解壳程序Dex文件中的不同分布,提出以下两种Android Dex加壳的实现方案。

1)解壳数据位于解壳程序文件尾部

该种方式简单实用,合并后的Dex文件结构如图10.8所示。

图10.8 合并后的Dex文件结构

2)加壳程序工作流程

①加密源程序.APK文件为解壳数据;

②把解壳数据写入解壳程序Dex文件末尾,并在文件尾部添加解壳数据的大小。

③修改解壳程序DEX头中checksum、signature和file_size头信息。

④修改源程序Android Mainfest.xml文件并覆盖解壳程序Android Mainfest.xml文件。

3)解壳DEX程序工作流程

①读取DEX文件末尾数据获取借壳数据长度;

②从DEX文件读取解壳数据,解密解壳数据,以文件形式保存解密数据到a.APK文件;

③通过Dex Class Loader动态加载a.apk。

(5)解壳数据位于解壳程序文件头

该种方式相对比较复杂,合并后Dex文件结构如图10.9所示。

图10.9 合并后Dex文件结构

1)加壳程序工作流程

①加密源程序.APK文件为解壳数据;

②计算解壳数据长度,并添加该长度到解壳.DEX文件头末尾,并继续解壳数据到文件头末尾(插入数据的位置为0x70处);

③修改解壳程序.DEX头中checksum、signature、file_size、header_size、string_ids_off、type_ids_off、proto_ids_off、field_ids_off、method_ids_off、class_defs_off和data_off相关项,分析map_off数据,修改相关的数据偏移量;

④修改源程序Android Mainfest.xml文件并覆盖解壳程序Android Mainfest.xml文件。

2)解壳DEX程序工作流程

①从0x70处读取解壳数据长度;

②从DEX文件读取解壳数据,解密解壳数据,以文件形式保存解密数据到a.APK,通过Dex Class Loader动态加载a.APK。