LabVIEW开发技术丛书
深 入 浅 出 软 件 加 密 技 术
目 录目 录
引言—献给刚步入加密领域的工程师
获取系统的硬件信息
生成系统ID和激活码
后记
1
2-3
4-6
7
引言—献给刚步入加密领域的工程师
自己辛辛苦苦做出来的软件轻轻松松被人盗版了,就像叶圣陶先生的小说《多了三五斗》中丰收
了却高兴不起来的农民一样——闭上眼睛就是天黑。所以,加密是一个软件工程师保护自己辛勤
劳动成果的必备技术(开源软件和有其它盈利模式的软件除外)。
从技术角度来说,天下没有破不了的软件,只是破解难度不一而已。从经济角度来看,只要破解
的成本高于使用正版软件的成本,那么破解的工作便不会有人去做了——除非是纯技术兴趣。
当前市面上比较流行的软件保护技术有:序列号、软件狗和绑定系统硬件信息三种:序列号保护
法常见于网络上的共享软件,破解比较容易。软件狗是一个安装在并口、串口等接口上的硬件电
路,同时有一套使用于各种语言的接口软件和工具软件。复杂的软硬件技术结合在一起使破解非
常难,许多有商业价值的软件一般都用软件狗来保护。绑定系统硬件信息是用户在安装完软件后,
获得一个与系统硬件信息(CPU ID,硬盘序列号等)相关的代码。开发商通过这个软件生成一个激
活码,用户输入激活码后便可正常使用软件了。
相比之下,序列号属于纯软件方法,破解比较容易;软件狗是软硬结合的方法,破解很难,但需
要购买商业化的软件狗,费用高;绑定系统硬件信息的方式,安全性不错,而且不需要额外软件
狗的费用。
图 1.1 绑定系统硬件信息技术
下面的章节中,本文将针对绑定系统硬件信息技术,先讲述如何获得系统硬件信息,然后讲述生
成系统 ID 和激活码的方法,最后给出一个完整的范例演示程序。
1
系统硬件信息系统id激活码
获取系统的硬件信息
到哪里去找硬件信息
一套基于计算机的自动化系统必定包含许多硬件,比如 CPU、硬盘、网卡、GPIB 卡、数据采集
卡、模块化仪器等等。
为了方便管理,厂家会给这些硬件一个唯一的标识号(id),或者序列号(SN),如图 2.1 所示。如
果厂家也提供相关的访问函数,我们就可以获得硬件的唯一标识号。
图 2.1 硬件序列号
获取 NI 硬件序列号
NI 公司硬件设备的序列号可以通过属性节点查知,如图 2.2 所示。
图 2.2 用属性节点获取 NI 硬件序列号
关于数据采集卡,GPIB 卡的硬件信息请参考范例程序 GetDAQSN.vi 和 GetGPIBSN.vi。
2
获取计算机硬件信息
计算机的硬件信息通常包括:CPU ID,硬盘序列号,MAC 地址和 BIOS 信息。这些信息由于涉
及硬件访问,需要调用许多底层函数,具体技术细节请参考 Skyremember 在 CSDN 发表的文章
《获取网卡 MAC、硬盘序列号、CPU ID、BIOS 编号》。本文将获取硬件信息的函数做成了
GetHWInfo.dll,方便在 LabVIEW 下调用,如图 2.3 所示。
图 2.3 Get CPU ID
其余硬件信息,请参考范例程序 GetBIOSInfo.vi,GetHDDSN.vi 和 GetMAC.vi
3
生成系统 ID 和激活码
当获取系统硬件信息后,下一步就是生成系统 ID 和激活码。从理论上来说,生成系统 ID 就是找
出一个算法 F1,使得 SystemID = F1 (HardwareInfo);生成激活码就是找出一个算法 F2,使得
ActivationCode = F2 (SystemID)。激活的过程就是找出一个算法 F3,使得 SystemID = F3
(ActivationCode),或者找出两个算法 F3+F4,使得 F3(SystemID) = F4(ActivationCode)。
最后激活过程的算法越复杂,其破解难度越高。在计算机行业,已经有许多成熟的加密解密算法
了,大家可以根据具体需要选用。
本文为了大家理解方便,将采用简单且直观的加密解密算法。
生成系统 ID
在数学中,有很多可逆的算法,比如乘和除,傅里叶变换和反傅里叶变换,交织和节交织,调制
和解调等等。选用可逆算法可以降低激活算法的设计难度,当然,如果加密算法功底深厚的话,
可以选用不可逆的算法。
由于硬件信息大多数由大写字母和数字组成,本文设计的可逆算法思路是:以十迚制数 69 为对
称点,找出硬件信息字符的镜像字符,比如 0 的镜像字符为 Z,由此形成的字符串作为系统 ID,
如图 3.1 所示:
图 3.1 生成系统 ID
通过该算法,由 NI 硬件序列号 EAB2F3 生成的系统 ID 为 EIHXDW,如图 3.2 所示。
4
图 3.2 系统 ID
当然,我们还可以把集中算法混合在一起,构成更加复杂的算法。
生成 USB-Key 激活码
给客户激活码的方式有很多种,本文推荐将激活码以二迚制流的方式写入 U 盘,以 USB-Key
的形式给客户。系统在运行时,USB-Key 必须存在,否则系统不能运行。
本文算法的设计思路是:先把 SystemID 转换为二迚制流,然后以 code.act 文件名(文件名可自
取)保存到 U 盘,如图 3.3 所示。当然,可以增加一些使二迚制流复杂化的算法,比如交织,那
么在解算二迚制流的时候,就需要增加对应的解算算法,比如解交织。
图 3.3 USB-Key 形式的激活码
做好了 USB-Key 形式的激活码后,就可以把这个 USB-Key 交付给客户了。
检测 USB-Key
本文检测 USB-Key 的设计思路是:首先需要把二迚制流读出,然后恢复出 SystemID,并与当
前系统硬件的信息做比较,如所示。
5
图 3.4 Check Dongle
完整加密程序演示
本文所有的代码包含在随附的演示程序中 Encryption.lvproj,如图 3.5 所示。
图 3.5 Encryption.lvproj
在运行 Demo_GenerateUSBKey.vi 程序时,需要先根据需求调用相应的硬件信息函数,然后制
作 USB-Key。制作好 USB-Key 后,再运行 Demo_CheckDongle.vi 即可。
6