摘要:本文提出了一种解决共享软件安全注册的实现方法。并对Visual C++ 6.0的编程实现过程作了介绍。
一、 引言
但现有共享软件的许多注册方法是存在漏洞的,不少破解网站通过正常渠道购买回一个注册码之后将其公布在其网站之上,更有甚者还提供生成注册码的注册机。以上的行为侵犯了软件开发者的知识产权,干扰了共享软件的正常发布。虽然国家也有保知识产权的相关法律条文,但显然在执行起来存在一定的难度。因此作为程序员的软件开发者应当具有自我保护意识,利用自己的专业特长,通过程序控制来确保自己的每一个注册码只对于一个软件拷贝。本文将根据笔者的实际编程经验,结合物理硬件信息的安全的注册方法实现过程进行较全面的介绍。
二、 注册源的采集
为了确保注册码的唯一性,在注册源的采集上应当尽量选取一些唯一的、不易复制的软、硬件信息作为原始信息。硬件由于其不可复制性和物理唯一性成为了我们的首选目标,而且多数计算机配件在出厂时都有一个唯一的标识号,可以将其作为识别的依据。符合上述条件的标识号大致有硬盘的序列号、网卡的序列号、BIOS中的主版序列号或出厂日期和标志等几种,考虑到硬件通用性、实现起来的难易程度以及系统安全性等多种因素以硬盘序列号为佳,因网卡虽说唯一性最好但不能保证每台计算机都装有网卡,而ROM BIOS中F000H-FFFFH区域虽存有与硬件配置有关的信、F000H:FFF5H-F000H:FFFFH存有主机出厂日期和主机标志值等参数,但在Windows 9x的保护模式下编程实现是比较困难的。虽然在Windows 9x保护模式下对硬盘序列号也不能按通常在DOS模式下的通过硬盘端口1F6H和1F7H直接读取,但Windows API函数中提供的下面这个函数可以非常简单的获取到指定磁盘驱动器的序列号:
GetVolumeInformation("C:\\",NULL,NULL,&dwIDESerial,NULL,NULL,NULL,NULL);
第一个参数设为"C:\\"表示我们要读取C盘驱动器的序列号。之所以选C盘,是因为我们不能保证用户有多个分区,而C盘却是每一个用户都具有的。该函数成功调用完毕后,在DWORD型的变量dwIDESerial中就存储了获取到的32位长的磁盘序列号。注册信息采集到后,关键的问题就是如何让用户将其返回给开发者。一种较简单的方法是把采集到的硬盘序列号与用户输入的注册名经过位操作的简单加密后存放到一个文本中通过邮件传送给开发者。
三、 注册机的设计
开发人员得到从用户返回的由硬盘序列号构成的注册原始信息后就要利用注册机生成注册码并反馈给用户。一般说,注册机要利用既定的位操作和不可逆算法,生成用户比较容易操作的字符串注册码。在用户方面的共享软件里也有一个具有相同算法的注册机用以动态计算以当前注册名进行注册的正确的注册码,然后对用户输入的注册码进行检测,如果不匹配则不予注册。如果是从开发者反馈来的正确注册码,则通过标记配置文件或是往注册表中写入特定内容键值以表明当前软件是经过注册的。而且共享软件在每次运行时都要对用户注册码进行实时检测与判断,这样才能实注册限制功能。如果应用程序被拷贝到其他计算机上则会由于硬盘序列号的改变而导致注册信息的不匹配,因此仍然要重新注册,从而达到共享软件的发布目的。下面就是一段非常简单的注册机实现代码:
开发者方:
用户方:
以上两段代码仅用于举例说明实现的方法,并未进行复杂的逻辑运算,在实际应用中应视共享软件的
自身价值、软件实现的复杂程度等多种因素来决定采取多大的加密深度。即使对于一般的注册机也应加以
2层以上的函数逻辑运算。对于共享软件,不管其实现何种功能,最好采取在线注册的方式,而且在同一个
软件系统中应有若干个注册入口,只要一处注册成功整个软件就算注册成功了。为了清晰的了解整个注册过
程,流程图可以大致如下,并可根据具体做适当的调整:
小结:本文主要对共享软件的安全注册进行了讨论。为了更方便、安全地实现对共享软件的注册可以大致遵循这样几个原则:选准注册源、经常变动注册算法、加密注册码、管理好注册机防止外流、采用在线式的注册方法。以上所述基本笔者自己的实际经验总结,本文所引程序在Windows 98下由Microsoft Visual C++ 6.0编译通过。