Kleiner Hack zum Wochenende ;)

Original von +++ATH0
Bei deinem gepatchten beendet er sich ja immer unabhängig davon ob der Debugger läuft..
ne also meine gepatchte version, beendet sich bei mir (win 98) nie, egal ob ein debugger läuft oder nicht. bei der original version ist es genau andersrum, die beendet sich immer.

zeig doch mal bitte den IfIsDebuggerPresent() quellcode.
 
Ja, poste doch bitte mal den kompletten Code.
Danke.

@ivegotmail: wo hast du denn angefangen, bzw wie? Habe es mir nur kurz angesehen, fand aber auf die Schnelle keinen Ansatz.

Kurze Erklärung wäre nett. :) Mit Keygenmes habe ich keinerlei Erfahrung gemacht.

Gruss

root
 

Das erklärt alles.

Die Funktion (Only WinNT/2k/XP) :

Code:
function IsDebuggerPresent: boolean; stdcall;
asm 
  MOV EAX, FS:[$18]
  MOV EAX, [EAX+$30]
  MOVZX EAX, [EAX+2]
  RET
end;

Ich hatte einfach nicht mit Win9x gerechnet.

Soll ich das für Win9x noch einbauen? :) Ist ja eigentlich eh zu spät.
Ungetestet :
Code:
function IsDebuggerPresent9x: boolean; stdcall;
asm 
 MOV EAX, [$BFFC9CE4]
  MOV ECX, [EAX]
  CMP [ECX+$54], 00000001
  SBB EAX, EAX
  INC EAX
  RET 
end;
 
@+++ATH0
weißt du was der asm code da genau macht/prüft?

@SUID:root
hier mal ne erklärung wie ich in etwa vorgegangen bin:
-prog mit ollydbg laden
-rechtsklick -> search for -> all intermodular calls
-ganz unten in der liste findet man 2 mal GetWindowTextA (auslesen von text aus textbox: 1 x name, 1 x serial)
-da einen breakpoint setzen
-im keygenme als testeingaben "test" und "12345678" eingeben und Check drücken
-ollydbg breakt an der stelle und wenn man mit F8 durch das programm stept, sieht man im speicher die testeingaben
-wenn man weiter stept (F8) gelangt man dann irgendwann zum ExitProcess, wo das prog beendet wird
-früher oder später merkt man das an der stelle 4080C4 der entscheidende vergleich gemacht wird, der einen zum ExitProcess schickt oder nicht
-doppelklick auf diese zeile und aus dem JE ein JNE machen (ollydbg macht JNZ daraus)
-somit hat man die debuggerroutine gepatcht und kann beim nächsten durchlauf, ab dort in den wichtigen programmteil steppen
-hinter dem debuggercheck kommen dann die überprüfungen ob name und serial gültige längen haben
-bei 408159 beginnt dann der erste teil der keygenroutine (man sieht das jeder buchstabe, bis auf den letzten durchgegangen wird und entsprechende berechnungen durchgeführt werden)
-nach dieser schleife findet dann ein jmp nach 4081DB statt, wo der 2. teil der keyberechnung stattfindet
-hier wird zunächst überprüft ob die zahl (bzw der string dazu) 8 stellen hat, falls nicht wird wiederum eine berechnung durchgeführt (jump nach 4081A2). solange bis die zahl dann 8 stellen hat.

wie die berechnungen bei den beiden keygenroutinen genau sind, muss man dann anhand des assemblercodes und durch beobachtung des speichers / der register nachvollziehen.
 
Ich hab die Funktionen aus meinem ASM Krams Krums Ordner rausgewühlt. Diese Code-Schnipsel sollen angeblich von der Funktion 'IsDebuggerPresent' aus der kernel32.dll stammen.
Ich wollte deswegen jetzt nicht extra die ganze .dll einbinden. Das wäre ja auch zu auffällig gewesen :D
Die genaue Funktionsweise konnte ich nicht nachvollziehen. Aber ich testete es und es hat geklappt. Zumindest unter Windows XP SP2. Dass es bei Win9x ganz anders sein könnte habe ich völlig vergessen. *Schande über mein Haupt*.

Diese kleine Routine sollte ja auch nur die abhalten, die das keygenMe gleich in Olydbg reinladen, schnell durchtracen und sich wundern, dass der Prozess beendet wird.
 
@ivegotmail: Vielen Dank. Dann habe ich wieder eine Kleinigkeit gelernt. :)

@+++ATH0: Danke dir. Mal was Neues. Sobald ich Zeit habe, werde ich das mal genau ansehen und durchtesten.

Grüsse
root
 
Die meisten haben wohl kein Bock sich das .NET Framework SDK downzuloaden.
Darüber hinaus hat sich bestimmt noch nicht jeder mit IL-Code beschäftigt.
Ausserdem schrecken die Verschlüsselungen, die du in deinem Crackme benutzt (RSA, Blowfish),wenn sie denn welche sind, ziemlich davon ab es zu versuchen.
 
Ich habs mir mal kurz angesehen und konnte nicht viel damit anfangen. Da fehlen mir wohl noch ein paar Kenntnisse.

Gruss

root
 
nochmal kurz zu der IsDebuggerPresent sache.
unter http://ollydbg.win32asmcommunity.net/stuph/ findet man ein plugin für OllyDbg mit dem man sich vor dieser routine "verstecken" kann. dabei ist egal ob IsDebuggerPresent aus der kernel32.dll aufgerufen oder man den asm code direkt verwendet (wie +++ATH0 es getan hat).

noch besser ist dieses plugin: hidedebugger
dies schützt neben IsDebuggerPresent auch noch gegen FindWindow/EnumWindow und ein paar anderen sachen.
 
Danke dir ivegotmail. :)

Die Plugins funktionieren gut. Ich sollte mir wohl (wenn ich denn noch eins mache) fürs nächste KeygenME was besseres einfallen lassen.

Haste dich denn schonmal mit der Intermediate Language von .NET auseinandergesetzt ?
Ich blick da nicht wirklich durch. Und richtig Bock mich damit zu beschäftigen habe ich auch nicht.
 
np ;)

Original von +++ATH0
Haste dich denn schonmal mit der Intermediate Language von .NET auseinandergesetzt ?
Ich blick da nicht wirklich durch. Und richtig Bock mich damit zu beschäftigen habe ich auch nicht.
mit der IL muss man sich ja nicht unbedingt rumquälen - es gibt ja eigentlich genügend decompiler. aber da ist teilweise so ein "wurschtel-code" dabei, dass ich auch keine lust habe mich näher damit zu beschäftigen.

kannst dir den code ja selber mal dem .NET Reflector anschauen. is freeware und liefert ziemlich gute ergebnisse.
http://www.aisto.com/roeder/dotnet/
 
Jupp, da steige ich etwas besser durch als mit ildasm.exe.
Vielleicht schau ich mir das eine VB.NET Crackme doch noch mal an.
thx
 
man braucht assembler kenntnisse und muss mit einem debugger wie zum beispiel ollydbg umgehen können.
im netz gibt es dazu ausreichend tutorials.

schlagwörter zum suchen:
? cracking / crackme / crackit / keygenme / reverse enginerering + tutorial(s) / tut(s)
? assembler / asm + tutorial(s) / tut(s)
 
Zurück
Oben