段刚-关于软件保护的若干忠告

来自《加密与解密》第17章
1. 尽量自行开发保护机制,不要依赖任何非自行开发的代码。
在不影响效率的情况下,可以用虚拟机保护软件处理需要保护的核心代码

2.不要依赖壳的保护。加密壳都能被解开或者脱壳。现在许多加密壳转向
虚拟机加密方向就是利用了这一特点。如果时间允许且有相应的技术能力,
可以设计自己的加壳压缩方法。如果利用现成的加壳工具,最好不要选择
流行的工具。保护强度与流行程度成反比。越是流行的工具,就越有可能
由于广泛深入地研究而有了通用的脱壳/解密办法。

3.增加对软件自身完整性的检查,包括对磁盘文件和内存映像的检查,以防止
有人修改程序,进而达到破解的目的。

4. 不要采用一目了然的名字来命令函数和文件,例如
IsLicenseVersion key.data 等。
所有与软件加密相关的字符串都不能以明文的形式直接存放在可执行文件中。
这些字符串最好是动态生成的。

5. 给用户的提示信息越少越好。因为任何蛛丝马迹都可能导致解密者直接
到达核心代码出。 例如,发现破解企图后,不要立即向用户发挥提示信息,
可以在系统的某个地方做一个记号,经过一段随机时间后使软件停止工作。
或者让软件“装作”正常工作,但在所处理的数据中加入一些”垃圾”.

6. 将注册码和安装时间记录在多个地方。

7. 检查注册信息和时间的代码越分散越好。
不要调用同一个函数 或者 判断同一个全局标志。
如果这样做,只要修改一个地方,其他地方就都破解了。

8. 不要通过一些众所周知的API来获取系统时间。可以通过读取关键系统
文件的修改时间来获取系统时间的相关信息。

9. 如果有可能,应采用连网检查注册码的方法,而且数据在网上传输时要加密。

10. 编程时在软件嵌入反跟踪代码,以提高安全性。

11. 在检查注册信息时插入大量无用的运算以误导解密者,并在检查出错误的注册信息后
加入延时机制。

12. 为软件保护增加一定的随机性。例如,除了在启动时检查注册码,还可以在
软件运行的某个时刻随机检查注册码。随机值还可以很好地防范那些模拟工具的解密
,例如软件狗模拟程序。

13. 如果采用注册码的保护方式,最好是一机一码,也就是注册码与机器特征相关。
这样,一台机器上的注册码就无法在另外一台机器上使用。
机器特征要从一些不可修改 的值上获取。也要防止API被hook

14. 如果试用版与正式版是独立的版本,可试用版本软件不具有某项功能,
则不要只禁用相关菜单,而要彻底删除相关代码,是编译后的程序中根本没有
相关的功能代码。

15. 如果软件中包含驱动程序,则最好将保护嗲吗放在驱动程序中。
驱动程序在访问系统资源时受到的限制比普通应用程序少得多,这也给软件设计者
提供了发挥的余地。

16. 如果采用keyfile的保护方式,则keyfile的体积不能太小。可以将其结构设计
得复杂一些,在程序的不同位置,对keyfie的不同部分进行复杂的运算和检查。

17. 自己设计的检查注册信息的算法不能过于简单,最好采用成熟的密码学算法。

设计加密方案时 应该多从解密的角度考虑,这样才能比较合理地运用各种技术。
当然,任何加密方案都无法达到完美的程序。
因此,在设计时,要考虑其他方面的平衡。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注