谁能提供软件注册加密解密,读硬盘唯一序列号的程序代码,就是些共享软件所需要的,给100分

解决方案 »

  1.   

    下面是一个读硬盘序列号的代码
    function GetHdID : String;
    //获取Ide硬盘序列号
    type
      TSrbIoControl = packed record
        HeaderLength : ULONG;
        Signature : Array[0..7] of Char;
        Timeout : ULONG;
        ControlCode : ULONG;
        ReturnCode : ULONG;
        Length : ULONG;
      end;
      SRB_IO_CONTROL = TSrbIoControl;
      PSrbIoControl = ^TSrbIoControl;
      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. Must be zero.
      end;
      IDEREGS = TIDERegs;
      PIDERegs = ^TIDERegs;
      TSendCmdInParams = packed record
        cBufferSize : DWORD;
        irDriveRegs : TIDERegs;
        bDriveNumber : Byte;
        bReserved : Array[0..2] of Byte;
        dwReserved : Array[0..3] of DWORD;
        bBuffer : Array[0..0] of Byte;
      end;
      SENDCMDINPARAMS = TSendCmdInParams;
      PSendCmdInParams = ^TSendCmdInParams;
      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 : ULONG;
        wMultSectorStuff : Word;
        ulTotalAddressableSectors : ULONG;
        wSingleWordDMA : Word;
        wMultiWordDMA : Word;
        bReserved : Array[0..127] of Byte;
      end;
      PIdSector = ^TIdSector;
    const
      IDE_ID_FUNCTION = $EC;
      IDENTIFY_BUFFER_SIZE = 512;
      DFP_RECEIVE_DRIVE_DATA = $0007c088;
      IOCTL_SCSI_MINIPORT = $0004d008;
      IOCTL_SCSI_MINIPORT_IDENTIFY = $001b0501;
      DataSize = sizeof(TSendCmdInParams)-1+IDENTIFY_BUFFER_SIZE;
      BufferSize = SizeOf(SRB_IO_CONTROL)+DataSize;
      W9xBufferSize = IDENTIFY_BUFFER_SIZE+16;
    var 
      hDevice : THandle;
      cbBytesReturned : DWORD;
      pInData : PSendCmdInParams;
      pOutData : Pointer; // PSendCmdOutParams
      Buffer : Array[0..BufferSize-1] of Byte;
      srbControl : TSrbIoControl absolute Buffer;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 := '';
      FillChar(Buffer,BufferSize,#0);
      if Win32Platform=VER_PLATFORM_WIN32_NT then
      begin // Windows NT, Windows 2000
        // Get SCSI port handle
        hDevice := CreateFile( '\\.\Scsi0:',
        GENERIC_READ or GENERIC_WRITE,
        FILE_SHARE_READ or FILE_SHARE_WRITE,
        nil, OPEN_EXISTING, 0, 0 );
        if hDevice=INVALID_HANDLE_VALUE then Exit;
        try
          srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL);
          System.Move('SCSIDISK',srbControl.Signature,8);
          srbControl.Timeout := 2;
          srbControl.Length := DataSize;
          srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY;
          pInData := PSendCmdInParams(PChar(@Buffer)
          +SizeOf(SRB_IO_CONTROL));
          pOutData := pInData;
          with pInData^ do
          begin
            cBufferSize := IDENTIFY_BUFFER_SIZE;
            bDriveNumber := 0;
            with irDriveRegs do
            begin
              bFeaturesReg := 0;
              bSectorCountReg := 1;
              bSectorNumberReg := 1;
              bCylLowReg := 0;
              bCylHighReg := 0;
              bDriveHeadReg := $A0;
              bCommandReg := IDE_ID_FUNCTION;
            end;
          end;
          if not DeviceIoControl( hDevice, IOCTL_SCSI_MINIPORT,
          @Buffer, BufferSize, @Buffer, BufferSize,
          cbBytesReturned, nil ) then Exit;
        finally
          CloseHandle(hDevice);
        end;
      end else
      begin // Windows 95 OSR2, Windows 98
        hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil,
        CREATE_NEW, 0, 0 );
        if hDevice=INVALID_HANDLE_VALUE then Exit;
        try
          pInData := PSendCmdInParams(@Buffer);
          pOutData := @pInData^.bBuffer;
          with pInData^ do
          begin
            cBufferSize := IDENTIFY_BUFFER_SIZE;
            bDriveNumber := 0;
            with irDriveRegs do
            begin
              bFeaturesReg := 0;
              bSectorCountReg := 1;
              bSectorNumberReg := 1;
              bCylLowReg := 0;
              bCylHighReg := 0;
              bDriveHeadReg := $A0;
              bCommandReg := IDE_ID_FUNCTION;
            end;
          end;
          if not DeviceIoControl( hDevice, DFP_RECEIVE_DRIVE_DATA,
          pInData, SizeOf(TSendCmdInParams)-1, pOutData,
          W9xBufferSize, cbBytesReturned, nil ) then Exit;
        finally
          CloseHandle(hDevice);
        end;
      end;
      with PIdSector(PChar(pOutData)+16)^ do
      begin
        ChangeByteOrder(sSerialNumber,SizeOf(sSerialNumber));
        SetString(Result,sSerialNumber,SizeOf(sSerialNumber));
      end;
    end;
      

  2.   

    还有很多软件注册是通过读取网卡Mac地址来的
    function GetMacAddresses(const Machine: string; const Addresses: TStrings): Integer; 
    var 
    NCB: TNCB; 
    Enum: TLanaEnum; 
    I, L, NameLen: Integer; 
    Adapter: ASTAT; 
    MachineName: string; 
    begin 
    Result := -1; 
    Addresses.Clear; 
    MachineName := UpperCase(Machine); 
    if MachineName = '' then 
    MachineName := '*'; 
    NameLen := Length(MachineName); 
    L := NCBNAMSZ - NameLen; 
    if L > 0 then 
    begin 
    SetLength(MachineName, NCBNAMSZ); 
    FillChar(MachineName[NameLen + 1], L, ' '); 
    end; 
    FillChar(NCB, SizeOf(NCB), #0); 
    NCB.ncb_command := NCBENUM; 
    NCB.ncb_buffer := Pointer(@Enum); 
    NCB.ncb_length := SizeOf(Enum); 
    if NetBios(@NCB) = NRC_GOODRET then 
    begin 
    Result := Enum.Length; 
    for I := 0 to Ord(Enum.Length) - 1 do 
    begin 
    FillChar(NCB, SizeOf(NCB), #0); 
    NCB.ncb_command := NCBRESET; 
    NCB.ncb_lana_num := Enum.lana[I]; 
    if NetBios(@NCB) = NRC_GOODRET then 
    begin 
    FillChar(NCB, SizeOf(NCB), #0); 
    NCB.ncb_command := NCBASTAT; 
    NCB.ncb_lana_num := Enum.lana[I]; 
    Move(MachineName[1], NCB.ncb_callname, SizeOf(NCB.ncb_callname)); 
    NCB.ncb_buffer := PChar(@Adapter); 
    NCB.ncb_length := SizeOf(Adapter); 
    if NetBios(@NCB) = NRC_GOODRET then 
    Addresses.Add(AdapterToString(Adapter.adapt)); 
    end; 
    end; 
    end; 
    end; 
    ************************
    //获取网卡地址,使用netbios 3.0调用 uses nb30.pas shipped with delphi 4.0
           function _NetCardAddress : String ;
           var
             NCB : TNCB ;               // Netbios control block
             ADAPTER : TADAPTERSTATUS ; // Netbios adapter status
             LANAENUM : TLANAENUM ;     // Netbios lana
             intIdx : Integer ;         // Temporary work value
             CRC : Char ;               // Netbios return code
             strTemp : String ;         // Temporary string
           begin
             Result := '' ;
             try
               ZeroMemory(@NCB,SizeOf(NCB)) ;     // Zero control blocl
               NCB.ncb_command := Chr(NCBENUM) ;  // Issue enum command
               cRC := NetBios(@NCB) ;
                if Ord(cRC)>0 then begin
                  result:=_NBReturnMSG(crc);
                  exit ;
               end;           NCB.ncb_buffer := @LANAENUM ;      // Reissue enum command
               NCB.ncb_length := SizeOf(LANAENUM);
               cRC := NetBios(@NCB) ;
               if Ord(cRC)>0 then begin
                  result:=_NBReturnMSG(crc);
                  exit ;
               end;
               ZeroMemory(@NCB,SizeOf(NCB)) ;     // Reset adapter
               NCB.ncb_command := Chr(NCBRESET) ;
               NCB.ncb_lana_num := LANAENUM.lana[0] ;
               cRC := NetBios(@NCB) ;
               if Ord(cRC)>0 then begin
                  result:=_NBReturnMSG(crc);
                  exit ;
               end;
               ZeroMemory(@NCB,SizeOf(NCB)) ;   // Get adapter address
               NCB.ncb_command := Chr(NCBASTAT) ;
               NCB.ncb_lana_num := LANAENUM.lana[0] ;
               StrPCopy(NCB.ncb_callname,'*') ;
               NCB.ncb_buffer := @ADAPTER ;
               NCB.ncb_length := SizeOf(ADAPTER) ;
               cRC := NetBios(@NCB) ;
               if Ord(cRC)>0 then begin
                  result:=_NBReturnMSG(crc);
                  exit ;
               end;           // Convert Netcard address it to string
               strTemp := '' ;
               for intIdx := 0 to 5 do strTemp := strTemp + _Char2Hex(ADAPTER.adapter_address[intIdx]) ;
               Result := strTemp ;
             finally
             end ;
           end ;