软件保护建议(转)
本节将给出关于软件保护的一般性建议,这些都是无数人经验的总结。程序员在设计自己的保护方式时最好能够遵守这里给出的准则,这样会提高软件的保护强度。
(1)软件最终发行之前一定要将可执行程序进行加壳/压缩,使得解密者无法直接修改程序。如果时间允许并且有相应的技术能力,最好是设计自己的加壳/压缩方法。如果采用现成的加壳工具,最好不要选择流行的工具,因为这些工具已被广泛深入地加以研究,有了通用的脱壳/解压办法。另外,最好采用两种以上的不同的工具来对程序进行加壳/压缩,并尽可能地利用这些工具提供的反跟踪特性。
(2)增加对软件自身的完整性检查。这包括对磁盘文件和内存映像的检查,以防止有人未经允许修改程序以达到破解的目的。DLL和EXE之间可以互相检查完整性。
(3)不要采用一目了然的名字来命名函数和文件,如IsLicensedVersion( )、key.dat等。所有与软件保护相关的字符串都不能以明文形式直接存放在可执行文件中,这些字符串最好是动态生成。
(4)尽可能少地给用户提示信息,因为这些蛛丝马迹都可能导致解密者直接深入到保护的核心。比如,当检测到破解企图之后,不要立即给用户提示信息,而是在系统的某个地方做一个记号,随机地过一段时间后使软件停止工作,或者装作正常工作但实际上却在所处理的数据中加入了一些垃圾。
(5)将注册码、安装时间记录在多个不同的地方。
(7)检查注册信息和时间的代码越分散越好。不要调用同一个函数或判断同一个全局标志,因为这样做的话只要修改了一个地方则全部都被破解了。
(8)不要依赖于GetLocalTime( )、GetSystemTime( )这样众所周知的函数来获取系统时间,可以通过读取关键的系统文件的修改时间来得到系统时间的信息。
(9)如果有可能的话,可以采用联网检查注册码的方法,且数据在网上传输时要加密。
(10)除了加壳/压缩之外,还需要自己编程在软件中嵌入反跟踪的代码,以增加安全性。
(11)在检查注册信息的时候插入大量无用的运算以误导解密者,并在检查出错误的注册信息之后加入延时。
(12)给软件保护加入一定的随机性,比如除了启动时检查注册码之外,还可以在软件运行的某个时刻随机地检查注册码。随机值还可以很好地防止那些模拟工具,如软件狗模拟程序。
(13)如果采用注册码的保护方式,最好是一机一码,即注册码与机器特征相关,这样一台机器上的注册码就无法在另外一台机器上使用,可以防止有人散播注册码,并且机器号的算法不要太迷信硬盘序列号,因用相关工具可以修改其值。
(14)如果试用版与正式版是分开的两个版本,且试用版的软件没有某项功能,则不要仅仅使相关的菜单变灰,而是彻底删除相关的代码,使得编译后的程序中根本没有相关的功能代码。
(15)如果软件中包含驱动程序,则最好将保护判断加在驱动程序中。因为驱动程序在访问系统资源时受到的限制比普通应用程序少得多,这也给了软件设计者发挥的余地。
(16)如果采用keyfile的保护方式,则keyfile的尺寸不能太小,可将其结构设计得比较复杂,在程序中不同的地方对keyfile的不同部分进行复杂的运算和检查。
(17)自己设计的检查注册信息的算法不能过于简单,最好是采用比较成熟的密码学算法。可以在网上找到大量的源码。
(1)软件最终发行之前一定要将可执行程序进行加壳/压缩,使得解密者无法直接修改程序。如果时间允许并且有相应的技术能力,最好是设计自己的加壳/压缩方法。如果采用现成的加壳工具,最好不要选择流行的工具,因为这些工具已被广泛深入地加以研究,有了通用的脱壳/解压办法。另外,最好采用两种以上的不同的工具来对程序进行加壳/压缩,并尽可能地利用这些工具提供的反跟踪特性。
(2)增加对软件自身的完整性检查。这包括对磁盘文件和内存映像的检查,以防止有人未经允许修改程序以达到破解的目的。DLL和EXE之间可以互相检查完整性。
(3)不要采用一目了然的名字来命名函数和文件,如IsLicensedVersion( )、key.dat等。所有与软件保护相关的字符串都不能以明文形式直接存放在可执行文件中,这些字符串最好是动态生成。
(4)尽可能少地给用户提示信息,因为这些蛛丝马迹都可能导致解密者直接深入到保护的核心。比如,当检测到破解企图之后,不要立即给用户提示信息,而是在系统的某个地方做一个记号,随机地过一段时间后使软件停止工作,或者装作正常工作但实际上却在所处理的数据中加入了一些垃圾。
(5)将注册码、安装时间记录在多个不同的地方。
(7)检查注册信息和时间的代码越分散越好。不要调用同一个函数或判断同一个全局标志,因为这样做的话只要修改了一个地方则全部都被破解了。
(8)不要依赖于GetLocalTime( )、GetSystemTime( )这样众所周知的函数来获取系统时间,可以通过读取关键的系统文件的修改时间来得到系统时间的信息。
(9)如果有可能的话,可以采用联网检查注册码的方法,且数据在网上传输时要加密。
(10)除了加壳/压缩之外,还需要自己编程在软件中嵌入反跟踪的代码,以增加安全性。
(11)在检查注册信息的时候插入大量无用的运算以误导解密者,并在检查出错误的注册信息之后加入延时。
(12)给软件保护加入一定的随机性,比如除了启动时检查注册码之外,还可以在软件运行的某个时刻随机地检查注册码。随机值还可以很好地防止那些模拟工具,如软件狗模拟程序。
(13)如果采用注册码的保护方式,最好是一机一码,即注册码与机器特征相关,这样一台机器上的注册码就无法在另外一台机器上使用,可以防止有人散播注册码,并且机器号的算法不要太迷信硬盘序列号,因用相关工具可以修改其值。
(14)如果试用版与正式版是分开的两个版本,且试用版的软件没有某项功能,则不要仅仅使相关的菜单变灰,而是彻底删除相关的代码,使得编译后的程序中根本没有相关的功能代码。
(15)如果软件中包含驱动程序,则最好将保护判断加在驱动程序中。因为驱动程序在访问系统资源时受到的限制比普通应用程序少得多,这也给了软件设计者发挥的余地。
(16)如果采用keyfile的保护方式,则keyfile的尺寸不能太小,可将其结构设计得比较复杂,在程序中不同的地方对keyfile的不同部分进行复杂的运算和检查。
(17)自己设计的检查注册信息的算法不能过于简单,最好是采用比较成熟的密码学算法。可以在网上找到大量的源码。