Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Etwas zum spielen :) Ein CrackME.... (https://www.delphipraxis.net/122507-etwas-zum-spielen-ein-crackme.html)

hedie 17. Okt 2008 09:45


Etwas zum spielen :) Ein CrackME....
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo

Ich habe gestern abend ein paar stunden an meinem neuen Lizenzierungs verfahren gearbeitet....

Um es auf seine Sicherheit hin zu prüfen, habe ich daraus ein kleines aber feines CrackME gebastelt....


Ich selber würde das Level eher schwierig einstufen aber vieleicht ist es auch ganz leicht zu knacken....



Das CrackME verbindet zu einer PHP datei auf einem Freehost anbieter. Dieser Server muss einen bestimmten string zurückliefern
damit das CrackME geknackt werden kann.

Mich würde es interessieren, ob es jemand schafft, das CrackMe zu Patchen oder ähnlich so dass immer die gewollte meldung kommt

Welche meldung das ist, verrat ich nocht nicht aber die hat etwas mit "Nachricht vom Server" zu tun :)


Ich hoffe jemand von euch wird es versuchen.....

// Edit //
Was iht im Edit feld als serial eingebt ist bei diesem Crackme irrelevant.



Liebe Grüüssse
Claudio

Volle 17. Okt 2008 09:51

Re: Etwas zum spielen :) Ein CrackME....
 
Also hinter dem Proxy, der mir hier vorgeschalten ist, passiert erstmal garnichts als ne exception "no route to host".
kanns also leider nicht testen ...

hedie 17. Okt 2008 09:53

Re: Etwas zum spielen :) Ein CrackME....
 
Hmmmm merkwürdig....

Es ist ne normale http:// adresse welche mit idhttp aufgerufen wird....

Aber schonmal gut das ich das weiss! Danke!

Volle 17. Okt 2008 10:08

Re: Etwas zum spielen :) Ein CrackME....
 
joa also um hier rauszukommen muss man schon den proxy verwenden.
steht in der windoof registry drin.

musst halt zu dem connecten und dorthin den request schicken.
Is vielleicht kein fehler wenn du proxy support einbaust, haben viele firmen :>

hedie 17. Okt 2008 10:14

Re: Etwas zum spielen :) Ein CrackME....
 
Hmmm gute idee :) Danke für den Tipp....

Was meinen den die anderen welche das CrackMe schon gezogen haben?

Jeder kommentar ist willkommen :)

Ich freue mich natürlich auch über ein "Es ist unmöglich" :mrgreen:

Larsi 17. Okt 2008 10:19

Re: Etwas zum spielen :) Ein CrackME....
 
ICh bin dabei. Mein erster Versuch hat zwar die Datei zerstört aber ich versuchs gleich nochmal.

hedie 17. Okt 2008 10:21

Re: Etwas zum spielen :) Ein CrackME....
 
Cooool :D Danke fürs versuchen :)

Hoffentlich bist du erfolgreich, damit ich die lücke schliessen kann :)

Volle 17. Okt 2008 10:25

Re: Etwas zum spielen :) Ein CrackME....
 
Nur so am rande. Hast du dich mit dem ganzen thema beschaeftigt oder hast du dir einfach was ueberlegt wie du das am geschicktesten angehst?

gab mal nen netten Thread im delphiforum darueber.
Klick

also wenn du lediglich das PW an den server schickst, der schaut ob es richtig oder falsch ist und du danach die Anwort vom Server ueberpruefst ist das ziemlich einfach auszuhebeln.

hedie 17. Okt 2008 10:28

Re: Etwas zum spielen :) Ein CrackME....
 
Ich hab mir schon einige zeit lang den kopf darüber zerbrochen wie ich das am geschicktesten angehen könnte :)

Der Server antwortet im Falle einer erfolgreichen Validierung nicht nur mit einem simplen OK
sondern einem verschlüsselten String aus verschiedenen werten :)

Die haupt schwachstelle ist und bleibt halt der Client weil er ja den mechanismus zum verschlüsseln der Daten auch
beinhalten muss, damit er sie auf richtigkeit überprüfen kann.

Larsi 17. Okt 2008 10:35

Re: Etwas zum spielen :) Ein CrackME....
 
3cd74cc6793d42b7be9b3570093dc6b0fef677ab61f0d6b7db 62a42db439dbf1aa7dd674e13610b5a61f6d314151a4755b0d 56e51f1b36

Hat das irgendwas mit der Lösung zu tun?

hedie 17. Okt 2008 10:37

Re: Etwas zum spielen :) Ein CrackME....
 
Ja ein wenig ^^

Das ist deer verschlüsselte String welcher vom Server kommt.

Dieser ist jedoch Falsch (also wird nach der verarbeitung kein positives ergebniss liefern) da ich bei der PHP datei mal eingestellt habe das der eingegebene Key (serial im edit) nicht vorhanden ist (somit keine gültige lizenz) (sonst wärs ja nicht witzig :) )

Dieser String wird weiter verarbeitet und wird zur überprüfung der echtheit der Server nachricht benutzt

Volle 17. Okt 2008 10:42

Re: Etwas zum spielen :) Ein CrackME....
 
aber wenn du am ende einfach sowas testest wie

if (serialisok) then
machwas()
else
bringefehler();

dann wird dir das ding relativ flott ausgehebelt.
wuerd gerne ma testen :>

hedie 17. Okt 2008 10:45

Re: Etwas zum spielen :) Ein CrackME....
 
Das weiss ich :)

Deshalb habe ich auch sehr viele verwirrungs abfragen eingebaut...
Meiner meinung nach die einzige möglichkeit um etwas sicher zu prüfen oder?


Gibt mir mal die Proxy daten dann trag ich die hard gecoded in den idhttp ein....
Und lad die version hoch :)

Volle 17. Okt 2008 10:51

Re: Etwas zum spielen :) Ein CrackME....
 
k, dann haste dich darum gekuemmert:P
es gibt noch bessere methoden, sind aber aufwendig wie sau. :>


hier mein proxy:

ip: 10.2.1.43
port: 8080

hedie 17. Okt 2008 10:54

Re: Etwas zum spielen :) Ein CrackME....
 
Liste der Anhänge anzeigen (Anzahl: 1)
gut....

hier also die Proxy Version :)


Und welche methoden wären den dass? (nur so als gedankenspiel :) )

Sherlock 17. Okt 2008 10:55

Re: Etwas zum spielen :) Ein CrackME....
 
Weisst Du...ach wie sag ich das jetzt richtig?
Das ganze hier ist Witzlos, da Du Dein Security through Obscurity Projekt testen lassen willst.
Stell doch einfach die Sourcen hier rein, und dann kann die Diskussion los gehen. Echte Sicherheit bekommst Du nicht durch heimliche, im stillen Kämmerlein ausgedachte ROT11-Variationen. Sinnvoll ist eher ein Security through design, sowas wie AES. Das einzig geheime ist dann der Schlüssel, oder auch nur ein Teil davon. Den Algorithmus kann man dann gemeinsam auf Fehler und Lücken prüfen.

Weisst was...ich halt mich raus.

Vielleicht ist das ja doch total sinnvoll.

Sherlock

Volle 17. Okt 2008 10:56

Re: Etwas zum spielen :) Ein CrackME....
 
Hast ja recht Sherlock.

aber macht trotzdem spass, auch wenn mans nicht kann (wie ich :>)

hedie 17. Okt 2008 11:00

Re: Etwas zum spielen :) Ein CrackME....
 
@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) <> '))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;
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 :)

Larsi 17. Okt 2008 11:01

Re: Etwas zum spielen :) Ein CrackME....
 
Also über einen Http Sniffer habe ich jetzt die Website herausgefunden die von deinem Programm aufgerufen wird. Diese lautet:

http://darkhedie.bplaced.net/crypt/index_crackme.php

Sie wird auf meinem Rechner wiefolgt aufgerufen:

http://darkhedie.bplaced.net/crypt/index_crackme.php?dfgr=Deutsch(Deutschland)&&cxvb= 1&&ertd=Lars&&wfpf=Edit1

Dann generiert die Php Datei eine lange Zeichenfolge wo wahrscheinlich Sprache, Benutzername und Serial die im Edit stand drinnen verschlüsselt ist.

Dann steht in meinem Browser folgende Zeichenfolge (ohne Zeilenumbrüche):

c32497dcac1c702f653086bf39dd74c84f9d54f7cc5cc79d3b e41dbc08fdf089eb7603c3d8f3
dd0caccbdbe8236217b399bd36fecbff0ab5d54dbec48a2ce8 e6610336fdc2dda3e8399189f6
536a4efb84b3e5434c458ae4ea

Meine Idee das ganze zu hacken wäre über die hosts Datei von Windows die Anfrage auf die Php Datei umzuleiten sodass dein Programm an eine gefälschte Php Datei bspw. auf meinem Server schickt, welcher immer "Alles Super" antwortet. Das einzige Problem ist jetzt, dass ich nicht weiß was da bei einer positiven Abfrage drinnen steht aber sobald irgendjemand dein PRogramm gekauft? hat dann kann der das ja per Http Sniffer mitteilen was der Php Script ihm antwortet und dieser kann dann allen eine gefälschte Php Datei geben und sagen wie die Host Datei verändert werden muss. Und schon ist dein Programm gehackt :)

MFG Lars Wiltfang

[edit=SirThornberry]Zeilenumbrüche eingefügt - Mfg, SirThornberry[/edit]

hedie 17. Okt 2008 11:06

Re: Etwas zum spielen :) Ein CrackME....
 
Hmmm grundsätzlich ist diese idee gut

Jedoch musst du das programm dafür nicht kaufen, weil als antwort ein ähnlicher string zurückkommt auch AES Verschlüsselt

Die lösung ist im Client programm selbst... Der Client muss ja wissen wie die PHP Datei verschlüsselt damit er den String prüfen kann...


Aber Der Grundsatz würde funktionieren :)

nicodex 17. Okt 2008 11:38

Re: Etwas zum spielen :) Ein CrackME....
 
Liste der Anhänge anzeigen (Anzahl: 1)
Der Aufwand hält sich in Grenzen. Letztendlich braucht man nur diverse bedingte Sprunganweisungen ändern.
Wie übersichtlich der Code in einem brauchbaren Tool aussieht, kannst du dir im Anhang ansehen.
Aufwand: 1 Minute (mit UPX entpacken, Analyse laufen lassen, nach Referenzen auf Dialogs::ShowMessage suchen)

hedie 17. Okt 2008 11:43

Re: Etwas zum spielen :) Ein CrackME....
 
Joa sowas kann sich sehen lassen :)

Was würdest du mir denn empfehlen um den code sicherer zu gestalten?

Ist den der Code Grundsätzlich (meine Methode) zu gebrauchen? (Also übertragung und verschlüsselung etc...)

Luckie 17. Okt 2008 11:48

Re: Etwas zum spielen :) Ein CrackME....
 
Wie gesagt, das Problem sind die Abfragen. Die kannst du alles umbiegen. Die Verschlüsselung usw. spielt dann keine Rolle mehr.

hedie 17. Okt 2008 11:50

Re: Etwas zum spielen :) Ein CrackME....
 
Jepp aber wie macht man eine Abfrage so sicher wie möglich?

Dass es schlussendlich doch nur JNZ, JMP, JE usw.. sind ist schon klar aber wie könnte man es so schwierig wie möglich gestallten?

nicodex 17. Okt 2008 12:07

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

Zitat von hedie
[...] wie könnte man es so schwierig wie möglich gestallten?

Dann verbringst du nur noch deine Zeit damit, den "Schutz" zu verbessern, anstatt am Produkt zu arbeiten (das machen andere beruflich...).

Es kommt auf die Verhältnismäßigkeit an. Für normale Kunden eines Programms mit geringerer Verbreitung reicht eine IF-Abfrage.
Der Kaufanreiz sollte durch das Produkt entstehen (Support, Updates (die wierum die Dateien auf Manipulationen prüfen könnten)).

Sherlock 17. Okt 2008 14:19

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

Die Unsummen, die in einen eher früher als später gecrackten Kopierschutz fließen sollte man lieber direkt in die (Weiter)Entwicklung seines Produktes stecken. Dann ist auch das Vertändnis beim potentiellen Kunden für den Preis da.

Sherlock

Zacherl 17. Okt 2008 15:51

Re: Etwas zum spielen :) Ein CrackME....
 
Benutz WinLicence (http://www.oreans.com/winlicense.php) und Konsorten! Kostet zwar auch einiges, aber dann hast du selbst keinen großen Aufwand und zudem ist der Schutz um einiges besser, als wenn du selbst was bastelst. Aber dass man auch diesen Schutz cracken kann solltes du im Hinterkopf behalten ..

hedie 19. Okt 2008 08:37

Re: Etwas zum spielen :) Ein CrackME....
 
Danke für eure antworten....

Ich denke ich werde den Code so belassen... für meine anwendungen ist er genügend :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz