关于软件注册的一点思考
之前写过一个共享软件的注册系统,并从中得到一些经验:
其实,软件注册从用户需求来说,是并不存在这种需求的,但是由于软件产品的特性(容易复制),决定了绝大多数的商业软件都要对其产品进行一定的保护,这种保护的目的就是让购买了其产品的用户能够正常使用,而未购买的用户只能试用或完全不能使用。
如何设计一个好的注册算法,并且防止那些好事者的破解不是一件容易的事,我的建议是尽量采用如md5,des等复杂的算法,并不止一次的调用它们,再加上自定义的加密函数并配上经典的CRC,Base64等可逆算法。你这么做的结果,我可以保证破解者无法轻易的写出软件的注册机来。
注册系统应该是一个坚固的系统,当然最基本的一点是在判断注册码是否正确的时候绝对不能出现明码,有很多软件就是这样被攻破的。如果注意到注册算法应该是一个对称的算法,这样的问题就不存在了,因为不需要知道真正的注册码就能判定用户所输入的注册码是否是正确的。当然要设计这样一个算法不是一个容易的事,不过我想到的是对于用户来说,注册码就是注册码,是合法使用软件的一个凭证,但对于软件来说,注册码不仅仅是注册码,应该还包含更多的信息,比如软件的标志,用户的标志等等。
当然,在注册算法设计好以后,应用到界面也应该注意几个问题,界面调用注册部分判断的时候,与注册相关的代码中的字符串应该是以某种形式加密后的字符串,这不会防止软件被破解,但至少会增加破解者的破解时间。
确信了算法的复杂度上面能够保证这个算法是安全的之后,我们还需要做一些陷阱来捕获破解者的企图。站在破解者的角度上,如果无法分析出软件的注册算法,那么另外一个解决办法就是所谓的爆破。
因此,软件的设计者应该尽量的设置多处的判断注册条件,要让破解者需要爆破多处代码.。当然,注册算法都有一个关键的函数,那就是判断注册码是否正确或是是否已经注册,这就需要使用一些技巧,以防止这些关键的函数被爆破,比如:注册系统应具有反爆破的功能,意思就是能够检测到判断注册的函数是否工作正常,如果不正常则可以启用后备函数或设置失效标志。还可以增加额外的注册检查代码,并要在满足某种条件(比如软件的执行次数,软件的使用时间)下才予以执行,因为破解者一般是安装了软件就开始破解,如果爆破后没有出现什么异常的话,一般来说这个破解是成功的;但是当发布后,当用户使用了一段时间以后,当条件满足并执行了增加的注册检查代码后,软件就会无法正常使用。
下面谈谈注册的相关信息的保存,常见的是保存到注册表和INI文件当中,这里面也有一些技巧,比如构造一个假的CLSID;还可以加密后存放到一个二进制文件中;
我有一个想法,其实利用文件的修改时间来存放一些信息,因为通常用户是不会注意文件的时间信息,只是文件的时间所能容纳的数字有限,不过可以用来放文件自身的校验值还是可行的。
补充一点,之前介绍的是被动的防破解,还有主动的防破解,比如:运行时检测父进程,检测当时是否有破解软件在运行,比如Ollydbg,W32Dasm,DeDe等,不过,在增加这些代码的时候,需要保证程序在不同的操作系统上都能够运行正常
当然,一个优秀的软件作者不应该把主要精力放在如何防止用户非法使用软件上,更应该积极听取用户意见,积极的修改软件以更好地满足用户的各种需求。
我花了中午的休息时间写了这么一段话,也算是对自己之前的工作的总结吧。
其实,软件注册从用户需求来说,是并不存在这种需求的,但是由于软件产品的特性(容易复制),决定了绝大多数的商业软件都要对其产品进行一定的保护,这种保护的目的就是让购买了其产品的用户能够正常使用,而未购买的用户只能试用或完全不能使用。
如何设计一个好的注册算法,并且防止那些好事者的破解不是一件容易的事,我的建议是尽量采用如md5,des等复杂的算法,并不止一次的调用它们,再加上自定义的加密函数并配上经典的CRC,Base64等可逆算法。你这么做的结果,我可以保证破解者无法轻易的写出软件的注册机来。
注册系统应该是一个坚固的系统,当然最基本的一点是在判断注册码是否正确的时候绝对不能出现明码,有很多软件就是这样被攻破的。如果注意到注册算法应该是一个对称的算法,这样的问题就不存在了,因为不需要知道真正的注册码就能判定用户所输入的注册码是否是正确的。当然要设计这样一个算法不是一个容易的事,不过我想到的是对于用户来说,注册码就是注册码,是合法使用软件的一个凭证,但对于软件来说,注册码不仅仅是注册码,应该还包含更多的信息,比如软件的标志,用户的标志等等。
当然,在注册算法设计好以后,应用到界面也应该注意几个问题,界面调用注册部分判断的时候,与注册相关的代码中的字符串应该是以某种形式加密后的字符串,这不会防止软件被破解,但至少会增加破解者的破解时间。
确信了算法的复杂度上面能够保证这个算法是安全的之后,我们还需要做一些陷阱来捕获破解者的企图。站在破解者的角度上,如果无法分析出软件的注册算法,那么另外一个解决办法就是所谓的爆破。
因此,软件的设计者应该尽量的设置多处的判断注册条件,要让破解者需要爆破多处代码.。当然,注册算法都有一个关键的函数,那就是判断注册码是否正确或是是否已经注册,这就需要使用一些技巧,以防止这些关键的函数被爆破,比如:注册系统应具有反爆破的功能,意思就是能够检测到判断注册的函数是否工作正常,如果不正常则可以启用后备函数或设置失效标志。还可以增加额外的注册检查代码,并要在满足某种条件(比如软件的执行次数,软件的使用时间)下才予以执行,因为破解者一般是安装了软件就开始破解,如果爆破后没有出现什么异常的话,一般来说这个破解是成功的;但是当发布后,当用户使用了一段时间以后,当条件满足并执行了增加的注册检查代码后,软件就会无法正常使用。
下面谈谈注册的相关信息的保存,常见的是保存到注册表和INI文件当中,这里面也有一些技巧,比如构造一个假的CLSID;还可以加密后存放到一个二进制文件中;
我有一个想法,其实利用文件的修改时间来存放一些信息,因为通常用户是不会注意文件的时间信息,只是文件的时间所能容纳的数字有限,不过可以用来放文件自身的校验值还是可行的。
补充一点,之前介绍的是被动的防破解,还有主动的防破解,比如:运行时检测父进程,检测当时是否有破解软件在运行,比如Ollydbg,W32Dasm,DeDe等,不过,在增加这些代码的时候,需要保证程序在不同的操作系统上都能够运行正常
当然,一个优秀的软件作者不应该把主要精力放在如何防止用户非法使用软件上,更应该积极听取用户意见,积极的修改软件以更好地满足用户的各种需求。
我花了中午的休息时间写了这么一段话,也算是对自己之前的工作的总结吧。