最近分析了C……t(非国产)软件的注册验证算法,发现它的方法简单,未用加壳、反调试、反反汇编等手段,但似乎无法破解。希望能在这里跟各位高手探讨一下。
和很多共享软件一样,这款软件也是在用户输入正确的用户名/注册码后,才解除试用版的限制。
由于汇编代码很长很难读,这里就以图代话了。验证程序的核心是一个叫 Blowfish 的对称加密器(加密解密使用同一个密钥,加密后的数据和明文长度相同)。图中用圆圈表示这个加密器,上下端的箭头表示密钥,左面输入明文,右面输出密文。
用户名和注册码分别经过两个简单的散列(hash)函数,产生2字节的用户名散列值,和18字节的注册码散列值。
将用户名散列值作密钥,对注册码散列值的高16位字节进行加密,密文(图中蓝色)作为后面要用的密钥。
注册码散列值低2位必须在0-0A00h之间,否则说明注册码错误。用这个值作位移量,在一个事先硬编码的表中取出一个16字节码(图中绿色部分),再用上面得出的密钥(蓝色)对这个码进行两次加密,产生出的16字节码就是最后解密的密钥。
程序中负责解除时间限制、激活注册版的程序代码以加密方式存在,解密的密钥就是上面产生出的16字节码。解密过程包括两次解密,为了确保解密无误,在第一次解密后,要将解密后数据中的几个特定字节与正确值比较,如果有错,图中红色部分就不执行,直接报告注册码错误。如果通过验证,就进行第二步解密(红色部分),用解密结果改写原来加密的程序代码,并且跳转到那里执行,完成软件激活。
个人认为这种方法几乎无法攻破。用改变跳转的方法不行,因为最终完成注册的程序代码是加了密的,没有正确的密钥就无法还原和运行该段程序。用穷举法破解也不现实,因为密钥有16字节(128位)。此外这种方法多次加密所用的密钥都不相关,很难推算出它们之间的关系,无法写出注册机。破解的唯一方法只能是通过研究整个程序,找到激活的方法,然后自己构造一个功能类似原来程序中的激活程序。
如果真是这样,软件保护似乎变得很简单,破解的人也就无技可施了。这里所用的 Blowfish 加密软件是很简单的开源软件,可以方便地加到要保护的程序里。分析的是否正确,还请各位高人指正。
- 标 题:一种软件保护手段的分析
- 作 者:kingdomer
- 时 间:2008-05-12 11:10
- 链 接:http://bbs.pediy.com/showthread.php?t=64731