patchMe#2

Hallo Crackme- und Patchme- Fans!

Diese Patchme ist eine kleine Windows Applikation, die wieder mal "Hello World" ausgeben soll. Die Ausgabe erfolgt, nachdem in das Text-Eingabefeld die richtige Zahl eingegeben wurde, und anschliessend der "Ausgabe"-Knopf gedrückt wurde.

Wieder sind mindestens zwei Lösungen möglich. Bei der gewünschten Lösung muss genau ein Bit geändert werden.

Gesucht sind wieder der File-Offset des zu patchenden Bytes, sowie alter und neuer Wert dieses Bytes.

Schön wäre eine kleine Beschreibung des Lösungsweges.

Die Schwierigkeit ist sicher höher als mein vorheriges patchme, sollte aber auch nicht allzu hoch sein. Etwas Windows-Programmiererfahrung ist sicherlich von Vorteil.

Und jetzt wieder: Happy patching!

-josh
 
Zuletzt bearbeitet:
Ich fand es etwas verwirrend, weil es gibt keine gültige Zahl, die ohne patchen Hello World anzeigen würde.

Von der Schwierigkeit her würde ich es bei einfach-mittel ansiedeln.

Lösungen, wie man das macht gibt es viele, man könnte sogar nur die Resourcen vertauschen und würde mit der Zahl 130 zum richtigen ergebnis kommen. Da hier aber ein Patch verlangt ist:

Code:
00021116    .  B9 C8000000             MOV ECX,0C8

wird zu

Code:
00021116    .  B9 C7000000             MOV ECX,0C7

danach 130 eingeben und man kriegt Hello World! angezeigt. Zu erwähnen ist vllt auch noch IsDebuggerPresent(), obwohl man darauf mittlerweile dank netter Plugins kaum noch rücksicht nehmen muss.
 
Zuletzt bearbeitet:
Hallo biohazard,

erstmal recht herzlichen Dank für deine Lösung (die aber noch keine ist).

Ich fand es etwas verwirrend, weil es gibt keine gültige Zahl, die ohne patchen Hello World anzeigen würde.
Ja, das hast du völlig richtig bemerkt, und das Verhalten ist beabsichtigt. Es ist eine (alte) Regel, wenn du im Code etwas verheimlichen willst, oder erschweren willst: Keine Informationen für den "Angreifer". Ein geübter Cracker kann mit jeder Information etwas anfangen, daher : Nur etwas mitteilen, wenn es wirklich nötig ist! Diese Grundregel wird allerdings sehr häufig missachtet, auch wenn es um professionellen Kopierschutz geht.

Übrigens, die "IsDebuggerPresent" Geschichte wird vom Compiler, bzw. dem Framework (VStudio) eingefügt. Es ist zwar ein (ganz kleiner) Anti-Debug Schutz in der SW vorhanden, der geht aber nicht mit "IsDebugger Present".

Die von dir präsentierte Lösung erzeugt zwar das gesuchte Hello World, benötigt aber mehr als ein Bit für den gesuchten Patch, C8->C7: vier Bit anders! Zur gewünschten Lösung dürfte es aber nur noch ein kurzer Weg sein ;).
Und zur Schwierigkeit: Da sind wir genau einer Meinung!

-josh
 
Zuletzt bearbeitet:
So nach einem Jahr mal wieder angemeldet und direkt ans Werk gemacht ;)

Der Anti-Debugtrick besteht aus zwei GetTickCounts, wenn die Differenz größer als 5 Sekunden ist wird das Programm einfach geschlossen (PostQuitMessage).

Es wird eine Resource mit dem eingegebenen Namen gesucht (FindResourceExA). Da es nur zwei numerische Resourcen gibt, die beide den Namen 130 tragen, ist 130 unsere gesuchte Eingabe. Der Unterschied zwischen den beiden Resourcen ist der Typ. Einmal 56 und einmal 57. Der Typ ist ist hardcodiert, aber wird aus zwei Werten berechnet. Zum einen eine Globale Variable mit dem Wert 256 und zum anderen eine Konstante 200, welche einfach subtrahiert wird. Die 200 müssten wir auf 199 bringen, was 4 Bits drehen würde. Aber die 256 können wir mit nur einem Bit auf 257 bringen. Es wird nun versucht die Resource 257 - 200 = 57 zu laden, welche den verschlüsselten Text "Hello World!" enthält. Die andere Resource(56) enthält den verschlüsselten Text "Leider noch nicht richtig."


Gepatch wird also:

Code:
00401192   C700 00010000    MOV DWORD PTR DS:[EAX],100

->

Code:
00401192   C700 01010000    MOV DWORD PTR DS:[EAX],101


//redox
 
Hallo biohazard,

erstmal recht herzlichen Dank für deine Lösung (die aber noch keine ist).


Ja, das hast du völlig richtig bemerkt, und das Verhalten ist beabsichtigt. Es ist eine (alte) Regel, wenn du im Code etwas verheimlichen willst, oder erschweren willst: Keine Informationen für den "Angreifer". Ein geübter Cracker kann mit jeder Information etwas anfangen, daher : Nur etwas mitteilen, wenn es wirklich nötig ist! Diese Grundregel wird allerdings sehr häufig missachtet, auch wenn es um professionellen Kopierschutz geht.

Übrigens, die "IsDebuggerPresent" Geschichte wird vom Compiler, bzw. dem Framework (VStudio) eingefügt. Es ist zwar ein (ganz kleiner) Anti-Debug Schutz in der SW vorhanden, der geht aber nicht mit "IsDebugger Present".

Die von dir präsentierte Lösung erzeugt zwar das gesuchte Hello World, benötigt aber mehr als ein Bit für den gesuchten Patch, C8->C7: vier Bit anders! Zur gewünschten Lösung dürfte es aber nur noch ein kurzer Weg sein ;).
Und zur Schwierigkeit: Da sind wir genau einer Meinung!

-josh

Ach lol ich dachte Byte und nicht Bit , mist wenn man das zuschnell überfliegt^^
 
@ReDoX:
Kein weiterer Kommentar von mir. Die Analyse ist perfekt! Super Beschreibung!

@biohazard90
Kein Problem, der Lösungsweg war klar!

Nochmal ein Dank an beide Solver!
 
Zurück
Oben