2.3壳与软件保护
"壳"是一段先丁被保护的程序运行的一段程序,在这段程序中对原有程序的代
码及数据进行斗『i应的还原解龠操作。它们附加在原程序上通过Windows加载器载入
内存后,先于原始程序执行,得到控制权,执行过程中对原始程序进行解密,还原,
还原完成后再把控制权交还给原始程序,执行原来的代码部分'。加壳程序的…般运
行过程如图2-3所示。按照"壳"的目的和作用,它可以分为两类:一类是压缩壳,
另'类是加密壳。第一类压缩壳主要通过琏缩文件的代码和数据来减小程序的体积。
而保护壳则用上了各种反跟踪技术保护程序不被调试、脱壳等。现在,随着加壳技术
的发展,这两类壳之间的界限也变得越来越模糊,有些壳在加密软件的同时还对代码
和数据进行压缩,这不但减少了文件在磁盘上所I.引1J的空问、有效的保护了软件不被
破解,在有些情况下还可能有效的提高了可执行文件的加载速度。随着脱壳技术的不
断发展,对软件加壳并不能有效保护软件。虚拟机技术的出现,软件保护者开始对软
件进行虚拟机保护。虚拟机能将指定的代码变形和虚拟化,处理后能够很好的隐藏代
码算法,防止算法被逆向和破解1。
2.3.1壳的保护
圈2-3加壳程序的-般运行过程
Figure 2-3 Running Process of Program Protected by Shel】
(1)压缩壳
压缩壳的特点就是能减小软件体积大小,加密保护不是其重点。目前兼容性和稳
定性较好的压缩壳有UPX、ASPack、PECompact等 。在我们所研究的内容中UltraSurf
采用UPX加壳。FreeGate最初版本采用ASPack加壳,在其后续的升级版本中采用
PECompact加壳。
UPX (the Ultimate Packer for Executables)是一款先进的可执行程序文件压缩器,
压缩过的可执行文件体积缩小50010 _70Cr/0,这样减少了磁盘占心空问、网络上传F载
的时间和其它分布以及存储费用。 通过UPX压缩过的程序和程序库完全没有功能
损失和脏缩之前'样可正常地运行,对于支持的人多数格式没有运行时间或内存的小
利后果。
ASPack是''款Win32可执行文件压缩软件,可以J长缩Window平台下EXE, DLL,
Ocx等类型的可执行文件。ASPack是一个经过特殊设计的压缩软件,经过它压缩的
口J一执行文件仍然町以止常运行。ASPack的文件压缩比率高达40%-70%,'岂不仪叮
以将文件的体积变小,而且当州户再次启动压缩后的应J书程序时,会发现该软件的运
行速度比未压缩前加快了不少,这对于提高系统性能也大有帮助'4l。
(2)加密壳
壳的种类除了}:述压缩壳外,还有加密壳。加密壳不仅对保护的文件有压缩的功
能,而且引入了加密,反调试,花指令等保护措施141。在我们的研究中,Garden软件
就使用了ASProtect SKE 2.X来保护闩己。
ASProtect足-款非常强大的Windows32位保护工具,这4、5年来,其t+直在更
新进步。它拥有压缩、加密、反跟踪代码、反一反汇编代码、CRC校验和花指令等保
护措施。它使用Blowfish、Twofish、TEA等强劲的加密算法,还用RSA1024作为注
册密钥生成器。它还通过API钩子与加壳的程序进行通信。甚至用到了多态变形引
擎,反APIhook代码和BPE32的多态变形引擎。并且ASProtect为软件开发人员提供
SDK,实现加密程序内外结合'4]。
2.3.2虚拟机软件保护
随着虚拟技术的发展,该技术被成功运用在软件保护的领域,越来越多的软件采
用虚拟机保护的方式。虚拟机fIh编译器、解释器、虚拟CPU环境和一个或多个指令
系统组成。虚拟机在运作的时候,先把己知的x86指令根据自定义的指令系统解释成
字节码,放在PE文件中,然后把原处代码删掉,进入虚拟机内执行代码。这样调试
者跟踪进入虚拟机后想理解程序流程必须对虚拟机引擎进行深入的分析,完整地得到
原始代码和P-code的对应关系。但这样复杂性太高,而且J:作繁重,对调试者来说
分析成本是不可按受的'4|。正是由丁这样的原凼,虚拟机已经成为最流衍的保护趋势。
虚拟机保护技术是以效率换安全的,往往一条原始汇编指令经过虚拟机的处理后
会膨胀儿l+倍甚至儿卣倍,执行速度会大大降低。但虚拟机保护一般提供SDK方式,
使用者一般只需要把较为重要的代码用康拟机保护起来,这样在一定程度上既确保了
程序的运行效率又保护了软件的核心算法。由于当前CPU速度越来越快,对于一般
程序用虚拟机保护后,不会太多影响程序性能04】。
2.3.3软件脱壳
壳是用来防止程序被逆向分析的。它们被商业软件合法地用于防止信息披露、篡
改及盗版。恶意软件也可咀用壳来保护向己的程序。由于大量恶意软件存在加壳现象,
研究人员和恶意代码分析人员为了分析代码,开始学习脱壳的技巧。但是随着时间的
推移,为防.L卜逆向分析人员分析受保护的程序并成功脱壳,新的反逆向技术也被不断
地添加到壳中。并且战斗还在继续,新的反逆向技术被开发的同时逆向分析人员也在
针锋相对地发掘技巧、研究技术并开发工具来对付它们。在该文中,脱壳是我们对目
标软件进行反汇编分析的前提。
脱壳的方法有两种:一种是借助专用的脱壳工具软件,另外一种是手动脱壳。
(1)借助脱壳工具脱壳
在使用脱壳软件脱壳前,需要知道壳的种类和版本号,因为对于不同的软件,甚
至不同版本的壳,脱壳处理的方法和工具都不'定相同。F1前成熟的套壳种类和舨本
的T具软件有Filelnfo、PEiD等。本文使用PEiD来识别壳。PEiD是一个可以自动完
成壳类型及'叫'执行程序的编译器类型的识别工具,目前它能识别大约400多种各类加
壳软件所加的壳。脱壳工具一般分为专用脱壳机和通用脱壳机。弩用脱壳机是针对某
种壳专门编写的,只能脱特定的壳。常见的专用脱壳机程序有waspack(ASPack 2.12
脱壳机),Upxfix(UPX脱壳机)。通用脱壳机具有通刚性,可以脱多种不同类型的壳,
主要是压缩壳,例如Quick Unpack、File Scanner等。
(2)手动脱壳
与借助软件工具脱壳不同,手动脱壳需要一定的技巧和经验,其过程一般分为寻
找OEP、抓取内存映像、PE文件重建三步131。
● 寻找OEP
入口点(OEP)是可执行文件被操作系统加载后执行的第一条指令的位置,也就是
记录在PE结构lIl的AddressOfEntryPoint这个DWORD类型的结构项中的值。壳程
序为了先与原来的代码获得执行的控制权,往往会更改该值。这样,加壳程序运行时,
首先执行外壳程序,外壳程序负责把州户原来的程序在内存中解压还原,并把控制权
交给解压缩后的真正程序。查找入口点的任务就是找到程序入口地址。一般说来,可
以通过根据跨段指令、内存访问断点、堆栈平衡原理来寻找OEP[3】。
●抓取内存映像
抓取内存映像就是把内存指定地址的映像文件读取出来,然后用文件的形式保存
下来。外壳程序解压还原后就会跳到真正的入口点执行,此时内存映象文件是已解压
缩的程序。这时就可以抓取内存映象文件了。抓取内存映象文件可以借助LordPE或
者Ollydbg中的一个插件OllyDump,也可以使用命令法,不过这需要手动修正OEP
和块表的偏移地址等【3】。
● 重建输入表
输入表结构小与实际运新相关的主要是IAT(输入地址表)结构,这个结果中用于
保存API的实际地址,因为壳一般都修改了原程序文件的输入表并自己模拟Windows
装载器的工作来填充IAT中相关数据,因此我们要根据这个被填充的IAT来还原输
入表的机构,这就是输入表的重建。这项工作可以借助ImportREC等专业的输入表
重建工具来完成
14
Powered by Zoundry