怎么利用硬盘序列号对软件加密?50‘请详细告之,再线等待!!!!!!!

解决方案 »

  1.   

    刚查到,希望能对你有帮助。function GetHDSerialNumber(Drv : String): String; 
       var 
         VolumeSerialNumber : DWORD; 
         MaximumComponentLength : DWORD; 
         FileSystemFlags : DWORD; 
       begin 
         if Drv[Length(Drv)] =':' then Drv := Drv + '\'; 
         GetVolumeInformation(pChar(Drv), 
                              nil, 
                              0, 
                              @VolumeSerialNumber, 
                              MaximumComponentLength, 
                              FileSystemFlags,                         VolumeSerialNumber : DWORD; 
         MaximumComponentLength : DWORD; 
         FileSystemFlags : DWORD; 
       begin 
         if Drv[Length(Drv)] =':' then Drv := Drv + '\'; 
         GetVolumeInformation(pChar(Drv), 
                              nil, 
                              0, 
                              @VolumeSerialNumber, 
                              MaximumComponentLength, 
                              nil,SystemFlags, 
                              0); 
         Result := IntToHex(HiWord(VolumeSerialNumber), 4) + 
                   '-' + 
                   IntToHex(LoWord(VolumeSerialNumber), 4); 
       end;
      

  2.   

    又查到一个:
    function GetHardDiskKey:string;
    var
    pdw : pDWord;
    mc, fl : dword;
    begin
    New(pdw);
    GetVolumeInformation(pchar('C:\'),nil,0,pdw,mc,fl,nil,0);
    result := inttostr(pdw^);
    dispose(pdw);
    end;
      

  3.   

    这是我用DELPHI写的根据硬盘序列号生成注册码,封装成一个动态库。
    library GetHDSn;{ Important note about DLL memory management: ShareMem must be the
      first unit in your library's USES clause AND your project's (select
      Project-View Source) USES clause if your DLL exports any procedures or
      functions that pass strings as parameters or function results. This
      applies to all strings passed to and from your DLL--even those that
      are nested in records and classes. ShareMem is the interface unit to
      the BORLNDMM.DLL shared memory manager, which must be deployed along
      with your DLL. To avoid using BORLNDMM.DLL, pass string information
      using PChar or ShortString parameters. }uses
      SysUtils,
      windows,
      forms,
      Classes; var
       buffer:Pointer ;
    {$R *.res}{procedure MydllProc(reason:integer);
    begin
            if reason=DLL_PROCESS_DETACH then
              FreeMem(buffer,1024);
    end; }
    function ptom(const s:string;key:word):string;var
     fc1:longint;
     fc2:longint;
    i:byte;begin
      fc1:=24;
      fc2:=16;//result[0]:=s[0];setlength(result,length(s));for i:=1 to length(s) dobegin
            if (ord(s[i])>=48) and (ord(s[i])<=57)  then
                    Result[i]:=chr(ord(s[i])+i+20)
            else if (ord(s[i])>=65) and (ord(s[i])<=71)  then
                    Result[i]:=chr(ord(s[i])+i*2+3)
            else if (ord(s[i])>=72) and (ord(s[i])<=82)  then
                    Result[i]:=chr(ord(s[i])+i)
            else if (ord(s[i])>=83) and (ord(s[i])<=90)  then
                    Result[i]:=chr(ord(s[i])-i-10)  ;
    end;
    end;
    function GetIdeSerialNumber() : PChar; stdcall;
    const
      IDENTIFY_BUFFER_SIZE = 512;
    type
      TIDERegs = packed record
         bFeaturesReg: BYTE; // Used for specifying SMART "commands".
         bSectorCountReg: BYTE; // IDE sector count register
         bSectorNumberReg: BYTE; // IDE sector number register
         bCylLowReg: BYTE; // IDE low order cylinder value
         bCylHighReg: BYTE; // IDE high order cylinder value
         bDriveHeadReg: BYTE; // IDE drive/head register
         bCommandReg: BYTE; // Actual IDE command.
         bReserved: BYTE; // reserved for future use. Must be zero.
      end;  TSendCmdInParams = packed record
        // Buffer size in bytes
        cBufferSize: longword;
        // Structure with drive register values.
        irDriveRegs: TIDERegs;
        // Physical drive number to send command to (0,1,2,3).
        bDriveNumber: BYTE;
        bReserved: array[0..2] of Byte;
        dwReserved: array[0..3] of longword;
        bBuffer: array[0..0] of Byte; // Input buffer.
      end;  TIdSector = packed record
        wGenConfig: Word;
        wNumCyls: Word;
        wReserved: Word;
        wNumHeads: Word;
        wBytesPerTrack: Word;
        wBytesPerSector: Word;
        wSectorsPerTrack: Word;
        wVendorUnique: array[0..2] of Word;
        sSerialNumber: array[0..19] of CHAR;
        wBufferType: Word;
        wBufferSize: Word;
        wECCSize: Word;
        sFirmwareRev: array[0..7] of Char;
        sModelNumber: array[0..39] of Char;
        wMoreVendorUnique: Word;
        wDoubleWordIO: Word;
        wCapabilities: Word;
        wReserved1: Word;
        wPIOTiming: Word;
        wDMATiming: Word;
        wBS: Word;
        wNumCurrentCyls: Word;
        wNumCurrentHeads: Word;
        wNumCurrentSectorsPerTrack: Word;
        ulCurrentSectorCapacity: longword;
        wMultSectorStuff: Word;
        ulTotalAddressableSectors: longword;
        wSingleWordDMA: Word;
        wMultiWordDMA: Word;
        bReserved: array[0..127] of BYTE;
      end;  PIdSector = ^TIdSector;  TDriverStatus = packed record
        // 驱动器返回的错误代码,无错则返回0
        bDriverError: Byte;
        // IDE出错寄存器的内容,只有当bDriverError 为 SMART_IDE_ERROR 时有效
        bIDEStatus: Byte;
        bReserved: array[0..1] of Byte;
        dwReserved: array[0..1] of longword;
      end;  TSendCmdOutParams = packed record
        // bBuffer的大小
        cBufferSize: longword;
        // 驱动器状态
        DriverStatus: TDriverStatus;
        // 用于保存从驱动器读出的数据的缓冲区,实际长度由cBufferSize决定
        bBuffer: array[0..0] of BYTE;
      end;
    var
      hDevice : THandle;
      cbBytesReturned : longword;
      SCIP : TSendCmdInParams;
      aIdOutCmd : array[0..(SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE - 1) - 1] of Byte;
      IdOutCmd : TSendCmdOutParams absolute aIdOutCmd;  procedure ChangeByteOrder(var Data; Size: Integer);
      var
        ptr : PChar;
        i : Integer;
        c : Char;
      begin
        ptr := @Data;    for I := 0 to (Size shr 1) - 1 do
        begin
          c := ptr^;
          ptr^ := (ptr + 1)^;
          (ptr + 1)^ := c;
          Inc(ptr, 2);
        end;
      end;
    begin
      Result := ''; // 如果出错则返回空串  if SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then  // Windows NT, Windows 2000
      begin
        // 提示! 改变名称可适用于其它驱动器,如第二个驱动器: '\\.\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;
    end;exports
      GetIdeSerialNumber,
      ptom;begin
    {DLLProc:=@MydllProc;
    Getmem(buffer,1024);  }
    end.