章 SuperProNet开发组件的安装
1. SuperProNet开发组件的组成
2. 系统要求
3. 准备
4. 安装SuperProNet加密锁开发组件光盘
5. SuperProNet开发组件系统菜单构成
6. SuperProNet开发组件硬盘目录结构
第二章 关于SuperProNet加密锁
1. SuperProNet网络锁如何工作
2. 单模块和多模块用户数控制
3. SuperProNet的外壳加密机制和API加密机制
4. SuperProNet加密锁的结构
第三章 完成SuperProNet加密软件流程
1. 定义SuperProNet用户数和加密算法,生成校验数据
2. 嵌入SuperProNet API函数到开发商的程序
3. 封装、发行开发商的软件
第四章 外壳软件保护方式保护开发商的软件
1. 输入开发商ID和操作密码
2. 选择外壳软件保护方式
3. 定义被保护软件的项目名
4. 选择SuperProNet保护软件的算法单元和定义算法因子
5. 输入被保护的软件和保护后生成的软件的路径名和文件名
6. 定义被保护软件为正式版本软件
7. 定义错误信息表
8. 编辑被保护软件的项目
9. 将加密算法因子写入SuperProNet软件保护锁
10. 保护应用程序
11. 保存工程文件
12. 检验被保护软件的保护效果
第五章 嵌入API软件保护方式保护开发商的软件
1、定义SuperProNet中的用户数
2. 在多模块控制中加入算法保护
3. 定义被保护软件的项目名
4. 选择SuperProNet保护软件的算法单元和定义算法因子
5. 定义被保护软件为正式版本软件
6. 编辑软件保护项目
7. 将加密算法因子写入SuperProNet软件保护锁
8. 生成校验数据
9. 校验数据——“查询、响应串”
10. 保存工程文件
11. 嵌入SuperProNet API校验函数部分
第六章 嵌入SuperProNet API校验函数到源程序
1. API函数组成
2. API加密方式的流程:
3. 编译/连接、运行、调试例子程序
4. 检验加密效果:
第七章 定时查找网络加密锁SuperProNet
第八章 批量保护开发商的软件
第九章 封装、发行开发商的软件
1. 安装SuperProNet加密锁
2. 安装SuperProNet驱动程序和服务程序
3. 在Novell上安装服务程序:
4. 安装加密后的软件
第十章 客户技术支持
章 SuperProNet开发组件的安装
1. SuperProNet开发组件的组成
一只SuperProNet软件保护锁。
一张SuperProNet开发组件安装程序光盘。
一封带有开发商ID和加密锁密码的信封。
一本开发商手册(英文)
一本SuperProNet用户使用手册(本文)。
2. 系统要求
CPU Pentium 90MHz 以上IBM兼容机。
Windows9x,windows ME,WindowsNT4,Windows2000操作系统。
40M以上的剩余硬盘空间。
640x480 256色以上显示分辨率。
光盘驱动器。
32M内存
Internet Explorer 4.01以上版本
安装开发组件光盘时,建议关闭系统中已运行的应用程序。
3. 准备
(1) 打开开发组件中的信封,将里面的开发商ID和加密锁密码的信纸取出并准备在手边。
(2) 将SuperProNet加密锁插入计算机并口(可以带电拔插)。
(3) 系统“控制面板”中“网络设置”至少需要有TCP/IP,IPX/SPX,NetBEUI网络通讯协议中的一种。
(4) 将SuperProNet开发组件安装程序光盘取出准备手边。
(5) 将SuperProNet用户使用手册(本文)准备手边。
4. 安装SuperProNet加密锁开发组件光盘
将SuperProNet 开发组件安装程序光盘插入光驱内。
开发组件光盘“AUTORUN”自动启动安装程序进入安装程序界面。(如果您的计算机关闭了AUTORUN功能,请点击光盘根目录的SentinelSuperPro6.2.0.exe程序)
根据安装程序提示安装所需要开发工具(建议使用缺省安装)。具体安装SuperProNet光盘步骤如下:
(1) 安装程序开始运行,点击Next;
(2) 安装程序显示版权协议说明,如果您同意请选择I accept…后点击NEXT;
(3) 安装程序提示输入您的名字和公司名称,然后点击NEXT;
(4) 安装程序提示选择完全安装或手动安装,建议使用完全(Complete)安装,然后点击NEXT;
(5) 安装程序提示安装SuperProNet开发组件,您可以选择安装路径,点击 NEXT;(建议使用缺省路径);
(6) 安装程序提示开始安装,点击INSTALL;
(7) 安装程序提示您安装完毕,点击FINISH;
(8) 操作系统会要求重新启动计算机。
5. SuperProNet开发组件系统菜单构成
6. SuperProNet开发组件硬盘目录结构
第二章 关于SuperProNet加密锁
1. SuperProNet网络锁如何工作
Rainbow的SuperProNet网络锁有两个主要的功能 ,“并发控制”和“软件保护”。所谓“并发控制”是指:一只SuperProNet网络锁可以控制在局域网上同时使用开发商软件的用户数。“软件保护” 是指:SuperProNet网络锁防止未经允许非法使用开发商软件。
SuperProNet 网络结构图:
局域网
注:此处的“用户程序”是指开发商开发的并提供给最终用户的应用程序。
“用户程序”与“服务程序”对话流程图:
(1) 最终用户在局域网上的计算机的并口,插入SuperProNet网络锁。在这台计算机的操作系统(Windows9x/Windows2000/Windows NT)上,运行SuperProNet Server程序。开发商开发的“用户程序”通过局域网上的网络协议与SuperProNet服务程序对话。
(2) 开发商的“用户程序”运行开始,就通过局域网上的网络协议向“服务程序”申请“使用许可证”。Rainbow 的“服务程序”根据开发商加密锁中定义的用户数(许可证数)和当前的“用户程序”占用“许可证”状况,决定是否返回“使用许可证”。:步骤1和步骤2。如果用户数(许可证数)被占满,“服务程序”将不返回“使用许可证”,开发商的“用户程序”就会终止。例如:5用户的加密锁,每启动一个“用户程序”占用一个“使用许可证”,用户数(许可证数)减一,直到第6个“用户程序”启动申请“使用许可证”,这时用户数(许可证数)已占满“服务程序”返回拒绝使用信息。第6个启动“用户程序”就会终止运行。
(3) 已经获得“使用许可证”的“用户程序”运行过程中,向“服务程序”发出的查询申请,查询加密锁单元中的数据,“服务程序”读加密锁并返回加密锁单元中的数据。 开发商的“用户程序”对返回值进行比较鉴定并进行相应的动作。错误的返回值表明运行“服务程序”的计算机没有插上正确的网络加密锁或网络加密锁已经被拔走,于是开发商的应用程序就会终止。软件可能被非法拷贝,但不能被正确运行。
(4) 已经获得“使用许可证”的“用户程序”运行结束前,返回“服务程序”“使用许可证”。以便在局域网络内部,其它“用户程序”申请此“使用许可证”。
2. 单模块和多模块用户数控制
(1) 单模块控制:SuperProNet可以单独控制一个软件的用户数。
(2) 多模块控制:SuperProNet也可以同时分别控制多个软件或多个模块的用户数。
3. SuperProNet的外壳加密机制和API加密机制
(1) 外壳加密:使用外壳加密工具对可执行文件直接加密。
(2) API加密:在软件的原程序中直接加入查找加密锁的代码,编译后执行。
4. SuperProNet加密锁的结构
SuperProNet一共有128个字节,用户可使用部分有112字节,操作网络锁是以字节或双字节为单位。00-07单元是保留单元,用户可编辑使用部分是08~3F 字单元,共56个单元
(1) 软件保护锁内部单元中,以偶字节开头的两个连续的单元可以定义一个算法单元,保护一个应用程序。如:08/09单元,2A/2B单元,3E/3F单元都是算法单元,它们每个都可以保护一个应用程序。
(2) 56个单元最多可以28个算法单元。因此,一个SuperProNet软件保护锁可以分别保护28个应用程序。
(3) 被保护的应用程序实际上是对SuperProNet内部的算法单元发“查询串”,算法单元运算“查询串”返回给应用程序运算结果“响应串”。
(4) 软件开发商使用“外壳软件保护方式”保护软件,只需要就是定义“算法单元”的加密算法,SuperProNet开发工具就可自动完成软件保护过程。
(5) 软件开发商使用“嵌入API软件保护方式” 保护软件,首先需要定义“算法单元”的加密算法,然后,生成一定数量的“查询串” “响应串”对,最后,在源程序代码中嵌入向SuperPro发“查询串”的查询函数,并比较返回的“响应串”与预先知道的“响应串”是否相等,然后,进行相应的操作。
开发商如果只有一个软件需要控制使用用户数(单模块控制),可以直接订购所需用户数的加密锁,而不用再进行更改。对于有多个软件或多个模块的开发商可以使用07-3F中任一单元控制“用户数”和“子模块数” (多模块控制)。
单模块控制:
例1:比如我们有一个软件Notepad,需要并发控制整个Notepad用户数为25。直接购买25用户SuperProNet即可
多模块控制:
例2:比如我们有一套Office3000,包括Notepad (记事本),Calc(计算器),Pbrush(画笔)三个软件,需要控制同时使用Office的用户数为25,子模块notepad 10用户,子模块calc 6用户,子模块pbrush 4用户。首先,可以购买25用户数的SuperProNet。其次,定义控制Notepad,Calc,Pbrush 3个子模块的用户数。控制子模块Notepad用户数单元是08#单元,输入为10(十进制数),控制子模块Calc的单元是09#单元,输入为06 (十进制) 。控制子模块Pbrush的单元是0A#单元,输入为04 (十进制)。在网络锁的单元输入如下:
Notepad Calc Pbrush
08#单元 09#单元 0A#单元
10 06 04
注: 模块0,Notepad的用户数由08#单元决定;模块1,Calc的用户数由09#单元决定; 模块2,pbrush的用户数由0A#单元决定。
第三章 完成SuperProNet加密软件流程
1. 定义SuperProNet用户数和加密算法,生成校验数据
开发商使用SuperProNet编辑工具SuperProNet,定义SuperProNet 加密锁“用户数”和加密算法,并生成校验数据。
2. 嵌入SuperProNet API函数到开发商的程序
A、外壳加密程序可以直接对可执行文件进行保护,自动插入校验代码。
B、开发商在自己的源程序中嵌入 API函数调用,经过调试、编译、连接后,生成被加密的可执行文件。也就是最终用户使用的“用户程序”。
3. 封装、发行开发商的软件
开发商将Rainbow的服务程序,驱动程序和加密后的程序整和在一起发布给最终用户。
下面的章节,我们就按照以上的三个过程举例说明两个例子程序。
例1(第四章)使用外壳加密工具保护软件Notepad,并且控制Notepad的用户数。
例2(第五章,第六章)使用API保护方式保护三个软件Notepad(记事本),Calc(计算器),Pbrush(画笔),并分别控制三个软件的用户数。
如果您只有一个软件,只 需要控制这个软件的用户数,请参阅第四章例1的说明。如果您有多个软件或多模块都需要分别控制用户数请参阅第五章,第六章,例2的说明。
第四章 外壳软件保护方式保护开发商的软件
SuperProNet加密锁与以往的网络加密锁不同,新增加了外壳加密工具,可以直接保护应用程序,开发商的应用程序不需要源程序。只需要提供可执行文件(EXE文件)或动态连接库(DLL文件)就可以了。对于只需要控制一套软件来说,外壳加密使流程更加简单化。
外壳软件保护方式的工作机制:
将您的程序分为几块,打乱代码。防止DEBUG等反汇编程序。
(1) 采用美国彩虹公司专门设计的软件保护策略,将查询校验加密算法的指令插入应用程序之中。
(2) 应用程序增加实用的功能。如:执行时间控制,执行次数控制,到期时间控制等。
例1:比如我们有一个软件Notepad,需要并发控制notepad用户数为25。直接购买25用户SuperProNet。下面我们就举例说明用SuperProNet外壳加密工具,用一只SuperProNet保护notepad软件。(注:加密锁的用户数目是由加密锁销售商觉得能够决定,购买时请联系销售商定制)
1. 输入开发商ID和操作密码
(1) 鼠标点击“开始-〉程序-〉Rainbow Technologies-〉SuperPro-〉6.2-〉SentinelSuperPro 6.2 Toolkit”菜单项,就进入如下界面。
(2) 执行步骤1步骤2步骤3。输入开发商ID号和操作SuperProNet软件保护锁的密码,确认输入后,开发工具进入主界面。注意:开发商ID号和密码只需要输入一次开发工具就会记住,以后再进入时ID号和密码不必重新输入。窗口只有次进入开发工具时才会出现。
2. 选择外壳软件保护方式
(1) 主窗口中,标识14是主窗口按钮,点击此按钮就会回到主窗口。标识15是Sentinel的产品概述,开发商可以点击此按钮阅读。标识16是对工程文件的处理操作窗口,每次开发商定义加密算法都保存在工程文件之中,此窗口可以“打开”,“保存”,“另存”操作这些工程文件,因为,我们这是次使用开发工具,还不涉及到操作工程文件。
(2) 执行步骤4。进入设计算法窗口。
(3) 执行步骤5。进入设计算法窗口。
(4) 执行步骤6,步骤7。进入选择软件保护方式窗口。
3. 定义被保护软件的项目名
(1) 执行步骤8步骤9。选择外壳软件保护方式,进入下一窗口。
(2) 执行步骤10,步骤11。输入项目标识名,进入下一窗口。
4. 选择SuperProNet保护软件的算法单元和定义算法因子
(1) 执行步骤12步骤13步骤14步骤15。选择保护软件的算法单元,输入算法因子,进入下一窗口。
5. 输入被保护的软件和保护后生成的软件的路径名和文件名
(1) 执行步骤16步骤17步骤18。输入被保护的软件Notepad.exe(记事本)路径名和文件名,以及保护后生成的Notepad.exe路径名和文件名。进入下一窗口。
(2) 执行标识17,18,19是制作演示版软件的选项。执行步骤19,进入下一窗口。
6. 定义被保护软件为正式版本软件
1) 执行步骤20步骤21。选择永久活动算法单元项,保护软件。进入下一个窗体。
7. 定义错误信息表
1) 使用SuperProNet外壳保护软件时,开发商可以将原来的与SuperProNet有关的英文错误信息,修改为对应的中文错误信息。注意:这些错误信息只是找不到锁或锁算法查询不对时才出现,开发商可以保存原来的英文信息不变。执行步骤22步骤23。进入下一个窗体。
8. 编辑被保护软件的项目
(1) 至此,我们完成了定义保护软件Notepad项目过程。窗口中增加了一个Notepad项目名,标识24。软件开发商可以再增加、编辑、删除已有的项目:标识25标识26标识27。
(2) 执行步骤24,进入写入加密算法窗体。
9. 将加密算法因子写入SuperProNet软件保护锁
(1) 执行步骤25步骤26,将加密算法写入SuperProNet,进入实施保护软件窗体。(注:请确认已将加密锁插在计算机的并口上。)
10. 保护应用程序
(1) 执行步骤27,保护Notepad(记事本)软件。至此,就完成了整个软件保护过程。
11. 保存工程文件
(1) 开发商需要保存定义加密算法的工程文件,以便发布软件时,批量写入其他的SuperProNet加密算法。
(2) 执行步骤28步骤29,选择菜单 File->Save保存工程文件,输入我们指定的工程文件的文件名myfirst,并保存到指定的硬盘中的妥善位置。
12. 检验被保护软件的保护效果
插入写入算法的SuperProNet到Server服务器并口上,将被保护的Notepad复制到其他计算机上,并确认两台机器之间通讯正常,则被保护的Notepad(记事本)可以正常使用,并且被保护的软件与保护前软件功能完全相同。将这只SuperProNet从Server并口拔下,则被保护的软件将不能使用,出现软件拒绝使用窗口。注意:此窗口信息为外壳保护工具定义的缺省英文信息,如果在本章第7步中修改了错误信息表,显示的内容将是修改后的信息。
第五章 嵌入API软件保护方式保护开发商的软件
开发商直接在源程序代码中嵌入校验加密算法的SuperProNet API函数调用,程序经过编译、连接后,生成与SuperProNet绑定的应用程序。开发商可以通过API软件保护方式来设计自己的加密方案,控制加密点在程序中嵌入的频度和位置。
嵌入API软件保护方式软件保护过程分为四部分:定义SuperProNet中的用户数部分,定义SuperProNet中的加密算法部分;生成校验数据对——“查询串”“响应串”部分;嵌入源程序SuperProNet API校验函数部分。
下面我们就举例API软件保护方式,使用SuperProNet算法单元保护一个Microsoft Visual C++的程序,我们假设需要保护的软件名是Notepad,Calc和Pbrush。注意:SuperProNet可以保护绝大多数计算机语言开发的软件,关于如何获得您所需的计算机语言的API接口程序,请到C:\Program Files\Rainbow Technologies\SuperPro\6.2\Intf目录查找,或到主页下载。
例2的分析
需求:Office3000其中包括Notepad,Calc,Pbrush三个软件。需要控制整个Office用户数为25,其中Notepad 10用户,Calcl 6用户,Pbrush 4用户。
分析:我们可以购买25用户的SuperProNet网络锁,并用08#单元控制子模块“Notepad”用户数;09#单元控制子模块“Calc”用户数;10#单元控制子模块“Pbrush”用户数。如下所示:
Notepad Calc Pbrush
定义用户数单元 08#单元 09#单元 0A#单元
定义数据算法单元 10#单元
11#单元 12#单元
13#单元 14#单元
15#单元
注: 模块0,Notepad的用户数由08#单元决定,定义数据算法单元在10#和11#单元;模块1,Calc的用户数由09#单元决定,定义数据算法单元在12#和13#单元; 模块2,pbrush的用户数由0A#单元决定,定义数据算法单元在14#和15#单元。
1、定义SuperProNet中的用户数
(1) 执行步骤1,增加保护应用程序项目。
(2) 执行步骤2,选择自定义项目。步骤3进入下一步。
(3) 执行步骤4,选择子用户数项目,步骤5,点击进入下一步。
(4) 执行步骤,输入软件标识,个软件为Notepad,就输入Notepad license。步骤7点击进入下一步
(5) 步骤8,选择Notepad的用户数为10,步骤9选择Notepad用户数单位地址为08单元,步骤10点击进入下步。
(6) 步骤10完成以后,我们已经完成了定义保护软件Notepad“用户数”项目过程,标识10。其他的应用程序Calc,Pbrush可以使用,标识13增加新的“用户数”项目,增加项目的步骤与项目Notepad完全相同,按相同步骤即可定义Calc,Pbrush分别为6用户,4用户,标识12,标识13。
2. 在多模块控制中加入算法保护
(1) 执行步骤11。进入设计算法窗口。
(2) 执行步骤12,13。进入选择软件保护方式窗口。
(3) 执行步骤14,步骤15。进入定义项目名窗口。
3. 定义被保护软件的项目名
(1) 执行步骤16,步骤17。假设需要保护的软件名叫Notepad,我们输入项目标识名notepad,进入下一窗口。
4. 选择SuperProNet保护软件的算法单元和定义算法因子
(1) 执行步骤18步骤19步骤20步骤21。选择10#单元作为保护软件的算法单元,输入算法因子,进入下一窗口。注意:使用者一定要记住选择的算法单元号,以便生成校验数据对时定位算法单元的位置,并注意不用与设置用户数的单元重复。
5. 定义被保护软件为正式版本软件
(1) 执行步骤22,步骤23。选择活动(Active)算法单元项,保护软件。进入下一个窗体。注意:关于标识24,标识25的有关制作演示版本软件的功能,请参考相关电子文档手册。
6. 编辑软件保护项目
(1) 至此,我们已经完成了定义保护软件Notepad项目过程,如标识19。注:Calc和Pbrush可以使用,标识20增加新的项目,增加项目的步骤与项目Notepad完全相同。
(2) 执行步骤24, 进入将算法因子写入SuperProNet窗口。
7. 将加密算法因子写入SuperProNet软件保护锁
(1) 执行步骤25, 将算法因子写入SuperProNet算法单元,执行步骤26,进入生成校验数据窗口。
8. 生成校验数据
(1) 进入后,执行步骤27,进入API软件保护窗口。然后,执行步骤28进入生成校验数据窗口。此时,屏幕上出现的是生成“查询串”和“响应串”的参数选项,我们需要进一步的设置这些参数,以便为生成算法校验数据做准备。以下,我们将介绍这些参数的意义和设置方法。
(2) 加密算法的单元号:我们在第五章步骤18中,设定保护软件Notepad的SuperProNet算法单元为10#单元。因此,需要在生成校验数据前指定我们已定义算法的单元号。执行步骤29选择10#算法单元。
(3) 查询串、响应串的长度:SuperProNet算法单元可以运算的“查询串”和生成的“响应串”长度最小为1字节,最多为20字节。 “查询串”长度越长,算法单元运算生成的“响应串”越长,软件保护的强度越强。注意:如果“查询串”长度小于4字节,加密算法很容易被穷尽,软件保护的强度将很弱。如果“查询串”长度在4字节以上,加密算法很难被破解,软件的才安全。执行步骤30,设置“查询、响应串”的长度为4字节。
(4) 查询响应对的数量:开发商在源程序中,插入SuperProNet的API查询函数,并编译生成被保护的程序。被保护的程序在运行过程中,不断的向SuperProNet的算法单元发查询串,并比较SuperProNet返回的响应串,如果响应串与预知的不一样程序将终止运行。 程序中查询校验加密算法的数据越多则软件保护的强度越强。在此举例说明的程序因为篇幅的有限,只使用了10对查询响应对,执行步骤31,指定生成“查询、响应串”的数量为10对。注意:我们建议开发商保护程序时使用100对以上的查询响应对。
(5) 查询响应串的数据结构表示:一个字节十进制表示范围是0~255,十六进制表示的范围0~FF。查询SuperProNet单元的查询串是以字节为单位的。如果我们4字节的查询串是:B8, DA, D0, 8E(十六进制),计算生成响应串是:42, A8, 60, 88(十六进制)。那么C语言表示的十六进制数据结构是无符号数组型,查询串:unsigned char Query[4]={ 0xB8, 0xDA, 0xD0, 0x8E};响应串:unsigned char Response [4]={ 0x42, 0xA8, 0x60, 0x88}。SuperProNet查询响应生成工具能够自动转换生成了三种语言的数据结构,Basic, C,Delphi 。其它的计算机语言的数据结构开发商可以手工进行转换。执行步骤32,选择生成“查询、响应串”的数据类型为C语言三位数组(3 Dimensional array declaration - (C code))。注意:开发商保护自己的程序时,可以选择相应语言的数据结构,所示三种语言数据结构列表。
(6) 执行步骤33,生成“查询、响应串”。显示查询响应串窗口。
9. 校验数据——“查询、响应串”
(1)标识23所示生成的C语言“查询、响应串”三位数组。放大后的数据所示。
unsigned char QueryResponses[][2][4] = {
{ { 0xB8, 0xDA, 0xD0, 0x8E }, { 0x42, 0xA8, 0x60, 0x88 } },
{ { 0x63, 0xEB, 0xAE, 0x01 }, { 0x72, 0xB8, 0xDD, 0x0A } },
{ { 0x26, 0x8F, 0x3D, 0x24 }, { 0xD6, 0xB2, 0x60, 0x22 } },
{ { 0x87, 0x43, 0xD4, 0x86 }, { 0x50, 0xEA, 0xB1, 0x8E } },
{ { 0x2F, 0x22, 0xF3, 0x33 }, { 0x43, 0xBC, 0xB3, 0x91 } },
{ { 0x4A, 0xB6, 0xCD, 0x27 }, { 0x0B, 0xFE, 0xA4, 0xF8 } },
{ { 0x2D, 0x0E, 0x03, 0x08 }, { 0x31, 0x80, 0x5C, 0xD1 } },
{ { 0x3B, 0x10, 0xB3, 0x14 }, { 0xF0, 0x1B, 0x88, 0x07 } },
{ { 0x11, 0xB1, 0x58, 0xC0 }, { 0x66, 0x3E, 0xC2, 0x9E } },
{ { 0xA3, 0x14, 0x22, 0xC3 }, { 0x00, 0xEA, 0xA3, 0x93 } }
};
(2) 数组QueryResponses[ ][2][4],维QueryResponses[x]是查询响应串的数量,我们生成的是10组查询响应对。第二维中QueryResponses[x][0]代表“查询串”,QueryResponses[x][1] 代表“响应串”。第三维中QueryResponses[x][y][4]是“查询串” “响应串”的长度4字节。
(3) 执行步骤34,将“查询、响应串”保存到文件中。
(4) 执行步骤35步骤36。将“查询、响应串”三位数组保存到一个文本文件data1.txt之中。
10. 保存工程文件
(1) 开发商需要保存定义加密算法的工程文件,以便发布软件时,批量写入其他的SuperProNet加密算法。
(2) 执行步骤37步骤38,选择菜单 File->Save保存工程文件,输入我们指定的工程文件的文件名mysecond,并保存到指定的硬盘中的妥善位置。
11. 嵌入SuperProNet API校验函数部分
详见第六章
第六章 嵌入SuperProNet API校验函数到源程序
1. API函数组成
使用SuperProNet API加密多软件或多模块控制程序主要由五部分组成。
(1) 向Server申请“许可证” 函数(程序开头部分调用)。
程序与Server申请“使用许可证”。用以程序判断是否运行。
(2) 向Server申请子模块的“子许可证” 函数(程序开头部分调用)。
程序与Server申请“子使用许可证”。用以程序判断是否运行。例2中子模块Notepad,Calc,Pbrush“子使用许可证”由此函数申请。
(3) 查询校验数据函数(程序运行过程中多次调用)。
程序向Server发查询校验加密锁单元的数据。用以防止最终用户在使用过程中将加密锁拔除,“一锁多用”。
(4) 释放子模块“子使用许可证”函数(程序运行结束时调用)。
程序向Server返还“子使用许可证”,以便其它的用户使用此“子使用许可证”。例2中子模块Notepad,Calc,Pbrush“子使用许可证”由此函数返还。
(5) 释放“使用许可证”函数(程序运行结束时调用)。程序向Server返还“使用许可证”,以便其它的用户使用此“使用许可证”。具体的使用流程所显示。
2. API加密方式的流程:
例2程序中Notepad加密部分的源代码(注:Calc和Pbrush与此代码结构相同)
#include "stdafx.h"
#include "spromeps.h"
#include
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
SP_STATUS spStatus;
RB_SPRO_APIPACKET ApiPacket;
static RB_DWORD qResult32;
///////////////////////////////////////////////////////////////////
spStatus = RNBOsproFormatPacket( ApiPacket, sizeof(ApiPacket) );
SpStatus = RNBOsproInitialize( ApiPacket );
///////////////////////////////////////////////////////////////////
RB_WORD developerID=0x2467;
spStatus = RNBOsproFindFirstUnit( ApiPacket,developerID );
// ▲▲▲
// 加密琐的ID号
if ( spStatus != SP_SUCCESS )
{
MessageBox( NULL,"找不到加密锁",
"加密锁",
MB_ICONINFORMATION | MB_TASKMODAL );
return( FALSE );
}
else
{
MessageBox( NULL,
"找到加密锁",
"加密锁",
MB_ICONINFORMATION | MB_TASKMODAL );
}
///////////////////////////////////////////////////////////////////
spStatus = RNBOsproGetSubLicense( ApiPacket, 0x08);
if ( spStatus != SP_SUCCESS ) // ▲▲▲
// (0x08为Notepad
// 所使用的用户数单元
// 请参见本手册第25页例2)
{
MessageBox( NULL,"获得子许可证不成功",
"获得许可证结果",
MB_ICONINFORMATION | MB_TASKMODAL );
return( FALSE );
}
else
{
MessageBox( NULL,
"获得子许可证成功",
"获得许可证结果",
MB_ICONINFORMATION | MB_TASKMODAL );
}
///////////////////////////////////////////////////////////////////
//"B8DAD08E", "42A86088" 此组数据见第五章
unsigned char queryData[]={0xB8, 0xDA, 0xD0, 0x8E};
unsigned char cmpqueryData[]={0x42, 0xA8, 0x60, 0x88};
unsigned char response[]={0,0,0,0};
int cellAddress =0x10; //(0x10为Notepad所使用算法单元
// 请参见本手册第25页例2)
int queryLength =4;
spStatus = RNBOsproQuery( ApiPacket,
cellAddress,
&queryData,
&response,
&qResult32,
queryLength );
spStatus= memcmp( response, cmpqueryData, 4 );
if ( spStatus != SP_SUCCESS )
{
MessageBox( NULL,"查询不成功",
"查询结果",
MB_ICONINFORMATION | MB_TASKMODAL );
return( FALSE );
}
else
{
MessageBox( NULL,
"查询成功",
"查询结果",
MB_ICONINFORMATION | MB_TASKMODAL );
}
//
/////////////////////////////////////////////////////////////////////////////////////
unsigned short numSubLic = 1;
spStatus = RNBOsproReleaseLicense( ApiPacket, 0x08 , &numSubLic );
if ( spStatus != SP_SUCCESS ) // ▲▲▲
// (0x08为Notepad
// 所使用的用户数单元
// 请参见本手册第25页例2)
{
MessageBox( NULL,"释放子许可证不成功",
"释放子许可证结果",
MB_ICONINFORMATION | MB_TASKMODAL );
return( FALSE );
}
else
{
MessageBox( NULL,
"释放子许可证成功",
"释放子许可证结果",
MB_ICONINFORMATION | MB_TASKMODAL );
}
///////////////////////////////////////////////////////////////////
spStatus = RNBOsproReleaseLicense( ApiPacket, 0 , NULL );
if ( spStatus != SP_SUCCESS )
{
MessageBox( NULL,"释放许可证不成功",
"释放许可证结果",
MB_ICONINFORMATION | MB_TASKMODAL );
return( FALSE );
}
else
{
MessageBox( NULL,
"释放许可证成功",
"释放许可证结果",
MB_ICONINFORMATION | MB_TASKMODAL );
}
return 0;
}
注意:以上我们只举例说明模块0,Notepad模块。其他模块Calc,Pbrush也是通过RNBOsproGetSubLicense( )函数来实现。形式如下:
RNBOsproGetSubLicense( ApiPacket, 0x08),08为单元号。
相对于例2来说,Calc的用户数单元号为09,Pbrush为0A。
3. 编译/连接、运行、调试例子程序
详细的文件构成请参阅目录中的“Readme.txt”。请替换例子程序的开发商ID号,为您的开发商ID。然后编译连接成可执行文件。
4. 检验加密效果:
插入写入算法的SuperProNet到Server服务器并口上,将被保护的Notepad复制到其他计算机上,并确认两台机器之间通讯正常,则被保护的Notepad(记事本)可以正常使用,并且被保护的软件与保护前软件功能完全相同。将这只SuperProNet从Server并口拔下被保护的软件将不能使用,出现“找不到加密锁”窗口。
注意:以上我们列出了一个使用SuperProNet加密保护的Visual C++简化示例程序。如果您需要其它语言的简化示例程序,如: Visual Basic, Visual Foxpro, C++ Builder, Power Builder , Delphi等。详情请参阅开发光盘中的API目录中的相应例程。
第七章 定时查找网络加密锁SuperProNet
在使用API方式进行软件保护时,一定要在程序中加入定时查询。加入定时查询的好处是可以防止某些用户,在软件正常启动后,将加密锁拔下换到别的机器上,从而达到增加用户数的目的。另外,由于种种原因,当一个获得了许可证的客户端因为非法退出,(比如死机),而没有释放许可证的话,那么这个许可证就不会被释放了,这样造成的后果就是,每当有一个客户端非法退出,就会浪费一个许可证,造成用户数的无谓浪费。为了解决这个问题,服务程序会要求客户端定期访问加密锁,凡是发现超时没有联系的,就会释放掉这个客户端申请的license,给其他客户端使用。Server端要求每120秒客户端查询一次加密锁,因此客户端需要在程序中加入每90秒一次的定时查询。
下面以VC为例说明定时查询的用法。注:此处程序为截选
void CVctimerDlg::OnTimer(UINT nIDEvent)
{
if(nIDEvent == 1234)
{ unsigned char queryData[]={0x12,0x34,0x56,0x78};
unsigned char cmpqueryData[]={0x41,0x2f,0x9b,0x52};
unsigned char response[]={0,0,0,0};
int cellAddress =0x8;
int queryLength =4;
spStatus = RNBOsproQuery( ApiPacket,
cellAddress,
&queryData,
&response,
NULL,
queryLength );
spStatus= memcmp( response, cmpqueryData, 4 );
if ( spStatus != SP_SUCCESS )
{
MessageBox("心跳查询不成功" );
}
else
{
//MessageBox( "心跳查询成功" );
}
}
CDialog::OnTimer(nIDEvent);
}
void CVctimerDlg::OnButton1()
{
spStatus = RNBOsproFormatPacket( ApiPacket, sizeof(ApiPacket) );
spStatus = RNBOsproInitialize( ApiPacket );
RB_WORD developerID=0x2467;
spStatus = RNBOsproFindFirstUnit( ApiPacket,developerID );
// ▲▲▲
// 加密琐的ID号
if ( spStatus != SP_SUCCESS )
{
MessageBox("获得主许可证不成功");
}
else
{
MessageBox("获得主许可证成功");
}
spStatus = RNBOsproSetHeartBeat(ApiPacket,500); //设定server的timeout心跳时间为500秒
SetTimer(1234,90000,NULL); //设定定时查询为90秒一次
}
///////////////////////////////////////////////////////////////////
//12345678, AB3F93E5
unsigned char queryData[]={0x12,0x34,0x56,0x78};
unsigned char cmpqueryData[]={0xAB,0x3F,0x93,0xE5};
unsigned char response[]={0,0,0,0};
int cellAddress =0x8;
int queryLength =4;
spStatus = RNBOsproQuery( ApiPacket,
cellAddress,
&queryData,
&response,
NULL,
queryLength );
spStatus= memcmp( response, cmpqueryData, 4 );
if ( spStatus != SP_SUCCESS )
{
MessageBox("query查询不成功");
}
else
{
MessageBox("query查询成功");
}
第八章 批量保护开发商的软件
当调试完毕并完成整个的加密过程后,开发商需要成批的保护软件。开发商可以从加密锁的代理商处购买相同开发商ID号的加密锁。然后,使用Make Keys Utility将我们定义的数据写入新的加密锁。例如:在例2中我们完成加密后,就可以购买相同开发商ID号的加密锁了。然后,使用Make Keys Utility将保存的数据写入加密锁。
从开始—>程序—> Rainbow Technologies—> SuperPro—> 6.2—>Make Keys Utility来执行批量保护程序Make Keys Utility
(1) 执行步骤1,选择菜单条File->Open打开已保存的文件。
(2) 执行步骤2,输入步骤38已保存的文件名“mysecond.spp”。
(3) 执行步骤3,确认输入操作。
(4) 执行步骤4,将数据写入新的加密锁。
(5) 换下加密锁,并插上一只新的加密锁,重复步骤4,完成批量做锁工作。
第九章 封装、发行开发商的软件
当开发商完成整个加密过程并完成全部调试后,开发商就可以封装、打包开发商的软件制作安装程序了。
运行使用开发商加密后的软件,需要有四个要素:开发商写入数据的SuperProNet加密锁;网络锁的服务程序;加密锁的驱动程序;开发商加密后的软件。这四个要素缺一不可。开发商发布销售软件给最终用户,最终用户需要在局域网内,任意一台计算机操作系统(Windows9x,Windows NT,Windows2000)上,安装网络锁的服务程序和加密锁的驱动程序,并将“加密锁”插在这台计算机并口上,最终用户在局域网上的客户端安装开发商的软件,最终用户就可以使用加密后的软件了。
我们已经完成了两个要素,将数据写入SuperProNet加密锁;加密开发商的软件。接下来我们需要设计某种机制使最终用户可以安装加密锁的驱动程序和服务程序。
开发商需要按照以下的顺序设计机制完成制作安装程序。
1. 安装SuperProNet加密锁
在选择安装服务程序的计算机的并口上,插入网络加密锁 (注意:可以带电插拔加密锁) 。
2. 安装SuperProNet驱动程序和服务程序
进入光盘中\driver&Server\Internet Installer目录,执行SPNComboInst1.0.exe,开始安装驱动程序。(注:如果已经安装了5.39以前版本的驱动,安装程序会自动卸载旧版本,并重新启动后继续安装。)
具体安装步骤:
1) 点击“next”
2) 选择 “I accept the terms in the license agreement”,点击“next”
3) 使用默认安装路径(或用户自行更改路径),点击“next”
4) 选择完全安装(complete),点击next;(需要40M硬盘空间)
5) (提示在安装过程中不要插入任何USB key),点击install开始安装;
6) 点击finish,驱动程序和服务程序安装结束。
(注:在Windows95/98/ME系统中会提示需要重新启动计算机,在windows2000和windows NT系统不需要重新启动计算机。如要在Windows95/98/ME系统中不显示重新启动的提示,可以增加参数设置,如下:
SPNComboInst1.0.exe" /v"/qn reboot=suppress"
Rainbow的系统驱动程序会不定期进行升级,所以我们建议开发商从彩虹公司的主页下载并使用最新系统驱动程序。
最终用户已经安装加密锁的计算机上,需要安装加密锁驱动程序。具体安装过程请参见章。
3. 在Novell上安装服务程序:
1) 将光盘Sentinel SuperPro Server\NOVELL 目录中的spnnwsrv.nlm拷贝到硬盘中。
2) 运行load spnnwsrv来安装服务程序。(unload spnnwsrv卸载服务)
4. 安装加密后的软件
在局域网上的计算机上,安装加密后的软件。注意:没有安装加密锁的计算机上,不需要安装加密锁驱动程序。
完成四要素后,开发商的整个打包制作安装程序过程就完成了。就可以发布、销售加密后的软件了。
章 SuperProNet开发组件的安装
1. SuperProNet开发组件的组成
2. 系统要求
3. 准备
4. 安装SuperProNet加密锁开发组件光盘
5. SuperProNet开发组件系统菜单构成
6. SuperProNet开发组件硬盘目录结构
第二章 关于SuperProNet加密锁
1. SuperProNet网络锁如何工作
2. 单模块和多模块用户数控制
3. SuperProNet的外壳加密机制和API加密机制
4. SuperProNet加密锁的结构
第三章 完成SuperProNet加密软件流程
1. 定义SuperProNet用户数和加密算法,生成校验数据
2. 嵌入SuperProNet API函数到开发商的程序
3. 封装、发行开发商的软件
第四章 外壳软件保护方式保护开发商的软件
1. 输入开发商ID和操作密码
2. 选择外壳软件保护方式
3. 定义被保护软件的项目名
4. 选择SuperProNet保护软件的算法单元和定义算法因子
5. 输入被保护的软件和保护后生成的软件的路径名和文件名
6. 定义被保护软件为正式版本软件
7. 定义错误信息表
8. 编辑被保护软件的项目
9. 将加密算法因子写入SuperProNet软件保护锁
10. 保护应用程序
11. 保存工程文件
12. 检验被保护软件的保护效果
第五章 嵌入API软件保护方式保护开发商的软件
1、定义SuperProNet中的用户数
2. 在多模块控制中加入算法保护
3. 定义被保护软件的项目名
4. 选择SuperProNet保护软件的算法单元和定义算法因子
5. 定义被保护软件为正式版本软件
6. 编辑软件保护项目
7. 将加密算法因子写入SuperProNet软件保护锁
8. 生成校验数据
9. 校验数据——“查询、响应串”
10. 保存工程文件
11. 嵌入SuperProNet API校验函数部分
第六章 嵌入SuperProNet API校验函数到源程序
1. API函数组成
2. API加密方式的流程:
3. 编译/连接、运行、调试例子程序
4. 检验加密效果:
第七章 定时查找网络加密锁SuperProNet
第八章 批量保护开发商的软件
第九章 封装、发行开发商的软件
1. 安装SuperProNet加密锁
2. 安装SuperProNet驱动程序和服务程序
3. 在Novell上安装服务程序:
4. 安装加密后的软件
第十章 客户技术支持
章 SuperProNet开发组件的安装
1. SuperProNet开发组件的组成
一只SuperProNet软件保护锁。
一张SuperProNet开发组件安装程序光盘。
一封带有开发商ID和加密锁密码的信封。
一本开发商手册(英文)
一本SuperProNet用户使用手册(本文)。
2. 系统要求
CPU Pentium 90MHz 以上IBM兼容机。
Windows9x,windows ME,WindowsNT4,Windows2000操作系统。
40M以上的剩余硬盘空间。
640x480 256色以上显示分辨率。
光盘驱动器。
32M内存
Internet Explorer 4.01以上版本
安装开发组件光盘时,建议关闭系统中已运行的应用程序。
3. 准备
(1) 打开开发组件中的信封,将里面的开发商ID和加密锁密码的信纸取出并准备在手边。
(2) 将SuperProNet加密锁插入计算机并口(可以带电拔插)。
(3) 系统“控制面板”中“网络设置”至少需要有TCP/IP,IPX/SPX,NetBEUI网络通讯协议中的一种。
(4) 将SuperProNet开发组件安装程序光盘取出准备手边。
(5) 将SuperProNet用户使用手册(本文)准备手边。
4. 安装SuperProNet加密锁开发组件光盘
将SuperProNet 开发组件安装程序光盘插入光驱内。
开发组件光盘“AUTORUN”自动启动安装程序进入安装程序界面。(如果您的计算机关闭了AUTORUN功能,请点击光盘根目录的SentinelSuperPro6.2.0.exe程序)
根据安装程序提示安装所需要开发工具(建议使用缺省安装)。具体安装SuperProNet光盘步骤如下:
(1) 安装程序开始运行,点击Next;
(2) 安装程序显示版权协议说明,如果您同意请选择I accept…后点击NEXT;
(3) 安装程序提示输入您的名字和公司名称,然后点击NEXT;
(4) 安装程序提示选择完全安装或手动安装,建议使用完全(Complete)安装,然后点击NEXT;
(5) 安装程序提示安装SuperProNet开发组件,您可以选择安装路径,点击 NEXT;(建议使用缺省路径);
(6) 安装程序提示开始安装,点击INSTALL;
(7) 安装程序提示您安装完毕,点击FINISH;
(8) 操作系统会要求重新启动计算机。
5. SuperProNet开发组件系统菜单构成
6. SuperProNet开发组件硬盘目录结构
第二章 关于SuperProNet加密锁
1. SuperProNet网络锁如何工作
Rainbow的SuperProNet网络锁有两个主要的功能 ,“并发控制”和“软件保护”。所谓“并发控制”是指:一只SuperProNet网络锁可以控制在局域网上同时使用开发商软件的用户数。“软件保护” 是指:SuperProNet网络锁防止未经允许非法使用开发商软件。
SuperProNet 网络结构图:
局域网
注:此处的“用户程序”是指开发商开发的并提供给最终用户的应用程序。
“用户程序”与“服务程序”对话流程图:
(1) 最终用户在局域网上的计算机的并口,插入SuperProNet网络锁。在这台计算机的操作系统(Windows9x/Windows2000/Windows NT)上,运行SuperProNet Server程序。开发商开发的“用户程序”通过局域网上的网络协议与SuperProNet服务程序对话。
(2) 开发商的“用户程序”运行开始,就通过局域网上的网络协议向“服务程序”申请“使用许可证”。Rainbow 的“服务程序”根据开发商加密锁中定义的用户数(许可证数)和当前的“用户程序”占用“许可证”状况,决定是否返回“使用许可证”。:步骤1和步骤2。如果用户数(许可证数)被占满,“服务程序”将不返回“使用许可证”,开发商的“用户程序”就会终止。例如:5用户的加密锁,每启动一个“用户程序”占用一个“使用许可证”,用户数(许可证数)减一,直到第6个“用户程序”启动申请“使用许可证”,这时用户数(许可证数)已占满“服务程序”返回拒绝使用信息。第6个启动“用户程序”就会终止运行。
(3) 已经获得“使用许可证”的“用户程序”运行过程中,向“服务程序”发出的查询申请,查询加密锁单元中的数据,“服务程序”读加密锁并返回加密锁单元中的数据。 开发商的“用户程序”对返回值进行比较鉴定并进行相应的动作。错误的返回值表明运行“服务程序”的计算机没有插上正确的网络加密锁或网络加密锁已经被拔走,于是开发商的应用程序就会终止。软件可能被非法拷贝,但不能被正确运行。
(4) 已经获得“使用许可证”的“用户程序”运行结束前,返回“服务程序”“使用许可证”。以便在局域网络内部,其它“用户程序”申请此“使用许可证”。
2. 单模块和多模块用户数控制
(1) 单模块控制:SuperProNet可以单独控制一个软件的用户数。
(2) 多模块控制:SuperProNet也可以同时分别控制多个软件或多个模块的用户数。
3. SuperProNet的外壳加密机制和API加密机制
(1) 外壳加密:使用外壳加密工具对可执行文件直接加密。
(2) API加密:在软件的原程序中直接加入查找加密锁的代码,编译后执行。
4. SuperProNet加密锁的结构
SuperProNet一共有128个字节,用户可使用部分有112字节,操作网络锁是以字节或双字节为单位。00-07单元是保留单元,用户可编辑使用部分是08~3F 字单元,共56个单元
(1) 软件保护锁内部单元中,以偶字节开头的两个连续的单元可以定义一个算法单元,保护一个应用程序。如:08/09单元,2A/2B单元,3E/3F单元都是算法单元,它们每个都可以保护一个应用程序。
(2) 56个单元最多可以28个算法单元。因此,一个SuperProNet软件保护锁可以分别保护28个应用程序。
(3) 被保护的应用程序实际上是对SuperProNet内部的算法单元发“查询串”,算法单元运算“查询串”返回给应用程序运算结果“响应串”。
(4) 软件开发商使用“外壳软件保护方式”保护软件,只需要就是定义“算法单元”的加密算法,SuperProNet开发工具就可自动完成软件保护过程。
(5) 软件开发商使用“嵌入API软件保护方式” 保护软件,首先需要定义“算法单元”的加密算法,然后,生成一定数量的“查询串” “响应串”对,最后,在源程序代码中嵌入向SuperPro发“查询串”的查询函数,并比较返回的“响应串”与预先知道的“响应串”是否相等,然后,进行相应的操作。
开发商如果只有一个软件需要控制使用用户数(单模块控制),可以直接订购所需用户数的加密锁,而不用再进行更改。对于有多个软件或多个模块的开发商可以使用07-3F中任一单元控制“用户数”和“子模块数” (多模块控制)。
单模块控制:
例1:比如我们有一个软件Notepad,需要并发控制整个Notepad用户数为25。直接购买25用户SuperProNet即可
多模块控制:
例2:比如我们有一套Office3000,包括Notepad (记事本),Calc(计算器),Pbrush(画笔)三个软件,需要控制同时使用Office的用户数为25,子模块notepad 10用户,子模块calc 6用户,子模块pbrush 4用户。首先,可以购买25用户数的SuperProNet。其次,定义控制Notepad,Calc,Pbrush 3个子模块的用户数。控制子模块Notepad用户数单元是08#单元,输入为10(十进制数),控制子模块Calc的单元是09#单元,输入为06 (十进制) 。控制子模块Pbrush的单元是0A#单元,输入为04 (十进制)。在网络锁的单元输入如下:
Notepad Calc Pbrush
08#单元 09#单元 0A#单元
10 06 04
注: 模块0,Notepad的用户数由08#单元决定;模块1,Calc的用户数由09#单元决定; 模块2,pbrush的用户数由0A#单元决定。
第三章 完成SuperProNet加密软件流程
1. 定义SuperProNet用户数和加密算法,生成校验数据
开发商使用SuperProNet编辑工具SuperProNet,定义SuperProNet 加密锁“用户数”和加密算法,并生成校验数据。
2. 嵌入SuperProNet API函数到开发商的程序
A、外壳加密程序可以直接对可执行文件进行保护,自动插入校验代码。
B、开发商在自己的源程序中嵌入 API函数调用,经过调试、编译、连接后,生成被加密的可执行文件。也就是最终用户使用的“用户程序”。
3. 封装、发行开发商的软件
开发商将Rainbow的服务程序,驱动程序和加密后的程序整和在一起发布给最终用户。
下面的章节,我们就按照以上的三个过程举例说明两个例子程序。
例1(第四章)使用外壳加密工具保护软件Notepad,并且控制Notepad的用户数。
例2(第五章,第六章)使用API保护方式保护三个软件Notepad(记事本),Calc(计算器),Pbrush(画笔),并分别控制三个软件的用户数。
如果您只有一个软件,只 需要控制这个软件的用户数,请参阅第四章例1的说明。如果您有多个软件或多模块都需要分别控制用户数请参阅第五章,第六章,例2的说明。
第四章 外壳软件保护方式保护开发商的软件
SuperProNet加密锁与以往的网络加密锁不同,新增加了外壳加密工具,可以直接保护应用程序,开发商的应用程序不需要源程序。只需要提供可执行文件(EXE文件)或动态连接库(DLL文件)就可以了。对于只需要控制一套软件来说,外壳加密使流程更加简单化。
外壳软件保护方式的工作机制:
将您的程序分为几块,打乱代码。防止DEBUG等反汇编程序。
(1) 采用美国彩虹公司专门设计的软件保护策略,将查询校验加密算法的指令插入应用程序之中。
(2) 应用程序增加实用的功能。如:执行时间控制,执行次数控制,到期时间控制等。
例1:比如我们有一个软件Notepad,需要并发控制notepad用户数为25。直接购买25用户SuperProNet。下面我们就举例说明用SuperProNet外壳加密工具,用一只SuperProNet保护notepad软件。(注:加密锁的用户数目是由加密锁销售商觉得能够决定,购买时请联系销售商定制)
1. 输入开发商ID和操作密码
(1) 鼠标点击“开始-〉程序-〉Rainbow Technologies-〉SuperPro-〉6.2-〉SentinelSuperPro 6.2 Toolkit”菜单项,就进入如下界面。
(2) 执行步骤1步骤2步骤3。输入开发商ID号和操作SuperProNet软件保护锁的密码,确认输入后,开发工具进入主界面。注意:开发商ID号和密码只需要输入一次开发工具就会记住,以后再进入时ID号和密码不必重新输入。窗口只有次进入开发工具时才会出现。
2. 选择外壳软件保护方式
(1) 主窗口中,标识14是主窗口按钮,点击此按钮就会回到主窗口。标识15是Sentinel的产品概述,开发商可以点击此按钮阅读。标识16是对工程文件的处理操作窗口,每次开发商定义加密算法都保存在工程文件之中,此窗口可以“打开”,“保存”,“另存”操作这些工程文件,因为,我们这是次使用开发工具,还不涉及到操作工程文件。
(2) 执行步骤4。进入设计算法窗口。
(3) 执行步骤5。进入设计算法窗口。
(4) 执行步骤6,步骤7。进入选择软件保护方式窗口。
3. 定义被保护软件的项目名
(1) 执行步骤8步骤9。选择外壳软件保护方式,进入下一窗口。
(2) 执行步骤10,步骤11。输入项目标识名,进入下一窗口。
4. 选择SuperProNet保护软件的算法单元和定义算法因子
(1) 执行步骤12步骤13步骤14步骤15。选择保护软件的算法单元,输入算法因子,进入下一窗口。
5. 输入被保护的软件和保护后生成的软件的路径名和文件名
(1) 执行步骤16步骤17步骤18。输入被保护的软件Notepad.exe(记事本)路径名和文件名,以及保护后生成的Notepad.exe路径名和文件名。进入下一窗口。
(2) 执行标识17,18,19是制作演示版软件的选项。执行步骤19,进入下一窗口。
6. 定义被保护软件为正式版本软件
1) 执行步骤20步骤21。选择永久活动算法单元项,保护软件。进入下一个窗体。
7. 定义错误信息表
1) 使用SuperProNet外壳保护软件时,开发商可以将原来的与SuperProNet有关的英文错误信息,修改为对应的中文错误信息。注意:这些错误信息只是找不到锁或锁算法查询不对时才出现,开发商可以保存原来的英文信息不变。执行步骤22步骤23。进入下一个窗体。
8. 编辑被保护软件的项目
(1) 至此,我们完成了定义保护软件Notepad项目过程。窗口中增加了一个Notepad项目名,标识24。软件开发商可以再增加、编辑、删除已有的项目:标识25标识26标识27。
(2) 执行步骤24,进入写入加密算法窗体。
9. 将加密算法因子写入SuperProNet软件保护锁
(1) 执行步骤25步骤26,将加密算法写入SuperProNet,进入实施保护软件窗体。(注:请确认已将加密锁插在计算机的并口上。)
10. 保护应用程序
(1) 执行步骤27,保护Notepad(记事本)软件。至此,就完成了整个软件保护过程。
11. 保存工程文件
(1) 开发商需要保存定义加密算法的工程文件,以便发布软件时,批量写入其他的SuperProNet加密算法。
(2) 执行步骤28步骤29,选择菜单 File->Save保存工程文件,输入我们指定的工程文件的文件名myfirst,并保存到指定的硬盘中的妥善位置。
12. 检验被保护软件的保护效果
插入写入算法的SuperProNet到Server服务器并口上,将被保护的Notepad复制到其他计算机上,并确认两台机器之间通讯正常,则被保护的Notepad(记事本)可以正常使用,并且被保护的软件与保护前软件功能完全相同。将这只SuperProNet从Server并口拔下,则被保护的软件将不能使用,出现软件拒绝使用窗口。注意:此窗口信息为外壳保护工具定义的缺省英文信息,如果在本章第7步中修改了错误信息表,显示的内容将是修改后的信息。
第五章 嵌入API软件保护方式保护开发商的软件
开发商直接在源程序代码中嵌入校验加密算法的SuperProNet API函数调用,程序经过编译、连接后,生成与SuperProNet绑定的应用程序。开发商可以通过API软件保护方式来设计自己的加密方案,控制加密点在程序中嵌入的频度和位置。
嵌入API软件保护方式软件保护过程分为四部分:定义SuperProNet中的用户数部分,定义SuperProNet中的加密算法部分;生成校验数据对——“查询串”“响应串”部分;嵌入源程序SuperProNet API校验函数部分。
下面我们就举例API软件保护方式,使用SuperProNet算法单元保护一个Microsoft Visual C++的程序,我们假设需要保护的软件名是Notepad,Calc和Pbrush。注意:SuperProNet可以保护绝大多数计算机语言开发的软件,关于如何获得您所需的计算机语言的API接口程序,请到C:\Program Files\Rainbow Technologies\SuperPro\6.2\Intf目录查找,或到主页下载。
例2的分析
需求:Office3000其中包括Notepad,Calc,Pbrush三个软件。需要控制整个Office用户数为25,其中Notepad 10用户,Calcl 6用户,Pbrush 4用户。
分析:我们可以购买25用户的SuperProNet网络锁,并用08#单元控制子模块“Notepad”用户数;09#单元控制子模块“Calc”用户数;10#单元控制子模块“Pbrush”用户数。如下所示:
Notepad Calc Pbrush
定义用户数单元 08#单元 09#单元 0A#单元
定义数据算法单元 10#单元
11#单元 12#单元
13#单元 14#单元
15#单元
注: 模块0,Notepad的用户数由08#单元决定,定义数据算法单元在10#和11#单元;模块1,Calc的用户数由09#单元决定,定义数据算法单元在12#和13#单元; 模块2,pbrush的用户数由0A#单元决定,定义数据算法单元在14#和15#单元。
1、定义SuperProNet中的用户数
(1) 执行步骤1,增加保护应用程序项目。
(2) 执行步骤2,选择自定义项目。步骤3进入下一步。
(3) 执行步骤4,选择子用户数项目,步骤5,点击进入下一步。
(4) 执行步骤,输入软件标识,个软件为Notepad,就输入Notepad license。步骤7点击进入下一步
(5) 步骤8,选择Notepad的用户数为10,步骤9选择Notepad用户数单位地址为08单元,步骤10点击进入下步。
(6) 步骤10完成以后,我们已经完成了定义保护软件Notepad“用户数”项目过程,标识10。其他的应用程序Calc,Pbrush可以使用,标识13增加新的“用户数”项目,增加项目的步骤与项目Notepad完全相同,按相同步骤即可定义Calc,Pbrush分别为6用户,4用户,标识12,标识13。
2. 在多模块控制中加入算法保护
(1) 执行步骤11。进入设计算法窗口。
(2) 执行步骤12,13。进入选择软件保护方式窗口。
(3) 执行步骤14,步骤15。进入定义项目名窗口。
3. 定义被保护软件的项目名
(1) 执行步骤16,步骤17。假设需要保护的软件名叫Notepad,我们输入项目标识名notepad,进入下一窗口。
4. 选择SuperProNet保护软件的算法单元和定义算法因子
(1) 执行步骤18步骤19步骤20步骤21。选择10#单元作为保护软件的算法单元,输入算法因子,进入下一窗口。注意:使用者一定要记住选择的算法单元号,以便生成校验数据对时定位算法单元的位置,并注意不用与设置用户数的单元重复。
5. 定义被保护软件为正式版本软件
(1) 执行步骤22,步骤23。选择活动(Active)算法单元项,保护软件。进入下一个窗体。注意:关于标识24,标识25的有关制作演示版本软件的功能,请参考相关电子文档手册。
6. 编辑软件保护项目
(1) 至此,我们已经完成了定义保护软件Notepad项目过程,如标识19。注:Calc和Pbrush可以使用,标识20增加新的项目,增加项目的步骤与项目Notepad完全相同。
(2) 执行步骤24, 进入将算法因子写入SuperProNet窗口。
7. 将加密算法因子写入SuperProNet软件保护锁
(1) 执行步骤25, 将算法因子写入SuperProNet算法单元,执行步骤26,进入生成校验数据窗口。
8. 生成校验数据
(1) 进入后,执行步骤27,进入API软件保护窗口。然后,执行步骤28进入生成校验数据窗口。此时,屏幕上出现的是生成“查询串”和“响应串”的参数选项,我们需要进一步的设置这些参数,以便为生成算法校验数据做准备。以下,我们将介绍这些参数的意义和设置方法。
(2) 加密算法的单元号:我们在第五章步骤18中,设定保护软件Notepad的SuperProNet算法单元为10#单元。因此,需要在生成校验数据前指定我们已定义算法的单元号。执行步骤29选择10#算法单元。
(3) 查询串、响应串的长度:SuperProNet算法单元可以运算的“查询串”和生成的“响应串”长度最小为1字节,最多为20字节。 “查询串”长度越长,算法单元运算生成的“响应串”越长,软件保护的强度越强。注意:如果“查询串”长度小于4字节,加密算法很容易被穷尽,软件保护的强度将很弱。如果“查询串”长度在4字节以上,加密算法很难被破解,软件的才安全。执行步骤30,设置“查询、响应串”的长度为4字节。
(4) 查询响应对的数量:开发商在源程序中,插入SuperProNet的API查询函数,并编译生成被保护的程序。被保护的程序在运行过程中,不断的向SuperProNet的算法单元发查询串,并比较SuperProNet返回的响应串,如果响应串与预知的不一样程序将终止运行。 程序中查询校验加密算法的数据越多则软件保护的强度越强。在此举例说明的程序因为篇幅的有限,只使用了10对查询响应对,执行步骤31,指定生成“查询、响应串”的数量为10对。注意:我们建议开发商保护程序时使用100对以上的查询响应对。
(5) 查询响应串的数据结构表示:一个字节十进制表示范围是0~255,十六进制表示的范围0~FF。查询SuperProNet单元的查询串是以字节为单位的。如果我们4字节的查询串是:B8, DA, D0, 8E(十六进制),计算生成响应串是:42, A8, 60, 88(十六进制)。那么C语言表示的十六进制数据结构是无符号数组型,查询串:unsigned char Query[4]={ 0xB8, 0xDA, 0xD0, 0x8E};响应串:unsigned char Response [4]={ 0x42, 0xA8, 0x60, 0x88}。SuperProNet查询响应生成工具能够自动转换生成了三种语言的数据结构,Basic, C,Delphi 。其它的计算机语言的数据结构开发商可以手工进行转换。执行步骤32,选择生成“查询、响应串”的数据类型为C语言三位数组(3 Dimensional array declaration - (C code))。注意:开发商保护自己的程序时,可以选择相应语言的数据结构,所示三种语言数据结构列表。
(6) 执行步骤33,生成“查询、响应串”。显示查询响应串窗口。
9. 校验数据——“查询、响应串”
(1)标识23所示生成的C语言“查询、响应串”三位数组。放大后的数据所示。
unsigned char QueryResponses[][2][4] = {
{ { 0xB8, 0xDA, 0xD0, 0x8E }, { 0x42, 0xA8, 0x60, 0x88 } },
{ { 0x63, 0xEB, 0xAE, 0x01 }, { 0x72, 0xB8, 0xDD, 0x0A } },
{ { 0x26, 0x8F, 0x3D, 0x24 }, { 0xD6, 0xB2, 0x60, 0x22 } },
{ { 0x87, 0x43, 0xD4, 0x86 }, { 0x50, 0xEA, 0xB1, 0x8E } },
{ { 0x2F, 0x22, 0xF3, 0x33 }, { 0x43, 0xBC, 0xB3, 0x91 } },
{ { 0x4A, 0xB6, 0xCD, 0x27 }, { 0x0B, 0xFE, 0xA4, 0xF8 } },
{ { 0x2D, 0x0E, 0x03, 0x08 }, { 0x31, 0x80, 0x5C, 0xD1 } },
{ { 0x3B, 0x10, 0xB3, 0x14 }, { 0xF0, 0x1B, 0x88, 0x07 } },
{ { 0x11, 0xB1, 0x58, 0xC0 }, { 0x66, 0x3E, 0xC2, 0x9E } },
{ { 0xA3, 0x14, 0x22, 0xC3 }, { 0x00, 0xEA, 0xA3, 0x93 } }
};
(2) 数组QueryResponses[ ][2][4],维QueryResponses[x]是查询响应串的数量,我们生成的是10组查询响应对。第二维中QueryResponses[x][0]代表“查询串”,QueryResponses[x][1] 代表“响应串”。第三维中QueryResponses[x][y][4]是“查询串” “响应串”的长度4字节。
(3) 执行步骤34,将“查询、响应串”保存到文件中。
(4) 执行步骤35步骤36。将“查询、响应串”三位数组保存到一个文本文件data1.txt之中。
10. 保存工程文件
(1) 开发商需要保存定义加密算法的工程文件,以便发布软件时,批量写入其他的SuperProNet加密算法。
(2) 执行步骤37步骤38,选择菜单 File->Save保存工程文件,输入我们指定的工程文件的文件名mysecond,并保存到指定的硬盘中的妥善位置。
11. 嵌入SuperProNet API校验函数部分
详见第六章
第六章 嵌入SuperProNet API校验函数到源程序
1. API函数组成
使用SuperProNet API加密多软件或多模块控制程序主要由五部分组成。
(1) 向Server申请“许可证” 函数(程序开头部分调用)。
程序与Server申请“使用许可证”。用以程序判断是否运行。
(2) 向Server申请子模块的“子许可证” 函数(程序开头部分调用)。
程序与Server申请“子使用许可证”。用以程序判断是否运行。例2中子模块Notepad,Calc,Pbrush“子使用许可证”由此函数申请。
(3) 查询校验数据函数(程序运行过程中多次调用)。
程序向Server发查询校验加密锁单元的数据。用以防止最终用户在使用过程中将加密锁拔除,“一锁多用”。
(4) 释放子模块“子使用许可证”函数(程序运行结束时调用)。
程序向Server返还“子使用许可证”,以便其它的用户使用此“子使用许可证”。例2中子模块Notepad,Calc,Pbrush“子使用许可证”由此函数返还。
(5) 释放“使用许可证”函数(程序运行结束时调用)。程序向Server返还“使用许可证”,以便其它的用户使用此“使用许可证”。具体的使用流程所显示。
2. API加密方式的流程:
例2程序中Notepad加密部分的源代码(注:Calc和Pbrush与此代码结构相同)
#include "stdafx.h"
#include "spromeps.h"
#include
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
SP_STATUS spStatus;
RB_SPRO_APIPACKET ApiPacket;
static RB_DWORD qResult32;
///////////////////////////////////////////////////////////////////
spStatus = RNBOsproFormatPacket( ApiPacket, sizeof(ApiPacket) );
SpStatus = RNBOsproInitialize( ApiPacket );
///////////////////////////////////////////////////////////////////
RB_WORD developerID=0x2467;
spStatus = RNBOsproFindFirstUnit( ApiPacket,developerID );
// ▲▲▲
// 加密琐的ID号
if ( spStatus != SP_SUCCESS )
{
MessageBox( NULL,"找不到加密锁",
"加密锁",
MB_ICONINFORMATION | MB_TASKMODAL );
return( FALSE );
}
else
{
MessageBox( NULL,
"找到加密锁",
"加密锁",
MB_ICONINFORMATION | MB_TASKMODAL );
}
///////////////////////////////////////////////////////////////////
spStatus = RNBOsproGetSubLicense( ApiPacket, 0x08);
if ( spStatus != SP_SUCCESS ) // ▲▲▲
// (0x08为Notepad
// 所使用的用户数单元
// 请参见本手册第25页例2)
{
MessageBox( NULL,"获得子许可证不成功",
"获得许可证结果",
MB_ICONINFORMATION | MB_TASKMODAL );
return( FALSE );
}
else
{
MessageBox( NULL,
"获得子许可证成功",
"获得许可证结果",
MB_ICONINFORMATION | MB_TASKMODAL );
}
///////////////////////////////////////////////////////////////////
//"B8DAD08E", "42A86088" 此组数据见第五章
unsigned char queryData[]={0xB8, 0xDA, 0xD0, 0x8E};
unsigned char cmpqueryData[]={0x42, 0xA8, 0x60, 0x88};
unsigned char response[]={0,0,0,0};
int cellAddress =0x10; //(0x10为Notepad所使用算法单元
// 请参见本手册第25页例2)
int queryLength =4;
spStatus = RNBOsproQuery( ApiPacket,
cellAddress,
&queryData,
&response,
&qResult32,
queryLength );
spStatus= memcmp( response, cmpqueryData, 4 );
if ( spStatus != SP_SUCCESS )
{
MessageBox( NULL,"查询不成功",
"查询结果",
MB_ICONINFORMATION | MB_TASKMODAL );
return( FALSE );
}
else
{
MessageBox( NULL,
"查询成功",
"查询结果",
MB_ICONINFORMATION | MB_TASKMODAL );
}
//
/////////////////////////////////////////////////////////////////////////////////////
unsigned short numSubLic = 1;
spStatus = RNBOsproReleaseLicense( ApiPacket, 0x08 , &numSubLic );
if ( spStatus != SP_SUCCESS ) // ▲▲▲
// (0x08为Notepad
// 所使用的用户数单元
// 请参见本手册第25页例2)
{
MessageBox( NULL,"释放子许可证不成功",
"释放子许可证结果",
MB_ICONINFORMATION | MB_TASKMODAL );
return( FALSE );
}
else
{
MessageBox( NULL,
"释放子许可证成功",
"释放子许可证结果",
MB_ICONINFORMATION | MB_TASKMODAL );
}
///////////////////////////////////////////////////////////////////
spStatus = RNBOsproReleaseLicense( ApiPacket, 0 , NULL );
if ( spStatus != SP_SUCCESS )
{
MessageBox( NULL,"释放许可证不成功",
"释放许可证结果",
MB_ICONINFORMATION | MB_TASKMODAL );
return( FALSE );
}
else
{
MessageBox( NULL,
"释放许可证成功",
"释放许可证结果",
MB_ICONINFORMATION | MB_TASKMODAL );
}
return 0;
}
注意:以上我们只举例说明模块0,Notepad模块。其他模块Calc,Pbrush也是通过RNBOsproGetSubLicense( )函数来实现。形式如下:
RNBOsproGetSubLicense( ApiPacket, 0x08),08为单元号。
相对于例2来说,Calc的用户数单元号为09,Pbrush为0A。
3. 编译/连接、运行、调试例子程序
详细的文件构成请参阅目录中的“Readme.txt”。请替换例子程序的开发商ID号,为您的开发商ID。然后编译连接成可执行文件。
4. 检验加密效果:
插入写入算法的SuperProNet到Server服务器并口上,将被保护的Notepad复制到其他计算机上,并确认两台机器之间通讯正常,则被保护的Notepad(记事本)可以正常使用,并且被保护的软件与保护前软件功能完全相同。将这只SuperProNet从Server并口拔下被保护的软件将不能使用,出现“找不到加密锁”窗口。
注意:以上我们列出了一个使用SuperProNet加密保护的Visual C++简化示例程序。如果您需要其它语言的简化示例程序,如: Visual Basic, Visual Foxpro, C++ Builder, Power Builder , Delphi等。详情请参阅开发光盘中的API目录中的相应例程。
第七章 定时查找网络加密锁SuperProNet
在使用API方式进行软件保护时,一定要在程序中加入定时查询。加入定时查询的好处是可以防止某些用户,在软件正常启动后,将加密锁拔下换到别的机器上,从而达到增加用户数的目的。另外,由于种种原因,当一个获得了许可证的客户端因为非法退出,(比如死机),而没有释放许可证的话,那么这个许可证就不会被释放了,这样造成的后果就是,每当有一个客户端非法退出,就会浪费一个许可证,造成用户数的无谓浪费。为了解决这个问题,服务程序会要求客户端定期访问加密锁,凡是发现超时没有联系的,就会释放掉这个客户端申请的license,给其他客户端使用。Server端要求每120秒客户端查询一次加密锁,因此客户端需要在程序中加入每90秒一次的定时查询。
下面以VC为例说明定时查询的用法。注:此处程序为截选
void CVctimerDlg::OnTimer(UINT nIDEvent)
{
if(nIDEvent == 1234)
{ unsigned char queryData[]={0x12,0x34,0x56,0x78};
unsigned char cmpqueryData[]={0x41,0x2f,0x9b,0x52};
unsigned char response[]={0,0,0,0};
int cellAddress =0x8;
int queryLength =4;
spStatus = RNBOsproQuery( ApiPacket,
cellAddress,
&queryData,
&response,
NULL,
queryLength );
spStatus= memcmp( response, cmpqueryData, 4 );
if ( spStatus != SP_SUCCESS )
{
MessageBox("心跳查询不成功" );
}
else
{
//MessageBox( "心跳查询成功" );
}
}
CDialog::OnTimer(nIDEvent);
}
void CVctimerDlg::OnButton1()
{
spStatus = RNBOsproFormatPacket( ApiPacket, sizeof(ApiPacket) );
spStatus = RNBOsproInitialize( ApiPacket );
RB_WORD developerID=0x2467;
spStatus = RNBOsproFindFirstUnit( ApiPacket,developerID );
// ▲▲▲
// 加密琐的ID号
if ( spStatus != SP_SUCCESS )
{
MessageBox("获得主许可证不成功");
}
else
{
MessageBox("获得主许可证成功");
}
spStatus = RNBOsproSetHeartBeat(ApiPacket,500); //设定server的timeout心跳时间为500秒
SetTimer(1234,90000,NULL); //设定定时查询为90秒一次
}
///////////////////////////////////////////////////////////////////
//12345678, AB3F93E5
unsigned char queryData[]={0x12,0x34,0x56,0x78};
unsigned char cmpqueryData[]={0xAB,0x3F,0x93,0xE5};
unsigned char response[]={0,0,0,0};
int cellAddress =0x8;
int queryLength =4;
spStatus = RNBOsproQuery( ApiPacket,
cellAddress,
&queryData,
&response,
NULL,
queryLength );
spStatus= memcmp( response, cmpqueryData, 4 );
if ( spStatus != SP_SUCCESS )
{
MessageBox("query查询不成功");
}
else
{
MessageBox("query查询成功");
}
第八章 批量保护开发商的软件
当调试完毕并完成整个的加密过程后,开发商需要成批的保护软件。开发商可以从加密锁的代理商处购买相同开发商ID号的加密锁。然后,使用Make Keys Utility将我们定义的数据写入新的加密锁。例如:在例2中我们完成加密后,就可以购买相同开发商ID号的加密锁了。然后,使用Make Keys Utility将保存的数据写入加密锁。
从开始—>程序—> Rainbow Technologies—> SuperPro—> 6.2—>Make Keys Utility来执行批量保护程序Make Keys Utility
(1) 执行步骤1,选择菜单条File->Open打开已保存的文件。
(2) 执行步骤2,输入步骤38已保存的文件名“mysecond.spp”。
(3) 执行步骤3,确认输入操作。
(4) 执行步骤4,将数据写入新的加密锁。
(5) 换下加密锁,并插上一只新的加密锁,重复步骤4,完成批量做锁工作。
第九章 封装、发行开发商的软件
当开发商完成整个加密过程并完成全部调试后,开发商就可以封装、打包开发商的软件制作安装程序了。
运行使用开发商加密后的软件,需要有四个要素:开发商写入数据的SuperProNet加密锁;网络锁的服务程序;加密锁的驱动程序;开发商加密后的软件。这四个要素缺一不可。开发商发布销售软件给最终用户,最终用户需要在局域网内,任意一台计算机操作系统(Windows9x,Windows NT,Windows2000)上,安装网络锁的服务程序和加密锁的驱动程序,并将“加密锁”插在这台计算机并口上,最终用户在局域网上的客户端安装开发商的软件,最终用户就可以使用加密后的软件了。
我们已经完成了两个要素,将数据写入SuperProNet加密锁;加密开发商的软件。接下来我们需要设计某种机制使最终用户可以安装加密锁的驱动程序和服务程序。
开发商需要按照以下的顺序设计机制完成制作安装程序。
1. 安装SuperProNet加密锁
在选择安装服务程序的计算机的并口上,插入网络加密锁 (注意:可以带电插拔加密锁) 。
2. 安装SuperProNet驱动程序和服务程序
进入光盘中\driver&Server\Internet Installer目录,执行SPNComboInst1.0.exe,开始安装驱动程序。(注:如果已经安装了5.39以前版本的驱动,安装程序会自动卸载旧版本,并重新启动后继续安装。)
具体安装步骤:
1) 点击“next”
2) 选择 “I accept the terms in the license agreement”,点击“next”
3) 使用默认安装路径(或用户自行更改路径),点击“next”
4) 选择完全安装(complete),点击next;(需要40M硬盘空间)
5) (提示在安装过程中不要插入任何USB key),点击install开始安装;
6) 点击finish,驱动程序和服务程序安装结束。
(注:在Windows95/98/ME系统中会提示需要重新启动计算机,在windows2000和windows NT系统不需要重新启动计算机。如要在Windows95/98/ME系统中不显示重新启动的提示,可以增加参数设置,如下:
SPNComboInst1.0.exe" /v"/qn reboot=suppress"
Rainbow的系统驱动程序会不定期进行升级,所以我们建议开发商从彩虹公司的主页下载并使用最新系统驱动程序。
最终用户已经安装加密锁的计算机上,需要安装加密锁驱动程序。具体安装过程请参见章。
3. 在Novell上安装服务程序:
1) 将光盘Sentinel SuperPro Server\NOVELL 目录中的spnnwsrv.nlm拷贝到硬盘中。
2) 运行load spnnwsrv来安装服务程序。(unload spnnwsrv卸载服务)
4. 安装加密后的软件
在局域网上的计算机上,安装加密后的软件。注意:没有安装加密锁的计算机上,不需要安装加密锁驱动程序。
完成四要素后,开发商的整个打包制作安装程序过程就完成了。就可以发布、销售加密后的软件了。
老A科技可提供软件加密狗1:1正版克隆硬复制 软件软解密 软件注册编写服务!
我们承诺只承接加密狗复制及解密相关工作。绝对不贩卖做出技术性成果文件,保护客户隐私!
技术合作咨询电话:18103884865 QQ:1601500861