
VC++中利用磁盘序列号识别正版软件
发布时间:2006-05-05 19:03:14 来源:天极网 网友评论 0 条
摘要:本文讲述了获取磁盘序列号的方法,并利用所读取的磁盘序列号来作为甄别正版软件的一种手段。
关键字:磁盘序列号、正版软件、识别
一、 引言
作为程序员,不希望看到自己辛辛苦苦编制的软件被盗版,虽然国家为了打击盗版和保护知识产权出台了一系列的相关法律法规,但仍有众多的地下盗版商在利益的驱使下置国法于不顾,对众多的软件进行非法复制、传播,所以身为程序员有必要加强自我保护意识、利用自身在编程方面的优势对自己编写的软件进行保护,防止或尽量减少被盗版的可能性。本文就针对这个问题提出了一种简便易行的对正版软件进行甄别的方法。
二、 设计思路与实现原理
虽然可以用纯软件的方式通过对输入的产品序列号进行判断的方式来验证该软件是否为正版,但由于序列号要由用户手工输入,位数较少的话达不到保护软件的目的,太长又不便用户输入,而且盗版商可以用Soft-ICE等调试跟踪软件查找到需要输入序列号的对话框被调用的地址,通过对该地址的修改,可以很轻松的跳过对产品序列号的验证过程,使之发挥不了作用。相比之下,利用硬件或采用软件兼有硬件的加密方式可以达到较好的保护效果,因为硬件毕竟不象软件那样容易被复制、分析、更改。而且采用这种方式一般不需要用户做什么工作,判别工作都是由软件在后台自动完成的,使用起来比较方便。在此领域做的较好的北京江民公司的KV300系列杀毒软件就是通过对正版杀毒盘人为对载体软盘的某扇区的数据进行更改,使之具有特殊的标记,由于该扇区被人为设置为"坏扇区"所以不会随数据拷贝到其他软盘,而没有该特殊扇区的磁盘是无法正常运行程序的,这种结合硬件来保护软件的方法还是比较可靠的。
虽然利用磁盘扇区对正版软件进行标注的可靠性较高,但实现起来较烦琐。本文采用一种通过对磁盘的序列号进行判别的方式简单而又可靠地保护软件不被非法传播。在微软的操作系统中,对每一个磁盘都在其格式化时设置有一个随机的8字节长的序列号,虽然理论上有重复的可能,但实际上要找到两个相同的磁盘序列号是很困难的,根据概率论的知识可以算出遇到两个相同磁盘序列号的概率为0.00000000023283,即大约5亿多张磁盘中才会遇到相同的序列号,对我们来说这已经足够了 。而且磁盘序列号也不会随着磁盘上的软件内容的拷贝而拷贝,所以我们在此把磁盘序列号作为唯一识别码应用于我们的软件中,可以用API函数GetVolumeInformation来很方便的获取磁盘的序列号,其原型声明如下:
在这里只需通过lpRootPathName来设置我们需要检测的磁盘驱动器号,执行后结果保存在lpVolumeSerialNumber中,其他参数我们不关心,均设为空(NULL)。
关键字:磁盘序列号、正版软件、识别
一、 引言
作为程序员,不希望看到自己辛辛苦苦编制的软件被盗版,虽然国家为了打击盗版和保护知识产权出台了一系列的相关法律法规,但仍有众多的地下盗版商在利益的驱使下置国法于不顾,对众多的软件进行非法复制、传播,所以身为程序员有必要加强自我保护意识、利用自身在编程方面的优势对自己编写的软件进行保护,防止或尽量减少被盗版的可能性。本文就针对这个问题提出了一种简便易行的对正版软件进行甄别的方法。
二、 设计思路与实现原理
虽然可以用纯软件的方式通过对输入的产品序列号进行判断的方式来验证该软件是否为正版,但由于序列号要由用户手工输入,位数较少的话达不到保护软件的目的,太长又不便用户输入,而且盗版商可以用Soft-ICE等调试跟踪软件查找到需要输入序列号的对话框被调用的地址,通过对该地址的修改,可以很轻松的跳过对产品序列号的验证过程,使之发挥不了作用。相比之下,利用硬件或采用软件兼有硬件的加密方式可以达到较好的保护效果,因为硬件毕竟不象软件那样容易被复制、分析、更改。而且采用这种方式一般不需要用户做什么工作,判别工作都是由软件在后台自动完成的,使用起来比较方便。在此领域做的较好的北京江民公司的KV300系列杀毒软件就是通过对正版杀毒盘人为对载体软盘的某扇区的数据进行更改,使之具有特殊的标记,由于该扇区被人为设置为"坏扇区"所以不会随数据拷贝到其他软盘,而没有该特殊扇区的磁盘是无法正常运行程序的,这种结合硬件来保护软件的方法还是比较可靠的。
虽然利用磁盘扇区对正版软件进行标注的可靠性较高,但实现起来较烦琐。本文采用一种通过对磁盘的序列号进行判别的方式简单而又可靠地保护软件不被非法传播。在微软的操作系统中,对每一个磁盘都在其格式化时设置有一个随机的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盘序列号的动态比较来识别是否是正版,如果不能匹配,需要再插入钥匙盘再做一个认证文件。所以整个验证系统只需该套软件在某台计算机上首次运行程序时需要使用一次钥匙盘,或是在认证文件发生损坏后需要使用钥匙盘对其进行恢复,其余时间均由认证文件对正版进行保证。下面的流程图展示了程序对正版的唯一标识符进行验证的全部过程:
全站资源
- 微软官方入门教程19:轻松掌握Vista系统的快
- 微软2008大冲击,预借Vista SP1力促Vista市
- 在收件箱中获得 Windows Vista 的最新更新
- 微软官方Vista入门教程全集19篇(Vista学院
- Windows Vista 的成功将势不可挡
- 快快抛弃Vista,拥抱XP SP3!你觉得呢?
- 浅谈Vista系统关闭虚拟内存与使用内存盘加速
- 嘿嘿,按下键盘上面的三个键,马上让你的Vi
- Windows Vista的盗版率只有Windows XP的一半
- 3DMark和PCMark Vantage新版将只支持Vista系
阅读排行
- Borland 发布C++ Builder 2006 RAD 环境
- C/C++程序员应聘常见面试题深入剖析
- Visual C++常用数据类型转换详解
- C++中的 static 关键字
- 利用VC++实现局域网实时视频传输
- 浅谈C/C++内存泄漏及其检测工具
- 英国投票否决C++/CLI 微软强攻ISO标准受挫
- VC++下用MSComm控件实现串口通讯
- 伪随机数生成及在VC++中的实现
- VC++编程实现对波形数据的频谱分析
最新技术文档
- C++中用赋值形式op=取代单独形式op
- C++启蒙之用C++制作程序
- C++启蒙之C++中的类
- 解析C++/CLI之头文件、内联函数与数组
- C++启蒙之控制结构
- C++启蒙之注释符号
- 了解C++异常处理的系统开支
- C++语言学习之从结构到类
- C++中理解“传递参数”和异常之间的差异
- C++中禁止异常信息传递到析构函数外
专题教程
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册
- Picasa中文版_Picasa教程 专题:清除流氓软件
- Firefox专题 seo搜索引擎优化专区
- 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏
