软件保护之注册算法篇
fangle 2003
一、前言
通常地,软件保护可分为三大环节:反调试、抗分析、防爆破
1、反调试,给你的软件引入非常规的运行机制,例如加壳,来限制调试工具对你的软件的掌控
能力。如今调试工具越来越强大,但调试工具的设计目标毕竟是光明正大的,大多不会专门
防备反调试技术。所以反调试技术还是相当重要的:它能够大大减少你的潜在对手。毕竟,
如果调试工具能够很轻易地支配你的软件,则任何一个程序员都可能成为cracker,而普通程
序员的队伍何其庞大?所以,反调试是软件保护的第一道防线。它已基本实现标准化:加壳
工具已经满天飞了。
2、抗分析,假如你不幸遇到对win32应用环境有足够了解的对手,以至于你的软件最终还是被凶
悍的调试器任意蹂躏,你也还远没有被打败,你还有第二道防线可守——抗分析。在这道防
线里,你有很多办法可以限制cracker掌握你的注册算法,从而阻止注册机的出现:注册机的
出现意味着你被彻底打败,所以第二道防线是你必须固守的。
3、防爆破,如果你的第二道防线足够坚固,往往会导致你的对手放弃注册,他们会试图直接修
改你的可执行文件,强行改变它的执行流程,比如让它不注册也能正常运行。所以你还需要
部署第三道防线,教训这些爆破者。防范爆破的手段很多,而且事实上你的防爆能力与你的
第二道防线的架构直接相关,所以总体来说,第二道防线还是最重要的。
本文针对的是第二道防线,目的在于阻止cracker掌握你的注册算法。
注册算法的目的是只向合法用户提供完整的功能,通常采用注册码验证的方式实现:
1、用户向软件作者提交用户码U,申请注册。
2、软件作者计算出注册码R=f(U),回复给合法用户。
3、用户在软件注册界面输入U和R。
4、软件验证F(U,R)=0来判定用户的合法性。
其中一些常用术语说明如下:
1、用户码U:用于区别用户身份。它可能仅仅是用户自定义的一个用户名,这种形式的用户码与
用户身份弱相关,假如一对合法的用户码、注册码被公开,则任何人都可以用来对软件进行
注册;它也可能是用户机器的硬件特征码,这种形式的用户码与用户身份强相关,可以有效
防止一次注册,多人享用的局面出现,但对于合法用户而言很不方便,一旦更换或升级机器,
就必须重新申清注册码。
2、注册码R:用于验证用户身份。它可能与用户码具有惟一对应关系,也可能同一个用户码有若
干个注册码相对应,也可能同一个注册码有若干个用户码相对应。如果用户码和注册码的取
值空间非常大,即使用户码与注册码不是惟一对应关系,非法用户“碰巧”得到一对合法的
用户码、注册码的概率也是微乎其微。
3、注册机:我们把R=f(U)中的小f称为注册机,掌握了注册机就有能力针对任何用户码计算出
相应的注册码。
4、验证机:我们把F(U,R)中的大F称为验证机,软件使用验证机验证注册码的合法性,即,
当且仅当R=f(U)成立时,F(U,R)=0。
在软件注册保护的“初级阶段”,验证机与注册机没有本质区别,即: F(U,R)=f(U)-R。所以
cracker甚至可以直接让你的软件担当注册