飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2355|回复: 0

[转贴] 怎样算是一个好的软件保护?

[复制链接]

该用户从未签到

发表于 2006-11-26 15:06:31 | 显示全部楼层 |阅读模式
编写一个好的软件保护并不是一件容易的事情,但是却也绝非不可能。请记住:如果你在程序中使用了一个公开的或被人所熟知的保护模块、动态连接库、控件或者是一种保护方法,那么可能会使Cracker(即破解者)的工作容易很多。大多数的Cracker都有很多专门针对这些公开保护模块或加密方法的破解工具和破解办法,目前有80~90% 的公开保护模块已经有了相对应的解密工具或方法,所以一个好的软件保护的关键是选用一种非公开的或者鲜为人知且有效的方法或者模块,这样可以使得Cracker花费更多的时间在你的软件保护上,或者使其放弃继续破解你的软件。
以下是我归纳总结的一个好的软件保护的特点以及规范,若你能妥善应用,将必定会有效的Anti-Crack。
1.在编程过程中尽量不要输入任何描述性的信息。
举个例子,如果你的程序中包含一个被命名为:“TestRegistration”的函数用来检测注册信息的正确性,那么当Cracker反汇编你的程序之后,将很容易的找到这个关键函数,从而有针对性的进行详细分析。又如:你将程序的注册窗体命名为:“REGFORM”,Cracker也会很快确定关键位置加以分析。这一条在使用Delphi,VB或者BC编译的软件中尤为突出。
2.在编译后的软件中应尽量避免多余的提示信息。
如果当用户输入了一段注册码后你的程序给出了提示信息,如“注册成功,感谢您使用XXXX……”或者“注册失败,注册码格式必须为XXXX……”等,那么你的这些提示信息将会以明码的形式保存在程序中,几乎通过任何一种反汇编工具,Cracker都可以很容易找到这些提示信息,从而确定关键的注册码计算位置,以及对比语句。如果你在编程的时候,加入了Anti-Crack代码,那么建议您当检测到用户有破解企图之后,不要给出任何提示信息,而是在系统的某个地方做一个记号,随机地过一段时间后使软件停止工作,或者装作正常工作但实际上却在所处理的数据中加入了一些垃圾。否则很容易被Cracker所发觉,并进行更彻底的修改。
若基于某些特殊情况必须加以提示,那么想办法实现动态创建这些对话框要比将这些提示信息以明码的形式保存在资源中,待需要的时候调用要好的多。
3.注册算法中应当至少使用一种标准加密算法。
强烈推荐您在你的程序中至少使用一种标准加密算法,个人推荐RSA1024,ECC或者DSA这三种对称算法,即使这种算法无法防止你的程序被破解,最起码也会使Cracker花费更多的时间来破解你的程序。若你在应用这些算法的时候使用得当,那么可以使Cracker没有办法做出你软件的注册机(KeyGen)。
4.随时验证注册信息的正确性
在一个不起眼的地方或者一个Cracker想不到的时间来验证注册信息的正确性或者程序的完整性是一个非常有效的保护方法,因为Cracker非常厌烦破解这种软件保护,它使得你的程序很难被真正破解.
5.尽量避免在用户输入完注册码后立即验证进行注册码验证
这样做会使Cracker难以确定你的程序验证注册码这部分代码的具体位置,从而加大破解的难度,比如很多共享软件在你输入完注册码后会要求你重新启动程序或强制关闭程序,等第二次启动的时候再在某一处验证你刚才所输入的注册信息的正确性。最终的目地都是让Cracker很难确定你程序真正判断注册信息正确性的代码位置。
同样的在用户输入完注册信息后执行一段无关紧要的判断代码,然后在其他地方再进行真正的注册验证也是一个不错的办法。
6.在你的程序中添加软件完整性验证信息。
若你在程序中添加了校验信息以及验证代码来判断程序的完整性,将使Cracker无法简单的通过破解补丁来修改你的程序,当然这对于内存补丁(Loader)可能不会有很好的效果,不过如果程序员设计得当,同样可以根据这一条完成对内存代码的CRC或者其他算法的校验,来使Cracker无法轻易从内存修改下手破解,当你能将这条妥善的应用后将会很有效的防止Cracker修改你的程序或者通过编写Loader来载入破解。与第三条搭配的话就是一个完整的Anti-Crack方案了。
7.分布验证可以使你的程序更难被破解.
若你能很好的应用第6并且在条件允许的情况下,建议您可以多次测试注册信息的正确性或程序的完整性,而不是一次验证,这样可以使Cracker难以明白你软件的完整注册算法,当你能妥善的使用多次验证的时候,Cracker通常都难以破解你的程序,因为他们常会漏掉一处或者多处验证点.
8. 应该充分利用“花指令”
“花指令”对于普通程序员来说可能是一个很难理解的概念,但相对的也是Cracker比较厌烦的一种软件保护方式。所以这条更多取决于编程人员的技术条件。在共享软件中有效的应用花指令,可以有效的防止多数反汇编软件对你的程序进行正常的反汇编,而且反汇编后的代码根本无法理解。
关于“花指令”的具体介绍和技术实现方法在网络中有大量的文章,我在此就不重复了,有兴趣的朋友可以自行翻查资料。
9.不要将用户的注册信息保存在容易找到的位置。
若你将用户的注册信息简单的保存在Windows的注册表中,或者一些明显的INI文件中等,将会使Cracker很容易的找到它们并进行替换或者修改,推荐将注册信息保存在一个不会被轻易猜测到的地方,比如命名为一个DLL文件存放在系统目录下或者将注册信息附加在一个一般不会被用到的系统文件末尾,这样即使Cracker使用监听工具来记录你程序的读写资料,也仍然需要花费很多时间来进行分析。
10.在注册算法中使用单一条件作为运算关键值.
在共享软件的注册算法中,应当尽量使用一些每个用户所独有的特征信息,比如使用者电脑中的硬盘序列号,CPUID,主板信息,BiOS信息等等,这样可以防止一个正版用户非法的在多台机器上注册,同时也可以避免当软件被Cracker破解后,通过发布一个正确的注册信息而流传。
11.不要在意您设计的注册码过长
很多软件的作者担心用户需要输入的注册信息过长而引起客户的烦感,其实这无伤大雅,一个足够长的注册码可以使Cracker难以理解并且可以有效的预防对注册码的穷举攻击,如果编程水平允许,完全可以在注册信息中包含一些程序运行必须的重要信息或者数据,这样当Cracker强行修改了你的程序跳过注册验证,将使它无法正常运行。
12.通过几个特定的系统文件,例如System.dat或Bootlog.txt来得到当前的系统日期。
若你的程序未注册版本进行了时间限制,则可以通过获取一些特殊的文件的日期来判断软件是否过期,不要依赖于GetLocalTime( )、GetSystemTime( )这样众所周知的API函数来获取系统时间,这样很难防止用户对日期进行非法修改。
13.如果你限制了未注册版本的某些功能,请确定这些功能的代码并没有写入限制版本中.
很多程序员经常把软件写成功能限制版本,只有在注册后才能使用全部功能(比如保存文件),在某些情况下,破解着可以修改程序代码解除这些限制,但如果你的软件中根本就不包含这种功能,Cracker就很难破解了.
14.如果你的程序被破解了,尽快发布新版本。
频繁的升级会使Cracker厌烦继续破解你的程序,尤其是当Cracker只能使用强行修改你的程序的方法来破解它的时候,因为破解补丁一般对修改后的程序是无效的。在不改变注册算法的前提下,使用正版的注册用户是不会怪罪你频繁升级的。
15.使用当前最优秀的动态压缩/加壳工具来保护你的软件
随时注意新的加壳工具,不断的尝试,使用。并关注哪些是Cracker头痛的,使用这些新的工具来保护你软件的新版本,一个好的加壳工具会有效的加大破解难度。
16.如果你的程序通过序列号注册,那么请确保正确的序列号永远不会完整的出现在内存中。
这样可以避免通过简单的搜索来得到您程序的正确注册信息,因为很多程序是通过对比正确的序列号和错误的序列号两个字符串来验证注册是否成功的,这使得Cracker可以通过简单的搜索或者调试来得到将要对比的正确序列号,而不需要知道你使用了什么方法产生了它。最好的办法是使用同样的方法来对用户输入的序列号和正确的序列号进行编码,然后对比编码结果, 这样就可以使正确的序列号不会出现在内存中,你也可以分很多步来验证用户输入的序列号的正确行,来确定用户输入的序列号并非是使用调试器从内存中得到的。
17.考虑在线注册。
互联网是一个很好的注册媒介,在线注册也可以有效的防止你的程序被破解或增加Cracker破解你程序的时间。例如将一些程序的关键代码或文件保存在你的服务器上,用户点击注册按钮后,程序将注册信息发到服务器上进行验证,若验证成功则发送关键的代码或文件回到客户段,程序正常运行,反之程序则无论如何无法正常运行。若你的软件跟网络密切相关,且又能保证你的用户群都有联网的条件的话,那么我个人强烈推荐你考虑使用一些技术进行网络验证。
18.尽可能多的测试你的软件保护。
软件正式发布之前一定要在各类操作系统中进行详细的测试。因为通常一些保护方法或者模块或者加壳后的程序可以正常运行在Win9X系统下,但是却无法在NT内核的操作系统中运行。


后话:
我认为,依目前的技术和设备来讲是不存在无法被破解的软件的,加密和解密是一个永远争论不休的话题,任何一方找到了新的方法或应用了新的技术另一方都会很快出现与之对应的新技术和新方法,即使你能完全的掌握上面的所有规则并能妥善的理解并应用,也没有任何人敢保证你的软件会不被破解,我们所希望的就是能达到:相对难以破解,或者破解你软件所需要的成本超出你软件本身的价值,这样就足够了。

推荐几个我认为相对来说比较优秀的加壳工具:
ASProtect v1.23
这个壳在pack界当选老大是毫无异议的,当然这里的老大不仅指它的加密强度,而是在于它开创了壳的新时代,seh和各种流行的anti,bpm断点的清除都出自这里,更为有名的当属rsa的使用,使得demo版无法被crack成完整版本,code_dips也源于这里。it的处理即使到到现在看来也是很强的。他的特长在于各种加密算法的运用,这也是各种壳要学习的地方。但是他的缺点就在于anti 太温柔,最终让各位老大们轻松的进行研究,这个壳就失败在这个地方。
Krypton 0.5
这个壳的特点是它使用了多线程,据我所知是第一个在壳中使用多线程的工具。但强度一般,兼容性也不够理想,很多情况下根本无法成功给软件加壳。
Armadillo
最新版本应该是3.20。这是一款非常优秀的保护软件,应用了很多新的优秀技术和理念。可以运用各种手段来保护你的软件,同时也可以为软件加上种种限制,包括时间、次数,启动画面等等。
ACProtect 1.10
该壳变形做得好,强度和aspr新版差不多,并且提供详细的SDK和帮助文件,作者是中国人,新版中加入了API分解技术,可以将你软件中的一些API和壳中包含的API进行替换,使加壳后的程序更难脱壳
Xtreme-Protector
这个可以说是目前最强悍的壳,也是驱动程序使用最为熟练的一个壳,驱动有解码,anti的作用,多线程解码,RUNTIME解码,繁多的花指令。用SOFTICE脱这个壳基本是不可能的!除非用一个不依靠INT3、INT1 和 DRX来下断点的调试器....
DingBoy's PELock
中文名称:“幻影(DBPE)”是目前公认的国产加壳工具中相对来说最强悍的,作者DingBoy是一个非常优秀的Cracker以及Coder,Anti比较强悍,而且带有烦杂的花指令,但是跟上述的一些国外加壳工具来比仍然有一些不足,DingBoy也在不断完善这个工具。

还有新壳不断的涌现中……
PYG19周年生日快乐!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表