Einzelnen Beitrag anzeigen

hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#18

Re: Etwas zum spielen :) Ein CrackME....

  Alt 17. Okt 2008, 11:00
@Sherlock

Ja du hast schon recht
Ich verwende AES in meiner Verschlüsselung (rijndael 128)

Ich war mir nicht sicher wie sicher mein Source ist und deshalb hab ich gedacht ich mach da mal ein crackme draus...

Aber für alle welche es interessiert:

Hier der Code:

Delphi-Quellcode:
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) <> '))Kthen 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;
Ich denke er ist ausreichend Kommentiert....

Einige Stellen sind ausschliesich da um es dem Cracker zu erschweeren...


Also dann kann die Diskusion und das beheben von Lücken ja beginnen
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat