я как-то делал так (лет много-много назад): брал Windows Product ID:
Код:
function ProductID: string;
begin
Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion',false);
Result := Reg.ReadString('ProductId');
Reg.Free;
end;
HardDisk ID:
Код:
function GetHardID:string;
var
SerialNum: dword;
a, b: dword;
Buffer: array [0..255] of char;
begin
if GetVolumeInformation('c:\', Buffer, SizeOf(Buffer), @SerialNum, a, b, nil, 0) then Result := IntToStr(SerialNum);
end;
BiosInfo:
Код:
function BIOSInfo(OS: string):string;
var
p: pointer;
s: string[255];
begin
if OS='NT' then begin with TRegistry.Create do
try RootKey := HKEY_LOCAL_MACHINE;
if OpenKeyReadOnly('HARDWARE\DESCRIPTION\System') then Result := ReadString('SystemBiosDate')
finally
Free;
end;
end
else try
s[0] := #8;
p := Pointer($0FFFF5);
Move(p^,s[1],8);
Result := copy(s,1,2) + '/' + copy(s,4,2) + '/' +copy (s,7,2);
except Result := 'XX.XX.XXXX';
end;
end;
использовать так
Код:
BiosInfo('NT');
// для Win9x - BiosInfo('');
складывал этот в
string строку и извлекал из этого MD5 Hash. Подделать такое проблематично
Код:
HardwareID := MD5(ProductID + GetHardID + BiosInfo('NT'));
Далее, можно от полученного MD5 "отрезать" половину (или вырезать символы через один) и юзать, подобрать такой hash будет невозможно
P.S. MD5 Unit прилагается во вложении.