高 晓
(福建江夏学院电子信息科学系,福州350108)
随着计算机逐步地深入人们的学习、生活和工作等方方面面,软件行业也得到了迅速的发展,但同时我们也看到软件盗版现象日益猖獗,计算机的信息安全面临着越来越严重的威胁。软件开发者为了维护自身以及软件购买人的利益,保护科研成果、技术和版权,有必要对软件进行加密保护,然而另有一些软件人员为提高自己的编程水平或其他目的,会针对出现的保护方式进行跟踪分析,找出相应的方法或制作出破解工具软件破解软件的保护。这样,随着软件业的发展,相互对立的软件保护技术和破解技术也发展壮大了起来。本文就软件的破解和保护进行简单的探索与分析。
破解是击败、绕过或清除各种拷贝保护机制的“暗黑艺术”。最初,破解主要是针对注册序列号、硬件密钥等的软件保护方案,近来,破解也被应用于数字版权管理技术——致力于保护电影、音乐唱片和书籍等受版权保护的资料。破解与逆向工程有着密切的联系,想要攻击任何一种基于软件的保护机制,破解者首先必须要准确地了解这种保护机制是如何工作的。这里我们举个破解范例说明破解的过程。
1.1.1 CrackerMe程序的VC++实现
可以看出,如过我们能够改变IsVerify的判断流程,那么整个流程的运行结果将会发生颠覆。原来正确的授权码将变成错误的,而原来不正确的输入将变成正确的。
1.1.2 逆向分析CrackerMe
我们可以启用逆向工具软件OD,并加载CrackerMe.exe文件,通过逆向代码分析定位到内存地址0x00401103处的JNE语句为if(IsVerify==1)判断的跳转代码,对应的机器码为0x75 0x34(图1)。
图1 暴力破解位置
机器码0x75表示JNE(不相等则跳),而机器码0x74表示JE(相等则跳),因此,如果我们有办法把位于内存地址0x00401103处的0x75改成0x74,那么颠覆代码的目标将会实现。
1.1.3 CrackerMe的PE架构
我们使用LordPE软件查看CrackerMe.exe的PE文件架构(图2),如入口地址(程序运行开始的地方、镜像基址(装载基址)、代码基址等)。
图2 LordPE查看Cracker.exe的PE文件布局
从中我们已经获得了足够的信息(图3),包括:
图3 LordPE查看Cracker.exe的区段表
(1)JNE在内存中的地址(VA)0x00401103;
(2)装载基址0x00400000;
(3).text区段的节偏移为0。
根据文件偏移地址=VA-装载基址-节偏移,得到内存地址0x00401103对应的PE文件偏移地址为0x00001103。
1.1.4 CrackerMe的修改
使用UE对CrackerMe.exe的PE文件进行修改,将文件偏移地址为0x00001103处的0x75改为0x74(图4~5)。
图4 修改前原PE文件
图5 修改后PE文件
在此用OD打开CrackMe.exe,可以看到内存地址0x00401103处的0x75变成了0x74(图6)。代码也发生了变化。
图6 用OD加载修改后的CrackMe.exe
至此,我们已经完成了一次破解,使软件的代码流程发生了变化。
软年破解的方法和具体流程有很多种,不管哪种破解方法,基本上都遵循以下几个步骤[1]:
(1)查看软件是否加壳。所谓“加壳”,就是用专门的工具或方法在应用程序上加入一段如同保护层一样的代码,使原程序失去本来面目,从而防止程序被非法修改和反汇编。软件加壳的主要目的有两个:一是保护,二是压缩。
(2)如果有壳的话,就脱壳。为了对软件代码进行分析,去除其中的保护信息和干扰信息,还原软件的本来面目,这个过程称为脱壳。可以使用脱壳软件或手动的方式对软件进行脱壳,常用的脱壳软件有ProcDump、GUW32和UN-PACK等。手动脱壳需要熟悉PE文件格式,同时还需要借助于一些辅助工具,如W32Dasm、LordPE、文件位置计算器、冲击波等,技术含量比较高。
(3)使用Ollydebug调试要破解的软件程序。OD是一款集成了反汇编分析、十六进制编辑、动态调试等多种功能于一身的功能强大的调试器。通过查看反汇编的程序代码,找到软件的注册过程、软件的加密算法等,进而通过跳转软件的运行流程达到破解软件的目的或编写注册机完成软件的注册。
(4)修改程序。根据找到的关键代码,使用十六进制编辑器或汇编编辑功能来修改这些关键机器码或汇编代码。
(5)制作注册机。掌握了软件的加密算法后,可以自行制作出一个注册机,用来生成注册码,完成软件的注册,比如可以用Delphi来编写注册机,彻底完成软件的破解。
常用的软件破解工具有:PEiD,SoftICE,IDA Pro和W32Dasm。W32Dasm和IDA等工具适合分析程序文件,不能对分析的程序进行修改,如果需要对可执行文件进行编辑和修改等,需要使用专门的编辑工具,比较常用的十六进制编辑器有Hiew、Ultra Edit、Hex Workshop和 WinHex等,这些软件都有很优异的二进制代码编辑能力。
1.3.1 暴力破解法
是一种针对于密码的破译方法,根据组合原理,将数字、字母的组合逐个推算、测试直到找出真正的密码为止。理论上利用这种方法可以破解任何一种密码,对于简单的密码破解,是很有效果的,但耗时长,且当密码比较复杂时(数字与字母组合),就不容易破解了,这时常常采用字典档和密码规则设定来减少这种遍历。
1.3.2 注册机破解法[2]。
注册机是一个专门用于分析修改软件内部程序信息的专用软件,分为内存注册机和算法注册机两种,内存破解法就是先加载破解程序(内存注册机),再通过它去读取内存中软件的注册码,或修改内存中软件相关的某些数据,来达到破解软件的目的。内存注册机在使用时需导入原程序文件安装目录下,点击后自动运行,完成破解原程序文件的注册信息。内存注册机的版本必须与所要破解的原文件版本相一致,否则不能起到破解作用。算法注册机是在破解者分析了软件的注册码算法后,制作出来的一种可以自动生成软件注册码的程序。通过用户提供的注册信息计算出软件的注册码或注册序列号,再将该序列号填入原程序文件注册序列号栏中完成注册。算法注册机在使用时,不需导入原程序文件的安装目录下,可以存放在硬盘任何位置。
1.3.3 补丁破解法
补丁破解法是指用相关的补丁程序来修改软件,以达到破解软件的目的,此方法一般是破解软件的验证注册码或时间,基本上都是修改原程序的判断语句。
1.3.4 文件注册法[3]
是一种把自己的软件注册内容放到一定的地方,为自己和别人用到注册内容的时候提供方便,常见的文件注册法有注册表导入和注册文件两种方法。注册表导入是通过运行存放软件注册码的.reg注册表文件进行注册,破解的操作步骤是先安装软件,然后双击它的.reg破解文件,出现是否导入注册表的询问窗口后,点击“确定”完成注册。注册文件的注册方式是将注册文件复制到软件的安装目录,当软件运行时自动读取注册文件里的信息来验证注册的正确性。
软件加密技术主要实现以下4个功能:
(1)防止非法复制,软件在使用过程中无法完整复制,即使软件被复制了也无法得到完整可用数据,不能使用。
(2)防非授权安装使用,主要是在非授权的情况下用户即使得到软件完整文件也无法安装使用。
(3)防恶意分析攻击,软件一经售出,程序文件就在使用者手中,需要防止使用者恶意分析软件以实现非法复制和分析。
(4)数据访问控制,用户在使用过程中对数据应有不同级别的访问权限,禁止没有取得相应授权的用户越权访问数据。
根据软件保护是否依赖特定的硬件,分为硬加密软件保护和软加密软件保护。
2.2.1 磁盘检查保护[4]
最早的磁盘保护是检查KeyDisk软盘,程序通过检查KeyDisk中的加密磁道来确认用户是否合法。光盘保护同样注重反拷贝、反刻录功能,现行的保护法有:光盘狗技术,通过识别光盘上在压制生产时自然产生的特征来区分是否原版盘,在翻制光盘时该特征无法提取和复制;CPPM技术,通过在盘片的导入区放置密钥来对光盘保护;CD_Protector软件加密技术,用可执行文件上的外壳判断运行的光盘上是否有加密后产生的轨道,将光盘内容拷到硬盘上不能使用,只有通过安装才行;FreeLock加密数据光盘,在正常的数据轨道后加上一个坏轨或多个与正常轨交替出现的坏轨,使目前大部分刻录软件因无法判别来源光盘的格式而拒绝复制;隐藏目录技术,用刻录软件和十六进制编辑器将存放保密文件的目录隐藏起来,使其在 Windows和DOS下均不能进入此目录,只有通过一个有口令的程序调用才能进入。
2.2.2 加密狗、加密锁[5]
加密狗是一种插在计算机USB口或并口上的软硬件结合的加密产品,通过对软件与数据的保护防止知识产权被非法使用,在基于硬件的软件保护上具有很高的安全性。软件开发者可以通过接口函数和软件狗进行数据交换来检查加密狗是否插在接口上。加密狗内置单片机电路,包含有专用于加密的算法软件,该软件被写入单片机后,就不能再被读出,这样就保证了加密狗硬件不能被复制。同时,加密算法是不可预知、不可逆的,使得加密狗具有判断、分析的处理能力,增强了主动的反解密能力。
基于软件的软件保护也叫软加密,这是一种不依赖于硬件的保护。目前比较常用的有以下几种方式。
2.3.1 用户访问密码保护
最简单的一种软件保护方式,通过给授权用户提供合法的注册用户名和密码,使其获的对软件的使用权。这种保护方式最容易被破解。
2.3.2 序列号保护方式
序列号保护是目前网络上和正版软件最常用的一种保护方式。网络上下载的共享软件一般都有使用时间或功能上的限制,当试用期过后,必须到这个软件的公司去注册后方能继续使用。注册过程一般是用户把自己的私人信息告诉软件公司,由该公司利用注册机算出一个序列号,以电子邮件或传真等形式发给用户,由用户进行信息的注册登记,一旦注册信息的合法性验证通过后,软件就会取消各种限制而成为完全正式版本。这种保护方式实现起来比较简单,不需要额外的成本,用户购买也非常方便,网络上80%的软件都是以这种方式保护的。
2.3.3 注册保护
注册文件是一种利用文件来实现注册软件保护的方式,只要将注册文件存入到指定的目录中,软件每次启动时,将从该注册文件中读取数据,然后利用某种算法进行处理,若结果判断为正确的注册文件,就让软件成为正式版。
为了增加破解难度,可以采用大一些的文件作为Key File,或加入一些垃圾信息来干扰解密者的企图;对于注册文件的合法性检查要尽可能地分成几部分,并分散在软件的不同模块中进行判断;对注册文件内的数据处理也尽可能采用复杂算法,不要使用简单的异或运算;可以让注册文件中的部分数据和软件中的关键代码或数据相互关联,以使软件无法被暴力破解。
2.3.4 菜单功能限制保护
功能限制的程序一般分为2种:(1)试用版和正式版是完全分开的2个版本,被禁止的功能代码只有在正式版中才有,而正式版只能向软件作者购买。对于这种程序因为破解以后仍然不会得到相应的功能,破解者破解该软件是没有什么意义的。(2)试用版和注册版为同一个文件,没有注册时,按照试用版运行,禁止某些功能的使用。一旦注册以后,就以正式版模式运行,用户可以使用全部功能。对于这种类型的程序,破解者只要通过一定的方法恢复被限制的功能,就能使该试用版的软件同正式版相同。
2.3.5 软件加壳保护[6]
加壳实质上就是把一段特殊程序附加到应用程序中,并把程序的执行入口指向附加的特殊壳程序。源程序不需做任何修改,只需选用一款加密强度够高、防脱能力够强的加壳工具,发布演示版时设置好软件试用次数或时间限制,发布正式版时启动加壳工具的注册验证,对原可执行程序加壳即可。这种加密方法使用简单方便,但知名的、好的加壳工具,往往都有对应的脱壳工具,不知名的加壳工具往往又防脱、加密算法强度不高,也容易脱除。
软件的破解与保护本身就是一对矛盾的关系。即使软件开发者穷尽脑汁编写各种保护措施,却最终免不了被破解,为了防范自己的软件不被别人复制,我们需要了解盗版者所使用的破解技术,进而研究好的加密方法,让盗版者在破解密码时因要付出巨大代价而被迫放弃攻击。在现行的中国软件保护措施较弱的情况下,我们要提高觉悟,尊重IT精英的成果,力所能及地不使用盗版,支持软件行业发展,最终达到保护软件的目的。
[1]付永钢,洪玉玲,曹煦晖,等.计算机信息安全技术[M].北京:清华大学出版社,2012:225-226.
[2]吕杨,李超.逆向工程之软件破解与注册机编写[J].计算机安全,2011(01):67-68.
[3]古铜.软件破解大揭密[J].计算机应用文摘,2004(9):65.
[4]郭勇,孔宝根.软件保护及破解策略[J].航空维修与工程,2004(3):38.
[5]孙克争.浅析软件的破解与保护[J].福建电脑,2010(8):95.
[6]黄玉波.软件防破解实用方法分析与实现[J].计算机与现代化,2008(12):115.