labview深入浅出软件加密技术
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
深入浅出软件加密技术/community
引言—献给刚步入加密领域的工程师
自己辛辛苦苦做出来的软件轻轻松松被人盗版了,就像叶圣陶先生的小说《多了三五斗》中丰收了却高兴不起来的农民一样——闭上眼睛就是天黑。所以,加密是一个软件工程师保护自己辛勤劳动成果的必备技术(开源软件和有其它盈利模式的软件除外)。
从技术角度来说,天下没有破不了的软件,只是破解难度不一而已。从经济角度来看,只要破解的成本高于使用正版软件的成本,那么破解的工作便不会有人去做了——除非是纯技术兴趣。
当前市面上比较流行的软件保护技术有:序列号、软件狗和绑定系统硬件信息三种:序列号保护法常见于网络上的共享软件,破解比较容易。软件狗是一个安装在并口、串口等接口上的硬件电路,同时有一套使用于各种语言的接口软件和工具软件。复杂的软硬件技术结合在一起使破解非常难,许多有商业价值的软件一般都用软件狗来保护。绑定系统硬件信息是用户在安装完软件后,获得一个与系统硬件信息(CPU ID,硬盘序列号等)相关的代码。开发商通过这个软件生成一个激活码,用户输入激活码后便可正常使用软件了。
相比之下,序列号属于纯软件方法,破解比较容易;软件狗是软硬结合的方法,破解很难,但需要购买商业化的软件狗,费用高;绑定系统硬件信息的方式,安全性不错,而且不需要额外软件狗的费用。
图1.1 绑定系统硬件信息技术
下面的章节中,本文将针对绑定系统硬件信息技术,先讲述如何获得系统硬件信息,然后讲述生成系统ID和激活码的方法,最后给出一个完整的范例演示程序。
获取系统的硬件信息到哪里去找硬件信息
一套基于计算机的自动化系统必定包含许多硬件,比如CPU、硬盘、网卡、GPIB卡、数据采集卡、模块化仪器等等。
为了方便管理,厂家会给这些硬件一个唯一的标识号(id),或者序列号(SN),如图2.1所示。如果厂家也提供相关的访问函数,我们就可以获得硬件的唯一标识号。
图2.1 硬件序列号
获取NI硬件序列号
NI公司硬件设备的序列号可以通过属性节点查知,如图2.2所示。
图2.2 用属性节点获取NI硬件序列号
关于数据采集卡,GPIB卡的硬件信息请参考范例程序GetDAQSN.vi和GetGPIBSN.vi。
获取计算机硬件信息
计算机的硬件信息通常包括: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
生成系统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所示。
图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,并与当前系统硬件的信息做比较,如所示。
图3.4 Check Dongle
完整加密程序演示
本文所有的代码包含在随附的演示程序中Encryption.lvproj,如图3.5所示。
图3.5 Encryption.lvproj
在运行Demo_GenerateUSBKey.vi程序时,需要先根据需求调用相应的硬件信息函数,然后制作USB-Key。制作好USB-Key后,再运行Demo_CheckDongle.vi即可。
后记
“I hear and I forget;
I see and I remember;
I do and I understand.”
眼见为实,耳听为虚,仸何事都要亲自付以行动才能真真正正的理解。在LabVIEW这样一个非常适合工程师和科学家的平台上,多尝试,多实践是工程能力增长的不二法门。
拙作肯定存在不少问题,有仸何问题,可以给我Email: jing.zhang.zju@,真心希望能与大家一起分享一起讨论。