function Check(data,key:
string):
string;
var
total,i:int64;
licensekey,uname,oldversion,idex,iidex,validserial,validkey:
string;
LanguageID:LangID;
Len,serial:Integer;
SystemInfo:TsystemInfo;
Buffer:
array[0..255]
of Char;
Size: DWord;
version:tidhttp;
begin
// Diskspace bestimmen
GetDiskFreeSpaceEx('
C:\', i, total,
nil);
// System Sprache ermitteln
SetLength(licensekey, 255);
LanguageID:=GetSystemDefaultLangID;
Len:=VerLanguageName(LanguageID,PChar(licensekey), Length(licensekey));
SetLength(licensekey, Len);
// Prozessoren Anzahl
GetSystemInfo(SystemInfo);
serial := SystemInfo.dwNumberOfProcessors;
// Benutzernamen ermitteln
Size := SizeOf(Buffer);
if not Windows.GetUserName(Buffer, Size)
then
RaiseLastOSError;
//RaiseLastWin32Error; {Bis D5};
SetString(uname, Buffer, Size - 1);
// Verschlüssle die Daten zu einem kompakten paket um diese mit dem empfangenen
// paket vergleichen zu können oder um das lizenz file zu verifizieren.
// Debuging
//showmessage('Language: '+licensekey);
//showmessage('Processors: '+inttostr(serial));
//showmessage('Username: '+uname);
//showmessage(#98#1#41#1#54#1#75#1#74);
with TCipher_Rijndael.Create
do
try
Mode := cmOFB8;
Init(THash_MD5.CalcBinary(#98+key+'
SERIAL',TFormat_HEXL), #0, $00);
// Aufwändiges MD5 Passwort zum verschleiern
result := EncodeBinary((#41+inttostr(serial)+#75+'
A'+uname+#74+'
AA-W71A2-EW653'+licensekey+'
Serial:'+uname+'
63E-6E54-DX325'+key),TFormat_HEXL);
// Aufwändige "Paket" erzeugung um das patchen zu erschweeren.
finally
Free;
end;
version := tidhttp.Create();
//version.ProxyParams.ProxyPort := 8080; Proxy für Volle (DP)
//version.ProxyParams.ProxyServer := '10.2.1.43';
// Leerzeichen aus dem String entfernen
idex := (('
http://darkhedie.bplaced.net/crypt/index_crackme.php?dfgr='+licensekey+'
&&cxvb='+inttostr(serial)+'
&&ertd='+uname+'
&&wfpf='+key));
repeat
if pos('
', idex) > 0
then
delete(idex, pos('
', idex), 1);
until pos('
', idex) = 0;
oldversion := version.Get(idex);
// Das "Paket" wird empfangen
version.Free;
// Freigeben
with TCipher_Rijndael.Create
do
try
Mode := cmOFB8;
Init(THash_MD5.CalcBinary(#98+key+'
SERIAL',TFormat_HEXL), #0, $00);
// MD5 Hash des Keys aus dem Empfangenen "Paket" kopieren
idex := copy(oldversion,1,32);
// MD5 Key Hash aus dem "Paket" entfernen
delete(oldversion,1,32);
// Empfangenes "Paket" ohne MD5 entschlusseln
iidex := DecodeBinary(oldversion,TFormat_HEXL);
validkey := copy(iidex,1,1);
validserial := copy(iidex,3,1);
if (validkey+#41+validserial) <> '
))K'
then begin
showmessage('
Server cant Authenticate');
Form1.close;
end;
// Prüfen ob MD5 des keys nicht!! übereinstimmt....
if idex = THash_MD5.CalcBinary(#98+key+'
license',TFormat_HEXL)
then begin
validkey := key;
validserial := '
W12A-QW87-W21QW5+key';
exit;
end
else begin // Der Key hat nicht übereingestummen also kann er noch korrekt sein :)
// Ist der Kontroll MD5 nicht korrekt wird eine meldung ausgegeben
if idex <> THash_MD5.CalcBinary('
y'+key+'
SERIAL',TFormat_HEXL)
then begin
showmessage('
Server cant Authenticate');
Form1.close;
end;
// Echte Überprüfung... idex beinhaltet den zuvor kopierten originalen HASH
// zudem wird er erneut erzeugt und verglichen!
if idex = THash_MD5.CalcBinary('
y'+key+'
SERIAL',TFormat_HEXL)
then begin
// weitere irreführende abfrage... sie sollte eigentlich IMMER!!! true zurück liefern da idex MD5 ist!
if idex <> key
then begin
// Leerzeichen aus dem String entfernen
idex := ((#41+inttostr(serial)+#75+'
A'+uname+#74+'
AA-W71A2-EW653'+licensekey+'
Serial:'+uname+'
63E-6E54-DX325'+key));
repeat
if pos('
', idex) > 0
then
delete(idex, pos('
', idex), 1);
until pos('
', idex) = 0;
// Die beiden entschlüsselten Daten werden verglichen! (keine MD5 hash's in den Variablen!)
if iidex = idex
then begin
// Irreführende Abfrage!
if key = idex
then begin
validkey := key;
validserial := '
W12A-QW87-W21QW5+key';
exit;
end
else // Ist key nicht entsprechend den entschlüsselten daten, so ist alles ok!
showmessage('
Message from Server');
end;
end;
end;
end;
finally
Free;
end;
end;