共享软件加解密与注册方法研究.doc

上传人:爱问知识人 文档编号:3622657 上传时间:2019-09-18 格式:DOC 页数:7 大小:138KB
返回 下载 相关 举报
共享软件加解密与注册方法研究.doc_第1页
第1页 / 共7页
共享软件加解密与注册方法研究.doc_第2页
第2页 / 共7页
共享软件加解密与注册方法研究.doc_第3页
第3页 / 共7页
共享软件加解密与注册方法研究.doc_第4页
第4页 / 共7页
共享软件加解密与注册方法研究.doc_第5页
第5页 / 共7页
亲,该文档总共7页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《共享软件加解密与注册方法研究.doc》由会员分享,可在线阅读,更多相关《共享软件加解密与注册方法研究.doc(7页珍藏版)》请在三一文库上搜索。

1、精品论文共享软件加解密与注册方法研究夏治国 1,2,陈林 21 重庆大学软件学院,重庆 (400044)2 中国人民解放军 78155 部队,四川成都 (610036)E-mail:, 摘要:共享软件的限制和注册既是作者保护版权的方式,也是软件实现价值的途径。本文 就 Visual C+环境下共享软件开发中的限制用户使用、软件加解密、注册方法等关键问题进 行了讨论研究。关键词:磁盘序列号;加密;解密;注册表控制 中图分类号:TP3091引言共享软件并不是一种软件的类型,而是一种传播方式,它是指个人或非公司团队开发的 向用户直接收取注册费或相关服务费的“先试后买”的中、小规模的软件。这种软件通过

2、网络 等各种传播方式,十分方便用户,有利于软件的普及和推广;再加上注册费低,性价比高, 因而深受广大用户欢迎1,2。共享软件在未注册之前通常会有一定的功能限制,如使用的时间限制、次数限制、功能 限制等。用户在向软件作者支付一定的注册费用,成为正式版用户后,可以享受到相应的待 遇,包括:版本升级、技术服务、疑问解答等3。2软件注册模块的整体设计共享软件的注册功能主要包括两个方面的内容:一是软件注册,即利用获取的磁盘序列 号加密生成注册申请号,再用算号器计算注册号,注册成功后生成注册信息,供程序启动时查询;二是软件试用,需要检查注册信息,判断软件是否超过试用限制。实现流程如下图:- 7 -程序启动

3、是否注册Y启 动提示注册NN Y是否限制生成注册信息生成注册文件计算注册号用户注册3软件注册模块的实现3.1 磁盘序列号加密的实现图 1 软件共享实现流程图在 Windows 中,硬盘的磁盘序列号是在硬盘分区后系统产生的 8 字节随机数字,理论上有重复的可能,但实际上找到两个相同的分区序列号很难,因此,在实际应用中可以把硬 盘序列号作为唯一识别码用于我们的加密系统。程序中获取 C 盘序列号的库函数是 GetVolumeInformation ()4,其实现代码如下:BOOL CDRegedit:OnInitDialog() CDialog:OnInitDialog();/取得机器码(C 盘序列

4、号)LPCTSTR lpRootPathName=C:;LPTSTR lpVolumeNameBuffer=new char12; DWORD nVolumnNameSize=12;DWORD MaximumComponentLength; DWORD FileSystemFlags;LPTSTR lpFileSystemNameBuffer=new char10; DWORD FileSystemNameLength=12; GetVolumeInformation(lpRootPathName,lpVolumeNameBuffer,nVolumnNameSize,&m_VolumnSeri

5、alNumber,&MaximumComponentLength,&FileSystemFlags,lpFileSystemNameBuffer,FileSystemNameLength); delete(lpVolumeNameBuffer); delete(lpFileSystemNameBuffer);return TRUE;/ return TRUE unless you set the focus to a control/ EXCEPTION: OCX Property Pages should return FALSE生成注册文件时,用户首先填入用户名,然后点击“生成注册文件”按

6、钮,调用函数CDRegedit: OnButhere( ),为了避免别人轻易看出是磁盘序列号,我们将其与 2402029307412(可以任意指定数)进行异或运算,得到用户机的机器码,其实这就是一个加密的过程;再 把机器码和用户名一起写入注册文件。其代码如下:void CDRegedit:OnButhere()CString sUserName; m_EdtUserName.GetWindowText(sUserName); if(sUserName.IsEmpty()MessageBox(请输入用户名!,系统提示,MB_OK|MB_ICONSTOP);this-m_EdtUserName.S

7、etFocus();CString sSerialNumber;sSerialNumber.Format(%d,m_VolumnSerialNumber2402029307412);CFileDialogdlg(false, 注 册 .RXI, 注 册 .RXI,OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT,注册文件|*.RXI|);dlg.DoModal();CString sFile=dlg.GetPathName();if(sFile.IsEmpty()return;/写入文件CFile file(sFile, CFile:modeCreate | CFil

8、e:modeWrite ); file.WriteHuge(sUserName.GetBuffer(sUserName.GetLength(),sUserName.GetLength(); file.WriteHuge(,1); file.WriteHuge(sSerialNumber.GetBuffer(sSerialNumber.GetLength(),sSerialNumber.GetLength();file.Close();MessageBox( 注册文 件生成完 毕,其路 径为 :+sFile, 系 统提示 ,MB_OK|MB_ICONEXCLAMATION);当然,也可以在注册程

9、序中直接将注册申请号显示给用户,但是考虑到这样一方面需要用户记录,容易出错,另一方面也是为了注册申请号的安全,所以我们采用生成一个包含机 器码和用户名的注册文件,以电子邮件方式发送给作者。注册程序运行界面如下图:图 2 系统注册的界面3.2 打开电子邮件程序发送注册文件为方便用户注册,在注册界面设计了作者电子邮箱的连接,点击 “Email” 按钮就可以 打开电子邮件程序,发送注册申请文件。这个功能 的实现用 到了函 数 ShellExecute( ) ,它解析系 统注册表 HKEY_CLASSES_ROOT 中所有的内容,判断启动那一个执行程序,并且启动一个新的实例 或使用 DDE 将文件名连

10、到一打开的实例。其函数原型5:HINSTANCE ShellExecute( HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd );参数说明:hwnd 窗口的句柄lpOperation 进行的操作,如open、print、explore,或为空(),进行默认操作。lpFile 要操作的文件。lpParameters 如果 lpFile 指定的是一个可执行文件则表示参数。通过调用函数 ShellExecute(NULL, open, mai

11、lto: , NULL, NULL, SW_SHOWNORMAL)来打开电子邮件程序,同时打开一个地址为 的待 编辑新邮件,方便用户发送注册信息。3.3 利用注册文件解密生成注册号注册号是软件作者在确认收到注册费用和注册文件后,通过算号器生成的。计算注册号 的过程其实就是一个解密的过程,其程序界面如下图:图 3 算号器的界面计算注册号时,先输入注册申请文件的路径,再点击“获取”按钮响应 OnButget()函数: 打开用户的注册申请文件,获取机器码和用户名信息,并自动输入到相应的文本框中,如果 路径为空,则默认读取机器码框和用户名框中的内容;将机器码与指定数 2402029307412 进行

12、异或运算,再与用户名编码进行异或运算,最终生成注册序列号,并自动输入序列号框 中。程序流程如下图:获取机器码与指定数进行异或运算注册序列号获取用户名进行异或运算每隔三位增加一个“-”符号图 4 注册号获取流程图3.4 程序注册并生成注册信息程序的 注 册过程 其 实也是 一 个解密 的 过程。 首 先同样 需 要 调 用函数 GetVolumeInformation()获取磁盘序列号与指定数 2402029307412 进行异或运算,然后再与从 文本框中获取的用户名编码进行异或运算,每隔三位增加一个“-”符号,得到正确的注册码, 将其与用户输入的注册码进行比较,如果相同则注册成功,并向文件中写

13、入注册信息以供程 序启动时检查。注册信息包括用户名和注册码,以文件 SYSRX.ini 的形式保存在程序目录下。4程序启动检查模块的实现4.1 检查注册信息,判断是否注册程序在注册完成后,已经将用户名和注册号生成注册信息写入程序安装目录中的SYSRX.ini 文件,在程序每次启动的时候首先检查 SYSRX.ini:实现代码如下:char cPath_MAX_DIR; CString sName,sCode,sPath;:GetSystemDirectory(cPath,sizeof(cPath);sPath.Format(%sSYSRX.ini,cPath);:GetPrivateProfil

14、eString(ENROL,NAME,NULL,sName.GetBuffer(128),128,sPath);:GetPrivateProfileString(ENROL,CODE,NULL,sCode.GetBuffer(128),128,sPath); CString cStrCode,cStrName;cStrCode.Format(%s,sCode);cStrName.Format(%s,sName);如果 cStrCode.IsEmpty()=true | cStrName.IsEmpty()=true 成立,即注册信息存在,则继续验证其合法性,其过程和注册过程一样,通过磁盘序列号

15、和用户名进行解密运算,将结果 与注册信息中的注册号比较,验证其合法性,如果合法则运行程序。如果不存在注册信息或者注册信息不合法,弹出注册对话框要求注册。如果用户选择试 用,则通过查询注册表判断是否限制使用。4.2 使用限制的注册表控制注册表中存放着各种参数,直接控制着 Windows 的启动、硬件驱动程序的装载以及一 些 Windows 应用程序的运行,在整个系统中起着核心作用。因此我们可以利用注册表控制 来实现对共享软件的使用限制功能。Win32 API 提供了大约 25 个有关注册表的函数,实现了注册表进行打开、读取、写入 和删除等功能,利用这些函数还可以实现对注册表备份,连接和对远端注册

16、表进行查看。本 文实例程序中需要用到指定键的打开、写入、查询和修改等功能,其 API 函数原型及说明 如下6,7:、RegCreateKeyEx()原型:LONG RegCreateKeyEx( HKEY hKey, LPCTSTR lpSubKey, DWORD Reserved,LPTSTR lpClass, DWORD dwOptions, REGSAM samDesired, LPSECURITY_ATTRIBUTESlpSecurityAttributes, PHKEY phkResult, LPDWORD lpdwDisposition );说明:打开一个指定的键或子键返回其句柄。

17、如果指定的键不存在则创建。、RegQueryValueEx()原型: LONG RegQueryValueEx(HKEY hKey, LPCTSTR lpValueName, LPDWORDpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData );说明:查询某一个键值,根据要查询的键的句柄,返回查询数据。、RegSetValueEx()原型: LONG RegSetValueEx(HKEY hKey, LPCTSTR lpValueName, LPDWORDlpReserved, DWORD dwType, const BYTE

18、*lpData, DWORD cbData);说明:设置注册表中的一个键值。、RegCloseKey() 原型:RegCloseKey(HKEY hKey) 说明:关闭打开的键,释放句柄。当对一个或多个键或值操作完成以后,需要关闭其键来进行保存操作结果,关闭一个键后,句柄变为非法,此时应释放句柄。 函数中关键参数说明如下:hKey 为主键值;lpSubKey 指向以零结尾的字符串的指针,其中包含将要创建或打开的子键的名称;lpClass 为一个指向包含键类型的字符串,如果该键已经存在,则忽略该参数;dwOptions 为新创建的键设置一定的属性;samDesired 用来设置对键访问的权限;p

19、SecurityAttributes 为一个指向 SECURITY_ATTRIBUTES 结构的指针;phkResult 为一个指向新创建或打开的键的句柄的指针;lpdwDispition 指明键是被创建还是被打开的;lpData 为一个指向包含数据的缓冲区的指针;cbData 以字节为单位,指定数据的长度。 在程序中,首先查询“HKEY_CURRENT_USER Software软件名”下是否存在注册表信息。如果不存在,则写入新信息,并将能使用的次数设置为 99 存入健 TryTime 中;如果存 在,则读取剩下使用次数并提示给用户,同时修改注册表键值,将剩下次数即 TryTime 值减1;

20、如果剩下次数小于 1,则提示用户共享此次数已到,同时弹出注册对话框要求注册软件。 需要注意的是,注册表中键值为 CString 型,在读写的时候需要进行格式转换。5结束语共享软件的限制和注册功能实现之后,作者通过网络等方式来发布自己的产品,就不怕 别人侵害到软件的版权问题。只要软件功能实用强大,界面美观、交互方便,就可能得到源 源不断的回报。然而,对普通用户来说虽然实现了共享的功能,但是仍然存在一些问题需要 改进:加密方式中存在的问题:采用了磁盘序列号和用户名的加密方式,虽然安全性较高,但 由于磁盘序列号是在硬盘分区时系统产生的 8 字节随机数字,如果硬盘重新进行了分区,序 列号会发生改变,系

21、统就会要求重新注册。解决方法:用户提供旧的注册文件和注册信息, 利用算号器验证,如果符合则根据新的注册文件免费提供新的注册号码。使用限制中存在的问题:为了便于理解,本文将使用限制次数直接存储于注册表中,对一般用户来说难于破解,但计算机水平较高的用户可以通过修改键值来破解限制。解决方法: 将使用限制次数按一定规则进行加密后保存,在程序中在进行解密查询,同时进行规则验证, 判断注册表是否被修改以及是否使用受限。参考文献1 百度百科.共享软件EB/OL.http:/ /36775.htm2 林晨.谈谈共享软件N/OL.计算机世界报,1995-1-09.http:/ 朱泉峰.共享软件四大脸谱N/OL.

22、计算机世界报,2006-10-09(C22、C23).http:/4 张桂勇,陈芳琼.API for Windows 2000/XP 详解M.北京:清华大学出版社,2003.5 何志丹.深入浅出Visual C+入门、进阶与应用实例M.北京:人民邮电出版社,2007. 6 姚领田.精通 MFC 程序设计M.北京:人民邮电出版社,2006.7 高守传.张云铭,郑静.Visual C+ 6.0 开发指南M.北京:人民邮电出版社,2007.Research of Encryption, Decryption and Registration Method of SharewareXIA Zhi-gu

23、o1,2, CHEN Lin11 College of Software Engineering, Chongqing University, Chongqing,(400044)2 Unit 78155 of PLA, Chengdu, (610036)AbstractThe restrictions and registration of shareware is on the way of copyright protection, but also the way torealize the value of software. This paper discusses the key

24、 issues in the shareware development under Visual C+ programming environment, such as restrictions on users, software encryption and decryption, the method of registration, etc.Keywords: Disk serial number; encryption; Decryption; Control Registry作者简介:夏治国,男,1977 年生,硕士研究生,主要研究方向是应用软件系统的开发。陈林,男,1954 年生,硕士生导师,主要研究方向是应用软件系统的开发;嵌入式软件 开发;多媒体与智能计算;数据挖掘。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1