我自己做了个软件,有一定的使用价值,不知道怎样利用一机一码的技术稍微保护一下自己的成果,有这方面经验的大哥大姐能否给予指点,有现成的代码就最好了,万分感谢。

解决方案 »

  1.   

    这种方式还是防君子不防小人
    http://www.delphibbs.com/keylife/iblog_show.asp?xid=30356
      

  2.   

    一般就是通过获取CPU或硬盘序列号,生成机器码,再根据机器码生成序列号。这样序列号就实现和硬件关联了。
      

  3.   

    获取CPU序列号的模块Unit CPUID;{***********************************************
    *      这个模块是用来获取CPU序列号,调用方式: *
    * 在上层程序的uses子句中含CPUID模块,用函数   *
    *调用 CPUID.GetCPUVendor 获得CPU的制造商名称; *
    *调用  CPUID.GetCPUInfo       得到CPU的序列号. *
    *************************************************}interfaceuses
    SysUtils;type
    TCPUID = array[1..4] of Longint;
    TVendor = array [0..11] of char; function GetCPUID: TCPUID; assembler; register; 
    function GetCPUVendor: TVendor; assembler; register;
    function GetCPUInfo: string;implementation
    Function GetCPUID: TCPUID; assembler; register; 
    asm
    PUSH    EBX         {Save affected register} 
    PUSH    EDI 
    MOV     EDI,EAX     {@Resukt} 
    MOV     EAX,1 
    DW      $A20F       {CPUID Command}
    STOSD                {CPUID[1]} 
    MOV     EAX,EBX 
    STOSD               {CPUID[2]} 
    MOV     EAX,ECX 
    STOSD               {CPUID[3]}
    MOV     EAX,EDX 
    STOSD               {CPUID[4]} 
    POP     EDI          {Restore registers} 
    POP     EBX 
    end;Function GetCPUVendor: TVendor; assembler; register;
    asm 
    PUSH    EBX          {Save affected register} 
    PUSH    EDI
    MOV     EDI,EAX      {@Result (TVendor)}
    MOV     EAX,0 
    DW      $A20F        {CPUID Command} 
    MOV     EAX,EBX 
    XCHG    EBX,ECX     {save ECX result}
    MOV      ECX,4 
    @1: 
    STOSB 
    SHR     EAX,8 
    LOOP    @1
    MOV     EAX,EDX 
    MOV      ECX,4 
    @2: 
    STOSB 
    SHR     EAX,8
    LOOP    @2 
    MOV     EAX,EBX 
    MOV      ECX,4 
    @3: 
    STOSB
    SHR     EAX,8 
    LOOP    @3 
    POP     EDI          {Restore registers} 
    POP     EBX 
    end;Function GetCPUInfo: string; 
    var 
    CPUID: TCPUID; 
    I: Integer;
    begin
    for I := Low(CPUID) to High(CPUID) do
         CPUID[i]:=-1;
    CPUID := GetCPUID;
    Result :=  IntToHex(CPUID[1], 8) + IntToHex(CPUID[2], 8)
                + IntToHex(CPUID[3], 8) 
                + IntToHex(CPUID[4], 8); 
    end; end. 
      

  4.   

    取Ide硬盘序列号函数function GetIdeDiskSerialNumber : String; 
    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; 
      

  5.   

    还有网卡
    这里有个现成的例子,楼主可以看一下:
    http://download.csdn.net/source/1597156