当前位置:文档之家› labview深入浅出软件加密技术

labview深入浅出软件加密技术

gsdzone.net/community
LabVIEW开发技术丛书
深入浅出软件加密技术
目 录
目 录

引言—献给刚步入加密领域的工程师1
获取系统的硬件信息2-3
生成系统ID和激活码4-6
后记7
1

引言—献给刚步入加密领域的工程师
自己辛辛苦苦做出来的软件轻轻松松被人盗版了,就像叶圣陶先生的小说《多了三五斗》中丰收
了却高兴不起来的农民一样——闭上眼睛就是天黑。所以,加密是一个软件工程师保护自己辛勤
劳动成果的必备技术(开源软件和有其它盈利模式的软件除外)。

从技术角度来说,天下没有破不了的软件,只是破解难度不一而已。从经济角度来看,只要破解
的成本高于使用正版软件的成本,那么破解的工作便不会有人去做了——除非是纯技术兴趣。

当前市面上比较流行的软件保护技术有:序列号、软件狗和绑定系统硬件信息三种:序列号保护
法常见于网络上的共享软件,破解比较容易。软件狗是一个安装在并口、串口等接口上的硬件电
路,同时有一套使用于各种语言的接口软件和工具软件。复杂的软硬件技术结合在一起使破解非
常难,许多有商业价值的软件一般都用软件狗来保护。绑定系统硬件信息是用户在安装完软件后,
获得一个与系统硬件信息(CPU ID,硬盘序列号等)相关的代码。开发商通过这个软件生成一个激
活码,用户输入激活码后便可正常使用软件了。

相比之下,序列号属于纯软件方法,破解比较容易;软件狗是软硬结合的方法,破解很难,但需
要购买商业化的软件狗,费用高;绑定系统硬件信息的方式,安全性不错,而且不需要额外软件
狗的费用。

系统硬件信息系统id激活码

图1.1 绑定系统硬件信息技术
下面的章节中,本文将针对绑定系统硬件信息技术,先讲述如何获得系统硬件信息,然后讲述生
成系统ID和激活码的方法,最后给出一个完整的范例演示程序。
2

获取系统的硬件信息
到哪里去找硬件信息
一套基于计算机的自动化系统必定包含许多硬件,比如CPU、硬盘、网卡、GPIB卡、数据采集
卡、模块化仪器等等。

为了方便管理,厂家会给这些硬件一个唯一的标识号(id),或者序列号(SN),如图2.1所示。如
果厂家也提供相关的访问函数,我们就可以获得硬件的唯一标识号。

图2.1 硬件序列号
获取NI硬件序列号
NI公司硬件设备的序列号可以通过属性节点查知,如图2.2所示。

图2.2 用属性节点获取NI硬件序列号
关于数据采集卡,GPIB卡的硬件信息请参考范例程序GetDAQSN.vi和GetGPIBSN.vi。
3

获取计算机硬件信息
计算机的硬件信息通常包括: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
4

生成系统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所示。
5

图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,并与当
前系统硬件的信息做比较,如所示。
6

图3.4 Check Dongle
完整加密程序演示
本文所有的代码包含在随附的演示程序中Encryption.lvproj,如图3.5所示。

图3.5 Encryption.lvproj
在运行Demo_GenerateUSBKey.vi程序时,需要先根据需求调用相应的硬件信息函数,然后制
作USB-Key。制作好USB-Key后,再运行Demo_CheckDongle.vi即可。
7

后记
“I hear and I forget;
I see and I remember;
I do and I understand.”

眼见为实,耳听为虚,仸何事都要亲自付以行动才能真真正正的理解。在LabVIEW这样一个非
常适合工程师和科学家的平台上,多尝试,多实践是工程能力增长的不二法门。

拙作肯定存在不少问题,有仸何问题,可以给我Email: jing.zhang.zju@gmail.com,真心希望能
与大家一起分享一起讨论。

相关主题