论文部分内容阅读
[摘 要]本文主要介绍软件的常规保护方式及破解手段。
[关键词]软件逆向工程,软件破解,脱壳,动态调试
中图分类号:TP309.7 文献标识码:A 文章编号:1009-914X(2015)24-0161-01
1 引言
作为软件维护中的一项重要技术,逆向工程可以帮助开发人员更好的理解源代码,熟悉软件的工作流程,从而编写出更优秀的软件供用户使用,但随着这种技术的不断发展,越来越多的软件骇客(Cracker)将其用来破解商业软件的保护机制,甚至通过分析软件的工作原理,还原出有用的核心功能代码,用于新软件的开发。
2 软件保护
早期的软件保护,主要依靠序列号验证,通常在软件启动后,会出现一个注册提示,输入正确的注册码后,才能够使用该软件的完整功能,但随着大量逆向分析工具的出现,软件的可执行文件可以被轻易修改,这种保护方式就形同虚设了。之后的商业软件普遍采用了在序列号验证的基础上加“壳”保护的方式,其主要目的就是防止软件被非法修改或反编译,而软件的破解就是要先“脱壳”处理,然后解除注册验证。
2.1 加“壳”保护
所谓加“壳”,就是利用加壳软件,将一段代码,像防护层一样附加到软件的可执行文件中,运行软件后先执行“壳”代码,将软件中被压缩加密的代码解压解密后,再将控制权交给软件本身。
“壳”的种类很多,一般分成两大类:压缩壳和加密壳;前者只是将软件的二进制文件进行压缩,类似于 zip、rar 等压缩软件,只不过生成的是可执行文件,目的是减小可执行文件的体积,方便传播或存储,常见压缩壳有 UPX、ASPack 等;
加密壳通常也有压缩功能,但更重要的是将软件代码进行加密,尤其是涉及到软件关键功能的部分,这种壳通常属于商业软件,用户可以通过购买SDK的方式,将加密代码嵌入到自己开发的程序源代码中,达到源代码级防护的目的,常见有ASProtect、Armadillo 等。
大多数加密壳都有反调试功能,或者叫反跟踪功能,主要是针对调试器,目的是阻止调试器对程序代码的跟踪分析,因此在调试时,如果不采取反反跟踪的措施,调试器可能根本无法启动,甚至每次调试都会导致系统崩溃。
脱壳就是去除附着在软件可执行体上的壳代码,将解密后的原始执行文件提取出来,通过必要的修复,使可执行体能够正常运行,没有任何功能损失。一般分为手动脱壳和自动脱壳,后者需要专用的脱壳软件,但是加壳软件种类繁多,而且同一个加壳软件的不同版本间又会有很多差异,所以大部分软件只能手动脱壳,但这种方式技术复杂度比较高。
2.2 序列号保护
软件验证序列号的过程,其实就是验证用户名和序列号之间的数学映射关系。这种映射关系是由软件开发者制定的,其复杂度越高,序列号破解难度就越大。
程序检验注册码通常有一下几种方法:
1) 以用户名等信息作变量,通过函数变换获得注册码
序列号= F(用户名)
2) 通过注册码验证用户名的正确性
序列号 = F(用户名) 而且 用户名 = F-1(序列号)
3) 通过对等函数检查用户名和注册码
F1(用户名) = F2(序列号)
4) 同时将用户名和注册码作为自变量,采用二元函数
特定值 = F(用户名,序列号)
上面的函数映射关系就是解密的关键,但考虑到逆向的时间和人力成本,通常不会对过于复杂的算法进行跟踪分析,而是直接使用暴力破解的方式,强行让这种映射关系成立,那么,输入任意用户名和序列号,都可以成功注册。
为了防止验证算法被破坏,软件设计者会在程序中编写一段校验程序,对算法涉及到的关键代码进行校验,如果结果有误,则注册依然不成功。·
对于某些依赖网络的应用软件,设计者则采用网络验证的方式,将上面的映射关系保存到开发者的服务器中,用户输入的注册信息被发送到服务器进行验证,如果通过验证,则软件的所有功能会被解锁。
2.3 其他保護
除了加壳保护和序列号保护,软件开发者还可能会使用额外的保护措施,常见的有:
1) Nag警告
Nag本义是烦人的意思,Nag窗口是软件设计者用来不时提醒用户购买正式版的窗口。
2) 时间或使用次数限制
某些软件会在每次启动程序时,设定一个计时器,例如运行10分钟就停止,必须重新
应用程序才能正常工作;或是运行达到一定次数或时间,就提示购买。
3) 功能限制
程序运行正常,但某个菜单项或功能键无法使用或者只能使用有限的功能,需要输入序
列号或购买安装正式版才能启用相关功能。
4)CD-Check
通常应用于游戏或软件的安装光盘,每次启动软件时,会检查光驱中是否插入安装光盘,如果没有,就会拒绝运行。
这四类保护措施可以通过修改程序文件来解除,但对于前三者,如果软件是试用版,则可能根本不存在关键功能的可执行代码,那么就没有破解的必要了。
3 软件破解
3.1 常用工具
1)PEiD
一款著名的侦壳工具,原理是通过应用程序特征码,识别加壳类型,有三种扫描模式:正常扫描、深度扫描、核心扫描。附带各种增强插件,可以对一些简单的壳进行脱壳处理,或者对程序内部进行扫描并识别一些加密算法。
2)OllyDBg
简称OD,最常用的动态分析工具,工作在Ring3层,绝大部分壳都用它来调试分析,插件非常丰富,可以通过调用脱壳脚本,当自动脱壳机使用。
4) IDA
一款静态的、强大的、功能复杂的交互式反汇编工具,也可以用作调试器,但通常用于
反编译目标程序中的一些关键函数,或是分析程序的执行流程。
3.2 一般方法
1) 脱壳
使用OllyDBg 载入目标程序后,会得到程序的反汇编代码,根据PEiD侦测到的壳的特征,选用适合的分析策略、跟踪步骤和方法,并实时记录并保存跟踪过程中的关键数据,以减少调试失败的次数,必要时编写跟踪脚本,提高调试效率。最后要保证脱壳后的程序能够正常运行。
2) 分析算法
用 OllyDbg 载入脱壳后程序,直接运行,随意输入注册信息,根据软件提示跟踪找到注册过程,确定验证类型,分析加密算法,如果算法简单,可以尝试编写算法注册机,难度过大,则考虑通过修改验证函数的返回值,或者某些条件跳转,达到强制破解的目的。
3) 验证
验证已破解的程序是否能够正常运行,所有功能是否完整,如果有问题,可能是程序内部还有隐藏的注册验证代码,找出并重复2、3步,直到软件最终破解。
4) 编写注册机
如果已经分析得到软件的加密算法,则可以制作一个算法注册机,用来生成对应任何用户名的注册码,不用脱壳就可以直接输入注册信息,无限制使用软件的所有功能。如果是暴力破解,可以尝试编写内存注册机,用Loader的方式运行并实时修改程序中的关键判断,达到彻底破解的目的。
结束语
自己动手破解软件虽然是件有劳而获的体验,但还是属于非法获取软件所有权的行为,现在越来越多的人加入到免费甚至开源软件的行列,有更多的核心技术被挖掘出来,应该不断学习和开发新的技术,探索更为宽广的领域。
参考文献
[1] 段钢.加密与解密.3版.北京:电子工业出版社.2008.
[2] 看雪学院.软件加密技术内幕.北京:电子工业出版社.2004.
[关键词]软件逆向工程,软件破解,脱壳,动态调试
中图分类号:TP309.7 文献标识码:A 文章编号:1009-914X(2015)24-0161-01
1 引言
作为软件维护中的一项重要技术,逆向工程可以帮助开发人员更好的理解源代码,熟悉软件的工作流程,从而编写出更优秀的软件供用户使用,但随着这种技术的不断发展,越来越多的软件骇客(Cracker)将其用来破解商业软件的保护机制,甚至通过分析软件的工作原理,还原出有用的核心功能代码,用于新软件的开发。
2 软件保护
早期的软件保护,主要依靠序列号验证,通常在软件启动后,会出现一个注册提示,输入正确的注册码后,才能够使用该软件的完整功能,但随着大量逆向分析工具的出现,软件的可执行文件可以被轻易修改,这种保护方式就形同虚设了。之后的商业软件普遍采用了在序列号验证的基础上加“壳”保护的方式,其主要目的就是防止软件被非法修改或反编译,而软件的破解就是要先“脱壳”处理,然后解除注册验证。
2.1 加“壳”保护
所谓加“壳”,就是利用加壳软件,将一段代码,像防护层一样附加到软件的可执行文件中,运行软件后先执行“壳”代码,将软件中被压缩加密的代码解压解密后,再将控制权交给软件本身。
“壳”的种类很多,一般分成两大类:压缩壳和加密壳;前者只是将软件的二进制文件进行压缩,类似于 zip、rar 等压缩软件,只不过生成的是可执行文件,目的是减小可执行文件的体积,方便传播或存储,常见压缩壳有 UPX、ASPack 等;
加密壳通常也有压缩功能,但更重要的是将软件代码进行加密,尤其是涉及到软件关键功能的部分,这种壳通常属于商业软件,用户可以通过购买SDK的方式,将加密代码嵌入到自己开发的程序源代码中,达到源代码级防护的目的,常见有ASProtect、Armadillo 等。
大多数加密壳都有反调试功能,或者叫反跟踪功能,主要是针对调试器,目的是阻止调试器对程序代码的跟踪分析,因此在调试时,如果不采取反反跟踪的措施,调试器可能根本无法启动,甚至每次调试都会导致系统崩溃。
脱壳就是去除附着在软件可执行体上的壳代码,将解密后的原始执行文件提取出来,通过必要的修复,使可执行体能够正常运行,没有任何功能损失。一般分为手动脱壳和自动脱壳,后者需要专用的脱壳软件,但是加壳软件种类繁多,而且同一个加壳软件的不同版本间又会有很多差异,所以大部分软件只能手动脱壳,但这种方式技术复杂度比较高。
2.2 序列号保护
软件验证序列号的过程,其实就是验证用户名和序列号之间的数学映射关系。这种映射关系是由软件开发者制定的,其复杂度越高,序列号破解难度就越大。
程序检验注册码通常有一下几种方法:
1) 以用户名等信息作变量,通过函数变换获得注册码
序列号= F(用户名)
2) 通过注册码验证用户名的正确性
序列号 = F(用户名) 而且 用户名 = F-1(序列号)
3) 通过对等函数检查用户名和注册码
F1(用户名) = F2(序列号)
4) 同时将用户名和注册码作为自变量,采用二元函数
特定值 = F(用户名,序列号)
上面的函数映射关系就是解密的关键,但考虑到逆向的时间和人力成本,通常不会对过于复杂的算法进行跟踪分析,而是直接使用暴力破解的方式,强行让这种映射关系成立,那么,输入任意用户名和序列号,都可以成功注册。
为了防止验证算法被破坏,软件设计者会在程序中编写一段校验程序,对算法涉及到的关键代码进行校验,如果结果有误,则注册依然不成功。·
对于某些依赖网络的应用软件,设计者则采用网络验证的方式,将上面的映射关系保存到开发者的服务器中,用户输入的注册信息被发送到服务器进行验证,如果通过验证,则软件的所有功能会被解锁。
2.3 其他保護
除了加壳保护和序列号保护,软件开发者还可能会使用额外的保护措施,常见的有:
1) Nag警告
Nag本义是烦人的意思,Nag窗口是软件设计者用来不时提醒用户购买正式版的窗口。
2) 时间或使用次数限制
某些软件会在每次启动程序时,设定一个计时器,例如运行10分钟就停止,必须重新
应用程序才能正常工作;或是运行达到一定次数或时间,就提示购买。
3) 功能限制
程序运行正常,但某个菜单项或功能键无法使用或者只能使用有限的功能,需要输入序
列号或购买安装正式版才能启用相关功能。
4)CD-Check
通常应用于游戏或软件的安装光盘,每次启动软件时,会检查光驱中是否插入安装光盘,如果没有,就会拒绝运行。
这四类保护措施可以通过修改程序文件来解除,但对于前三者,如果软件是试用版,则可能根本不存在关键功能的可执行代码,那么就没有破解的必要了。
3 软件破解
3.1 常用工具
1)PEiD
一款著名的侦壳工具,原理是通过应用程序特征码,识别加壳类型,有三种扫描模式:正常扫描、深度扫描、核心扫描。附带各种增强插件,可以对一些简单的壳进行脱壳处理,或者对程序内部进行扫描并识别一些加密算法。
2)OllyDBg
简称OD,最常用的动态分析工具,工作在Ring3层,绝大部分壳都用它来调试分析,插件非常丰富,可以通过调用脱壳脚本,当自动脱壳机使用。
4) IDA
一款静态的、强大的、功能复杂的交互式反汇编工具,也可以用作调试器,但通常用于
反编译目标程序中的一些关键函数,或是分析程序的执行流程。
3.2 一般方法
1) 脱壳
使用OllyDBg 载入目标程序后,会得到程序的反汇编代码,根据PEiD侦测到的壳的特征,选用适合的分析策略、跟踪步骤和方法,并实时记录并保存跟踪过程中的关键数据,以减少调试失败的次数,必要时编写跟踪脚本,提高调试效率。最后要保证脱壳后的程序能够正常运行。
2) 分析算法
用 OllyDbg 载入脱壳后程序,直接运行,随意输入注册信息,根据软件提示跟踪找到注册过程,确定验证类型,分析加密算法,如果算法简单,可以尝试编写算法注册机,难度过大,则考虑通过修改验证函数的返回值,或者某些条件跳转,达到强制破解的目的。
3) 验证
验证已破解的程序是否能够正常运行,所有功能是否完整,如果有问题,可能是程序内部还有隐藏的注册验证代码,找出并重复2、3步,直到软件最终破解。
4) 编写注册机
如果已经分析得到软件的加密算法,则可以制作一个算法注册机,用来生成对应任何用户名的注册码,不用脱壳就可以直接输入注册信息,无限制使用软件的所有功能。如果是暴力破解,可以尝试编写内存注册机,用Loader的方式运行并实时修改程序中的关键判断,达到彻底破解的目的。
结束语
自己动手破解软件虽然是件有劳而获的体验,但还是属于非法获取软件所有权的行为,现在越来越多的人加入到免费甚至开源软件的行列,有更多的核心技术被挖掘出来,应该不断学习和开发新的技术,探索更为宽广的领域。
参考文献
[1] 段钢.加密与解密.3版.北京:电子工业出版社.2008.
[2] 看雪学院.软件加密技术内幕.北京:电子工业出版社.2004.