为了维护我们软件的人员的权益,目前,我们软件人员在保护小软件用的最多的办法是机器码,由CPU、硬盘、BIOS等序列号组成,网上发布很多类似的源码,但是,经我一段时间测试,有以下问题:
1、硬盘序列号在98下不稳定,序列号会变,比如网上出现频率较高,由于字数有限,我不全贴了:
......
 begin
    Result := ''; // 如果出错则返回空串
    if SysUtils.Win32Platform=VER_PLATFORM_WIN32_NT then begin// Windows NT, Windows 2000
        // 提示! 改变名称可适用于其它驱动器,如第二个驱动器: '\\.\PhysicalDrive1\'
        hDevice := CreateFile( '\\.\PhysicalDrive0', GENERIC_READ or GENERIC_WRITE,
          FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 );
    end else // Version Windows 95 OSR2, Windows 98
      hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0 );
      if hDevice=INVALID_HANDLE_VALUE then Exit;
     try
      FillChar(SCIP,SizeOf(TSendCmdInParams)-1,#0);
      FillChar(aIdOutCmd,SizeOf(aIdOutCmd),#0);
      cbBytesReturned := 0;
      // Set up data structures for IDENTIFY command.
      with SCIP do begin
        cBufferSize  := IDENTIFY_BUFFER_SIZE;
  //      bDriveNumber := 0;
        with irDriveRegs do begin
          bSectorCountReg  := 1;
          bSectorNumberReg := 1;
  //      if Win32Platform=VER_PLATFORM_WIN32_NT then bDriveHeadReg := $A0
  //      else bDriveHeadReg := $A0 or ((bDriveNum and 1) shl 4);
          bDriveHeadReg    := $A0;
          bCommandReg      := $EC;
        end;
      end;
      if not DeviceIoControl( hDevice, $0007c088, @SCIP, SizeOf(TSendCmdInParams)-1,
        @aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil ) then Exit;
    finally
      CloseHandle(hDevice);
    end;
    with PIdSector(@IdOutCmd.bBuffer)^ do begin
      ChangeByteOrder( sSerialNumber, SizeOf(sSerialNumber) );
      (PChar(@sSerialNumber)+SizeOf(sSerialNumber))^ := #0;
      Result := PChar(@sSerialNumber);
    end;2、同一机子98下与2000下硬盘或CPU序列号不同,有没有办法统一?谢谢各位提供帮助!

解决方案 »

  1.   

    汇编代码取得cpu信息,应该是不受操作系统影响的。超级猛料里有篇文章是说这个的,代码记不请了
      

  2.   

    好象现在的mac地址是可以改的了,不太保险
      

  3.   

    to bluekitty(一只Colorful猪):
    谢谢您的回答,光是CPU序列号,重复比例很高,我们一般再并上硬盘序列号,但是硬盘序列号一、在98下不稳定,会变;二、同一机子,98或2000下不同。请继续指教,谢谢!
      

  4.   

    倒,楼住,汇编代码能取得cpu信息当然也能取得硬盘信息,我是在超级猛料2003版里面看的,楼住手头有的话现在就可以看一下,我在网吧,没法看
      

  5.   

    2000下获取硬盘系列号还必须在不是管理员的权限下能取出来,你贴出来的代码只有在管理员权限下可以获取。http://www.bitencrypt.com/source.htm
    你测试下看他们的在98下能否正确取出来。
      

  6.   


    to xixuemao():的确方法很多,但是类似很多,大多我测试过,98下不稳定。
      

  7.   

    to ksaiy(阳光总在风雨后):上面帖出来的代码不用管理员权限可以取得,而且与他们取出来的一模一样,但他们在98下稳定不稳定,我现在不能说,因为没有经过一定数量、一定时间的测试。
      

  8.   

    一般取硬盘的序列号是访问C:\盘,我的经验是当C:盘的分区格式发生变化,或者Format重装不同操作系统时一般都会发生变化,我们公司之前的软件就是通过硬盘序列号来生成机器码的,客户重装系统后软件总是要求重新注册,后来我们改进了,通过与MAC地址相结合,这样就比较安全!
      

  9.   

    to qinghuaV(白云):硬盘序列号在98下不重装操作系统也会发生变化。MAC地址,我们所跑的客户中有30%没有网卡。