8.1.1 被破解对象的原型

8.1.1 被破解对象的原型

为了更形象地说明本节讨论的内容,我们将使用被破解对象的原型——模拟的DRM(数字版权保护系统)播放器来说明问题。以下代码清单给出的就是这个播放器的代码,图8.1是这个播放器的草图。

图8.1 播放器的草图

这个程序的主要作用是读入已被加密的音频数据,把这些数据解密出来,再把明文的数字音频信号解码成模拟信号,并把它发送到声卡上。解密过程中需要两个密钥:一个是用户提供的,另一个则是存放在播放器中的。

除了完成程序主要功能的代码之外,播放器中还带有软件保护代码。防篡改检测代码计算整个二进制代码的hash,并把计算结果和正确的值相比较,从而确定程序是否遭到了篡改。用户合法性验证的具体实现方法是:检查用户输入的激活码是否正确,以及当前日期是否已经超过软件的使用期限。如果用户的合法性验证没有通过的话,程序就会执行反制措施,这段代码中的die()函数将把变量key的值设为NULL,这会导致程序不能正确地将音频解密出来。最后,用点状虚线框出的是用来追踪盗版源头的用户指纹。用户指纹对于每个版本的程序来说都是不一样的,在这个演示程序中,它的值是0xb0b5b0b5。

在这个原型中,die()函数总是用同一种方式(让程序不能正确地进行解密)来保护程序的。而在实践中,你可能想让程序针对不同的情况(比如用户输入错误的激活码,程序超过使用期限,或者程序发现它自己已经被修改了)作出不同的回应。