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