龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

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

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
摘要:本文讲述了获取磁盘序列号的方法,并利用所读取的磁盘序列号来作为甄别正版软件的一种手段。 要害字:磁盘序列号、正版软件、识别 一、 引言 我们必须在程序开始执行时马

摘要:本文讲述了获取磁盘序列号的方法,并利用所读取的磁盘序列号来作为甄别正版软件的一种手段。

  

  要害字:磁盘序列号、正版软件、识别

  

  一、 引言

  

  

  我们必须在程序开始执行时马上进行检测工作,验证为正版的才可以继续执行,否则就终止程序的运行使盗版无法使用,从而达到保护正版软件的目的。我们答应将同一份正版软件安装到有限的多台计算机中,将识别用的唯一标识符用软盘的磁盘序列号来表示,这张软盘就作为该套软件的钥匙盘,首先检测在硬盘中是否有认证文件,假如没有就把钥匙盘插入到软驱,在验证序列号正确的前提下把C盘的序列号保存到认证文件中,下次运行程序就会检测到认证文件,通过对认证文件内容和C盘序列号的动态比较来识别是否是正版,假如不能匹配,需要再插入钥匙盘再做一个认证文件。所以整个验证系统只需该套软件在某台计算机上首次运行程序时需要使用一次钥匙盘,或是在认证文件发生损坏后需要使用钥匙盘对其进行恢复,其余时间均由认证文件对正版进行保证。下面的流程图展示了程序对正版的唯一标识符进行验证的全部过程: 更多内容请看常用软件加密宝典 软件插件 杀毒软件专栏专题,或

  

    三、 程序的具体实现

  

  在程序正式编写之前,需要预先获取到作为钥匙盘的软盘的磁盘序列号,使之作为我们判定软件是否为正版的依据。可用前面提到的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;

  }

  四、 小结

  

  本文介绍的只是此类软件中的一种实现方法,在理解本文编程思想的基础下也可以采用其他类似的方法对软件进行保护,比如也可以用网卡的标识号作为认证的标识等等。而且也可以用类似的方式发布共享软件,以用户反馈回的硬件参数作为输入来产生注册码等等。总之,具体如何应用仍要根据实际的需求而灵活的作出决定。本程序在windows 2000 Professional下,由Microsoft Visual C++ 6.0编译调试通过。 更多内容请看常用软件加密宝典 软件插件 杀毒软件专栏专题,或

  

精彩图集

赞助商链接