VC++中利用磁盘序列号识别正版软件

来源 :电脑知识与技术 | 被引量 : 0次 | 上传用户:out000
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:本文讲述了获取磁盘序列号的方法,并利用所读取的磁盘序列号来作为甄别正版软件的一种手段。
  关键词:磁盘序列号;正版软件;识别
  中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)15-30751-01
  Make Use of the Sequence of Disk to Distinguish the Genuine Software
  GONG Ming-feng
  (Wuhu Tianyu Science Co. Ltd, Wuhu 241000, China)
  Abstract:This paper describe the using VC++ to gain the sequence of disk, and how to make use of the disk's serial number to distinguish the genuine software.
  Key words:Sequence of disk;Genuine software;Distinguish
  
  1 引言
  
  作为程序员,不希望看到自己辛辛苦苦编制的软件被盗版,虽然国家为了打击盗版和保护知识产权出台了一系列的相关法律法规,但仍有众多的地下盗版商在利益的驱使下置国法于不顾,对众多的软件进行非法复制、传播,所以身为程序员有必要加强自我保护意识、利用自身在编程方面的优势对自己编写的软件进行保护,防止或尽量减少被盗版的可能性。本文就针对这个问题提出了一种简便易行的对正版软件进行甄别的方法。
  
  2 设计思路与实现原理
  
  虽然可以用纯软件的方式通过对输入的产品序列号进行判断的方式来验证该软件是否为正版,但由于序列号要由用户手工输入,位数较少的话达不到保护软件的目的,太长又不便用户输入,而且盗版商可以用Soft-ICE等调试跟踪软件查找到需要输入序列号的对话框被调用的地址,通过对该地址的修改,可以很轻松的跳过对产品序列号的验证过程,使之发挥不了作用。相比之下,利用硬件或采用软件兼有硬件的加密方式可以达到较好的保护效果,因为硬件毕竟不象软件那样容易被复制、分析、更改。而且采用这种方式一般不需要用户做什么工作,判别工作都是由软件在后台自动完成的,使用起来比较方便。平常最常见就是软件狗,软件狗是一种智能型加密工具,也称为加密锁。它是一个安装在并行口、串行口等接口上的硬件电路,同时有一套适用于各种语言的接口软件和工具软件。当被狗保护的软件运行时,程序向插在计算机上的软件狗发出查询命令,软件狗迅速计算查询并给出响应,正确的响应保证软件继续运行。如果没有软件狗,程序将不能运行。
  虽然利用软件狗对正版软件进行标注的可靠性较高,但实现起来较烦琐。本文采用一种通过对磁盘的序列号进行判别的方式简单而又可靠地保护软件不被非法传播。在微软的操作系统中,对每一个磁盘都在其格式化时设置有一个随机的8字节长的序列号,虽然理论上有重复的可能,但实际上要找到两个相同的磁盘序列号是很困难的,根据概率论的知识可以算出遇到两个相同磁盘序列号的概率为0.00000000023283,即大约5亿多张磁盘中才会遇到相同的序列号,对我们来说这已经足够了 。而且磁盘序列号也不会随着磁盘上的软件内容的拷贝而拷贝,所以我们在此把磁盘序列号作为唯一识别码应用于我们的软件中,可以用API函数GetVolumeInformation来很方便的获取磁盘的序列号,其原型声明如下:
  BOOL GetVolumeInformation(
  LPCTSTR lpRootPathName,
  LPTSTR lpVolumeNameBuffer,
  DWORD nVolumeNameSize,
  LPDWORD lpVolumeSerialNumber,
  LPDWORD lpMaximumComponentLength,
  LPDWORD lpFileSystemFlags,
  LPTSTR lpFileSystemNameBuffer,
  DWORD nFileSystemNameSize);
  在这里只需通过lpRootPathName来设置我们需要检测的磁盘驱动器号,执行后结果保存在lpVolumeSerialNumber中,其他参数我们不关心,均设为空(NULL)。
  我们必须在程序开始执行时马上进行检测工作,验证为正版的才可以继续执行,否则就终止程序的运行使盗版无法使用,从而达到保护正版软件的目的。我们允许将同一份正版软件安装到有限的多台计算机中,将识别用的唯一标识符用软盘的磁盘序列号来表示,这张软盘就作为该套软件的钥匙盘,首先检测在硬盘中是否有认证文件,如果没有就把钥匙盘插入到软驱,在验证序列号正确的前提下把C盘的序列号保存到认证文件中,下次运行程序就会检测到认证文件,通过对认证文件内容和C盘序列号的动态比较来识别是否是正版,如果不能匹配,需要再插入钥匙盘再做一个认证文件。所以整个验证系统只需该套软件在某台计算机上首次运行程序时需要使用一次钥匙盘,或是在认证文件发生损坏后需要使用钥匙盘对其进行恢复,其余时间均由认证文件对正版进行保证。下面的流程图展示了程序对正版的唯一标识符进行验证的全部过程:
  
  3 程序的具体实现
  
  在程序正式编写之前,需要预先获取到作为钥匙盘的软盘的磁盘序列号,使之作为我们判断软件是否为正版的依据。可用前面提到的API函数GetVolumeInformation()来实现:
  DWORD dwSerialNum;
  GetVolumeInformation("A:\\",NULL,NULL,&dwSerialNum,NULL,NULL,NULL,NULL);
  双字型变量dwSerialNum内保存有钥匙盘的序列号。并把该值在正式程序中用#define宏定义为一个常量,作为正版的标识。由于需要在程序正式运行前对程序的正版与否进行识别所以需要在程序的入口函数,应用程序类的InitInstance()函数中对其进行编程,并且应该在识别完毕之前用m_pMainWnd->ShowWindow(SW_HIDE);函数隐藏程序主界面,直至判定为正版之后方可改变其参数为"SW_SHOW"将主界面正常显示。下面是对认证文件进行判别的主要代码:
  ……
  if(file.Open("Logo.ini",CFile::modeReadWrite)==FALSE)
  { AfxMessageBox("请将正版钥匙盘插入到软驱!");
  MakeKey(); }
  else
  { file.Read(logo,20);
  file.Close();
  DWORD LogoNum=atol(logo);
   GetVolumeInformation("C:\\",NULL,NULL,&dwIDESerial,NULL,NULL,NULL,NULL);
  if(LogoNum!=dwIDESerial)
  { AfxMessageBox("请将正版钥匙盘插入到软驱!");
  MakeKey(); }
  else
  m_bCanRun=true; }
  ……
  if(m_bCanRun==true)
  { m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
  m_pMainWnd->UpdateWindow(); }
  else
  PostQuitMessage(0);
  根据设计的流程图,当没有发现认证文件(首次运行程序)时或是认证文件内容与C盘的序列号不匹配(认证文件出错)时就要利用钥匙盘创建/恢复认证文件,下面是实现该功能的MakeKey函数的部分关键代码:
  ……
  GetVolumeInformation("A:\\",NULL,NULL,&dwSerialNum,NULL,NULL,NULL,NULL);
  if(dwSerialNum==SerialNum)//SerialNum就是我们预先获取的作为正版标识的序列号
  { GetVolumeInformation("C:\\",NULL,NULL,&dwIDESerial,NULL,NULL,NULL,NULL);
  ltoa(dwIDESerial,logo,10);
  while(logo[i]!=’\0’)
  i++;
  ……
  file.Open("Logo.ini",CFile::modeCreate | CFile::modeReadWrite);
  file.Write(logo,i);
  file.Close();
  AfxMessageBox("已通过认证,下次使用时不必再插入钥匙软盘!");
  m_bCanRun=true; }
  else
  { AfxMessageBox("请插入正版钥匙软盘再执行本程序!");
  m_bCanRun=false; }
  
  4 小结
  
  本文介绍的只是此类软件中的一种实现方法,在理解本文编程思想的基础下也可以采用其他类似的方法对软件进行保护,比如也可以用网卡的标识号作为认证的标识等等。而且也可以用类似的方式发布共享软件,以用户反馈回的硬件参数作为输入来产生注册码等等。总之,具体如何应用仍要根据实际的需求而灵活的作出决定。本程序在Windows 2000 Professional下,由Microsoft Visual C++ 6.0编译调试通过。
  
  参考文献:
  [1]Charles Petzold. Programming Windows. Microsoft Press, 1998.
  [2]John Robbins. Debugging Applications. Microsoft Press, 1999.
  [3]罗云彬. Windows 环境下32位汇编语言程序设计[M]. 北京:电子工业出版社, 2002.
  [4]尤晋元, 史美林, 等. Windows 操作系统原理[M]. 北京:机械工业出版社, 2001.
  [5]彭礼孝. 驱动程序开发起步与进阶[M]. 北京: 人民邮电出版社, 2000.
  注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
其他文献
摘要:通常在一个网站中会有几十个甚至几百个风格相似的页面,如果每次都重新设定网页结构以及相同栏目下的导航条、各类图标就显得非常麻烦,不过我们可以利用网页模板功能来简化操作。其实,模板的功能就是把网页布局和网页内容分离,在布局设计好之后将其存储为模板,这样相同布局的页面可以通过模板创建,因此能够极大提高工作效率。在网页的后期维护中,网页模板也发挥着同样巨大的作用,让网页更新变得不再困难。  关键词:
期刊
摘要:首先分析了现有的图书联机编目系统的局限性,进而根据现有的网络技术,提出一种基于 Web Service 的图书联机编目改进方案,并给出了具体的功能模块。  关键词:联机编目;Web Service;Z39.50  中图分类号:TP393文献标识码:A文章编号:1009-3044(2007)15-30674-02  A Study on Union Catalogue Based on Web
期刊
摘要:MapObjects是一种功能强大的GIS开发组件,但它并未提供一个专用的地质、矿产地图形符号库。利用Visual Basic 6.0 和MapObjects以及数据库软件Access设计了基于TrueType字体可扩展的矿产地符号库,通过MapObjects的渲染功能,实现矿产地符号与TrueType代码索引之间关联,通过符号的组合,颜色的改变,可进行矿产地符号的快速、无限的扩充。  关键
期刊
摘要:基于Vrml技术完成了三维虚拟校园的设计和实现,对建模、交互控制及优化技术进行了详细的介绍和分析,为研究和探索Vrml技术在虚拟建筑展示领域的应用提供了有益的思路。  关键词:虚拟校园;Vrml;建模;交互控制;优化  中图分类号:TP393文献标识码:A文章编号:1009-3044(2007)15-30671-02  Research and Implementation of Virtu
期刊
摘要:随着计算机技术和网络技术的飞速发展,校园网大力建设和不断完善。为了满足对高校教师信息管理的需要,建设一个使用方便而且高效的B/S模式教师信息管理系统十分迫切。在系统中基于三层结构模型的ASP应用程序提高了系统的可重用性和可扩展性,同时运用子查询的方法,提高了数据库查询效率。  关键词:教师信息管理; ASP;模型;子查询  中图分类号:TP315文献标识码:A文章编号:1009-3044(2
期刊
摘要:本文介绍了在Access环境下通过ODBC数据源实现SQL Server数据库中数据表的链接,然后利用Access的功能组件完成车辆销售系统的设计,并通过网络实现对SQL Server 数据库的管理和维护。  关键词:Access;SQL Server;ODBC;车辆销售  中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)15-30636-02  The Desi
期刊
摘要:随着互联网的普及,越来越多的公司、企业拥有了自己的网络,如何使用NAT技术让自己的局域网能够安全的访问互联网,这是很多人都关心的问题。本文对NAT技术作一个较为全面的介绍,以便于用户更好的理解和使用NAT。  关键词:NAT;地址映射;局域网  中图分类号:TP393文献标识码:A文章编号:1009-3044(2007)15-30660-01  Application of NAT in L
期刊
摘要:本文首先建立了一个小规模低成本的基于Windows平台的IPv6实验室,详细介绍了搭建实验室的方法和步骤,解决了IPv6网络的实验开发运行的环境问题,最后对IPv6网络连通性和静态路由进行了测试与分析,验证IPv6网络的一些特点。  关键词:IPv6;过渡;连通性;静态路由  中图分类号:TP393 文献标识码:A文章编号:1009-3044(2007)15-30699-03  Test o
期刊
摘要:DCS系统事故分析方式主要有六种,通过这些方式大大提高了事故分析的科学性,保证了系统更加安全高效的运行。  关键词:DCS系统;事故分析方式  中图分类号:TP29文献标识码:A文章编号:1009-3044(2007)15-30762-02  On the Role of DCS in Accident Analys  LI Ri-gang  (Qianan SembCorp Cogener
期刊
摘要:作者针对实际应用AutoCAD软件绘图中,图形数据量大,用户绘图速度慢的问题,在文中提出了一些实践操作技巧,可以帮助用户有效地提高绘制复杂图形的速度。  关键词:AutoCAD;绘图速度;技巧  中图分类号:TP319文献标识码:A文章编号:1009-3044(2007)15-30757-01  The Talk Improves AutoCAD Several of the Speed D
期刊