先说说“壳”这件事
说到软件外壳,大家应该都不陌生。自然界里,植物用壳保护种子,动物用壳保护身体,本质上都是在核心外面加一层防护。而在计算机软件的世界里,同样存在一段特殊的程序——它专门负责保护软件不被非法修改或反编译。这段程序通常先于原始程序运行,拿到控制权后再执行保护任务。就像动植物的壳长在身体外面一样,这类程序也被形象地称为“软件壳”或“保护壳”。(当然,后来也出现了所谓的“壳中带籽”的变种。)
从功能上进行抽象,软件的壳和自然界中的壳其实相差无几——无非是保护和隐藏壳内的代码和数据。从技术角度来说,壳就是一段在原始程序之前执行的代码。在加壳过程中,原始代码可能被压缩、加密甚至变形。当加壳后的文件被执行时,壳代码先运行,把压缩或加密后的代码还原成原始程序,然后再把执行权交还回去。
软件的壳分类很多,比如加密壳、压缩壳、伪装壳、多层壳等等。这些壳的目标只有一个:隐藏程序真正的OEP(入口点),防止被破解。关于壳以及相关软件的发展历史,可以阅读吴先生的那篇《一切从“壳”开始》,这里不再赘述。
壳的概念
开发者写完软件后,编译成exe可执行文件。为什么会想到加壳?主要有几个原因:
一是版权保护。有些信息不想让别人随便改动,比如作者的署名。为了保护软件不被破解,加壳是最常见的做法。
二是压缩体积。让程序小一点,更方便使用。于是出现了能压缩exe文件的加壳工具。
三是安全领域的应用。在黑客界,给木马等软件加壳或脱壳,以躲避杀毒软件的检测。
能实现上述功能的软件,统称为加壳软件。
加壳软件
最常见的:ASPACK、UPX、PEcompact。
不那么常见的:WWPACK32、PE-PACK、PETITE、NEOLITE。
侦测壳和编写语言的软件
脱壳之前,首先要搞清楚壳的类型。这就需要用到侦测工具:
1. 侦测壳的软件:fileinfo.exe(简称fi.exe),侦测壳的能力极强。
2. 二合一的侦测工具:language.exe,既能查壳也能检测编写语言。推荐language2000中文版,专门检测加壳类型。
3. 常见的编写语言:Delphi、VisualBasic(VB,最难破解)、VisualC(VC)。
脱壳软件
加壳是开发者为了保护代码和软件产权常用的手段。有盾自然就有矛,市面上已经有大量成熟的脱壳工具。软件脱壳分为手动脱和自动脱两种。先介绍自动脱壳,因为手动脱壳需要汇编语言基础和断点跟踪能力,不太适合初学者。
加壳本质上属于软件加密,而越来越多的软件经过压缩处理,给汉化带来了不少麻烦。软件汉化爱好者也不得不掌握这项技能。目前脱壳分手动和自动两类。手动脱壳需要用到TRW2000、TR、SOFTICE等调试工具,对汇编语言和软件调试知识有一定要求。自动脱壳则是用专门的脱壳工具来操作——最常用的做法是,每种压缩软件都有对应的反压缩工具。有些压缩工具自身就支持解压(如UPX),有些不提供这个功能(如ASPACK),就需要用UNASPACK来对付。好处是操作简单,缺点是版本更新后可能失效。
另外,还有一种通用的脱壳工具是PROCDUMP v1.62,能对付目前大多数压缩软件的压缩档。下面介绍一些通用方法和常用工具,供大家参考。知道了文件的加密方式,就能选择对应的工具和方法进行脱壳。
脱壳的基本原则:单步跟踪,只能往前,不能往后。
脱壳的一般流程:查壳 → 寻找OEP → Dump → 修复。
找OEP的思路:先判断壳是加密壳还是压缩壳。压缩壳相对容易,一般没有异常,找到对应的popad后就能到达入口,跳转方式通常是固定的。
知道了文件被哪种压缩加壳软件加密,下一步就是分析加密软件的名称和版本。不同软件甚至不同版本加的壳,脱壳处理的方法都不一样。
常用脱壳工具
1. 文件分析工具(侦测壳的类型):Fi、GetTyp、peid、pe-scan。
2. OEP入口查找工具:SoftICE、TRW、ollydbg、loader、peid。
3. Dump工具:IceDump、TRW、PEditor、ProcDump32、LordPE。
4. PE文件编辑工具:PEditor、ProcDump32、LordPE。
5. 重建Import Table工具:ImportREC、ReVirgin。
6. ASProtect脱壳专用工具:Caspr(ASPr V1.1-V1.2有效)、Rad(只对ASPr V1.1有效)、loader、peid。
各类壳的脱法
(1)Aspack:用得最多,用UNASPACK或PEDUMP32脱壳即可。
(2)ASProtect:次之,国外软件多用它加壳。脱壳需要SOFTICE、ICEDUMP,需要一定专业知识。最新版暂时没有解决方案。
(3)UPX:可以用UPX本身脱壳,注意版本一致,使用 -d 参数。
(4)Armadill:可以用SOFTICE、ICEDUMP脱壳,比较麻烦。
(5)Dbpe:国内较好的加密软件,新版本暂时不能脱,但可以破解。
(6)NeoLite:可以用自己脱壳。
(7)Pcguard:用SOFTICE、ICEDUMP、FROGICE脱壳。
(8)Pecompat:用SOFTICE配合PEDUMP32脱壳,不需要专业知识。
(9)Petite:部分老版本可用PEDUMP32直接脱壳,新版本需要SOFTICE、ICEDUMP,需要一定专业知识。
(10)WWpack32:和PECOMPACT类似,部分老版本可用PEDUMP32直接脱壳,但有时资源无法修改,也就无法汉化。最好用SOFTICE配合PEDUMP32脱壳。
平时最常用的通用脱壳软件是Procdump32,它能解开绝大部分加密外壳,还支持脚本功能,可以轻松解开特定外壳的加密文件。另外,很多时候还需要用到exe可执行文件编辑软件UltraEdit(汉化注册版,注册机可网上搜到)。用UltraEdit打开一个中文软件——如果加了壳,许多汉字无法被识别;如果未加壳或已脱壳,汉字就能正常显示。UltraEdit也可以用来检验壳是否脱掉。熟练之后,还能用它的替换功能替换作者姓名为你自己的名字,注意字节必须相等:两个汉字替两个,三个替三个,不足处在左边用00补。
常见壳的脱法举例
1. Aspack壳:可用unaspack或caspr。
unaspack:类似language,傻瓜式软件,运行后选取待脱壳的软件即可。缺点是只能脱较早版本的aspack壳,不能脱高版本。
caspr(两种用法):第一种,待脱壳的软件(如aa.exe)和caspr.exe在同一目录,运行菜单“运行”,输入 caspr aa.exe,脱壳后的文件名为aa.ex_,删除原aa.exe,将aa.ex_改名为aa.exe。类似fi的用法。优点是可脱任何版本的aspack壳,脱壳能力极强。缺点:DOS界面。第二种,直接将aa.exe的图标拖到caspr.exe的图标上。
注意:如果已侦测出是aspack壳,用unaspack脱壳出错,说明是高版本,用caspr脱即可。
2. UPX壳:用UPX本身脱壳。待脱壳的软件(如aa.exe)和upx.exe在同一目录,运行菜单输入 upx -d aa.exe。
3. PEcompact壳:用unpecompact。类似language,傻瓜式软件,运行后选取待脱壳的软件即可。
4. Procdump:万能脱壳但不精,一般不建议使用。运行后先指定壳的名称,再选定欲脱壳软件,确定即可。脱壳后的文件大于原文件。
由于脱壳软件已经非常成熟,手动脱壳在实际操作中基本用不到。
