基于圣天狗的VC++应用控制程序加/解密实例

2019-06-11 09:54马斌仁范祖清
电子技术与软件工程 2019年7期
关键词:天狗控制程序字符串

文/马斌仁 范祖清

1 研究背景

软件狗是使用在计算机并行口或USB接口上,用于软件保护的硬件产品。它是一个可编程可读写具有数据存储区的设备。将软件狗插在计算机上,通过相应的接口函数或开发商工具进行访问。

加密方案分为两种。一种使用外壳工具,不需对程序源代码进行改动,将可执行应用程序加一个保护层。程序开始运行和运行中会自动访问软件狗,若软件狗不存在,提示错误且应用程序不能运行;另一种使用obj、dll、lib等,开发商提供接口函数或工具。应用时在源代码中加入接口函数对软件狗进行操作,并编写加密程序实现软件保护。

为有效保护知识产权,有利于软件分期控制。使用单机时钟版圣天狗对单位医疗设备应用控制程序进行加/解密。采用内嵌式在源代码VC++6.0程序中调用圣天狗接口函数并编写程序对它进行检测和操作。

2 设计原理

程序中,调用接口函数进行操作,圣天狗响应该操作并通过API函数返回数值。程序中对返回值进行判定并采取相应动作。若返回值无响应或无效,程序终止运行或限制部分功能。

由于医疗产品软件特殊性,结合单位产品VC++6.0应用控制程序。将圣天狗加/解密分为软件到期时间控制、用户请求和时间延期代码升级三部分。同时,程序通过timer每隔2分钟调用一次SFNTGetLicens检测圣天狗,防止中途拔出。若被拨出,终止程序使用。

使用圣天狗开发商工具Sentinel Keys Toolkit,采用保护策略API特征项string类型(加/解密字符)和AES类型(激活、加密、解密)烧制圣天狗,并经编译形成头文件。程序源代码中引用“SentinelKeys.h”和“SentinelKeysLicense.h”;工程设置的对象/库模块中加入“SentinelKeyW.lib”。另外,设计加/解密字符串为圣天狗唯一ID编号(00-FF)和控制到期时间(YYYYMMDD),共十个字符。

3 控制程序加/解密

3.1 到期时间控制

在主程序中,先对圣天狗初始化,再定义判断标志位、圣天狗状态/ID/句柄等。通过SFNTGetLicense接口函数获取圣天狗状态。返回值为209,驱动程序未安装;返回值为226,圣天狗不匹配或中途被拔出;返回值为SP_SUCCESS,获取状态成功,反之标志位设为0,应用控制程序主要功能被限制。

图1:到期时间控制流程图

图2:开发商专用加密程序

获取状态成功后,采用SFNTGetDeviceInfo接口函数读取圣天狗基本信息。通过deviceInfo.timeValue获取内部时钟,定义年月日类型整形,如device.timeValue.year为内部时钟年份。通过计算年份×365+月份×30+日期,时间参数为a。

采用SFNTReadString函数,返回值为SP_SUCCESS时,读取圣天狗存储区的字符数组,再转换成一个字符串。按照加/解密字符设计规则进行字符分离,字符串第1、2位字符为圣天狗ID编号;第3-6位为设定的到期年份;第7、8位为月份;第9、10位为日期。该字符串中年月日为控制程序到期时间,且作了加密算法和限制条件,经计算为时间参数b。若不满足条件,则数据不合法,标志位为0。程序中,比较a和b,若a<=b,标志位为2,应用控制程序正常运行;标志位为1或0,程序主要功能被限制或终止运行,并提示相应信息。到期时间控制流程图如图1所示。

3.2 用户请求

唯一ID编号和原设定的软件到期时间。

程 序 中,引 用“SentinelKeys.h”和“SentinelKeysLicense.h”。先对圣天狗初始化,再采用SFNTGetLicense函数获取状态,返回值为SP_SUCCESS时,界面中“请求升级”按钮实现读取ID编号和到期时间(32位16进制字符显示)。

源代码中,采用SFNTGetDeviceInfo获取圣天狗基本信息,将deviceInfo.devSN唯一ID编号转换成十六进制字符,若长度不足2位加0补位。另外,通过SFNTReadString函数读取圣天狗内部字符数组,经处理变成一个字符串。按照YYYYMMDD格式分离出年月日,程序自动检查数据合法性。然后将ID编号和YYYYMMDD组合成一个字符串,再变成无符号的字符数组。接着采用指针方式写入plainBuffer[]数组,程序中使用SFNTEncrypt函数加密。最后将返回值clipherBuffer[]数组转换成16进制,若不足两位补位,即形成32位字符的用户请求代码。

3.3 时间延期代码升级

为便于开发商重写加/解密字符,对用户圣天狗进行确认。用户请求为32位16进制字符串代码,仅通过开发商专用程序获取圣天狗

开发商采用专用加密程序,将圣天狗唯一ID编号和控制软件下一个到期时间两段数据拼接在一起,使用SFNTEncrypt接口函数将拼接的字符串进行加密。由clipherBuffer[]数组生成32位16进制字符串即为时间延期升级代码。如图2所示。

代码升级的程序中,先将圣天狗初始化,将32位16进制字符串输入至文本框中,点击“验证”按钮,字符串转换成大写并去除所有空格,再检查字符串长度和每个字符ASC码在48至57或65至70范围内。若满足条件,时间延期代码合法。

点击“代码升级”按钮,程序对合法字符串每两位字符依次分离成字符数组,并将16进制转换成字符型。采用SFNTDecrypt函数解密,将plainBuffer[]字符数组组合成一个字符串即为ID编号和预置控制软件到期时间YYYYMMDD。程序自动完成对字符串的拆分和数据合法性判断。另外,通过SFNTGetDeviceInfo函数获取圣天狗ID,与字符串中的ID比较。若匹配,采用SFNTWriteString函数将字符串YYYYMMDD(年月日)重新写入圣天狗内部储存器中,存储区内部字符更新;若不匹配,代码升级无效。

4 结束语

单机时钟版圣天狗是一种智能型软件保护工具,采用公钥和128位AES保护,自身配置电池有源时钟,不依赖计算机系统时间,给我们提供了灵活的加密方案。通过提供的开发工具和文档,操作圣天狗并将算法和限制条件融入到VC++6.0应用控制程序中,实现不同代码控制程序运行时间和功能模块限制,有利于软件分期控制。

目前,市场上独立的硬加密出现已有多年,方案很多,属于较成熟技术。本文仅针对适合我单位产品软件的简单加密,后续根据需求,可考虑时间、执行次数和固定失效时间及外壳等多重加/解密方式。

猜你喜欢
天狗控制程序字符串
天狗送的纸牌
基于PLC的变电站备用电源自动投入装置控制程序的研究
天狗吃月亮
天狗吃地球
天狗的月亮饼
基于PLC数值处理模块的PID控制程序研究
一种新的基于对称性的字符串相似性处理算法
纸机传动控制程序的复用性研究
依据字符串匹配的中文分词模型研究
建筑工程新工艺、新技术现浇砼空心板的控制程序