L ZZZZZZ RRRRR SSSSS L Z R R S L aaa Z aaa R R u u S L a Z a RRRRR u u SSSSS XX L aaaa Z aaaa R R u u S XXXX L a a Z a a R R u u S XXXXXX LLLLLLL aaaaa ZZZZZZZ aaaaa R R uuuuu SSSSSS XXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXX XXXXXX XXXX proudly presents his 27.Cracking Tutorial (31.07.1999) XX tKC's CiA Trial CrackMe 0.99 I. Vorwort I.1 Die Tools II. Das Tut III. BTW I. Dieses Tutorial geht nicht nur darum ein bestimmtes Programm zu cracken, sondern auch um eines (für mich) faszinierendsten Dinge die man überhaupt mit einer EXE Datei machen kann: Dem Umleiten der ASM-Befehle zu hinzugefügten Befehlen, so dass man sogar in der Lage ist gepackte Dateien zu patchen. Die Arbeit an diesem CrackMe ist eine Co-produktion zwischen mir (einfacherer Teil) und R!SC (schwererer Teil). Später werde ich weiter auf die Verteilung eingehen. I.1 Die Tools Einer dieser seltenen Fälle, bei denen ich gezwungen war von meinem geliebten W32Dasm Debugger Abstand zu nehmen: Also SoftIce (diesmal). Ein Hexeditor wird auch benötigt und bevor ichs vergesse: Procdump II. Das Tut Um das CrackMe zu lösen muss man einen Nagscreen wegpatchen, eine Serial herausbekommen und eine gültige Name/Serial Kombination ermitteln. Fangen wir mit der ersten Serial an (TryMe #1), da diese am einfachsten ist. Startet TryMe #1 und gebt irgendeine Serial ein. Ich nehme wie immer 666999. Jetzt startet SICE und setzt einen Breakpoint auf hmemcpy (bpx hmemcpy). Verlasst SICE und drückt den OK Button. Das SICE Fenster wird wieder aktiviert und jetzt müsst ihr solange [F12] drücken bis ihr in "nützlichen" Regionen seid. Nützlicher Code hat diese Adressen-Struktur: XXXX:XXXXXXXX (nicht XXXX:XXXX) und es erscheint kein "ret" in den nächsten paar Codezeilen. In diesem Falle kommt man zu :0045AEAB. Jetzt noch kurz mit [F10] durch den Code tracen, bis ihr an :0045AEBF ankommt. Wenn man "d eax" eingibt, erscheint die Serial, die man eingegeben hat, benutzt man "d edx" erscheint: 4E0A5C9B70A48ID501266ECB59423%9EAA0C58E844C7E9EE - Sollte dies wirklich die richtige Serial sein? Raus aus SICE und ausprobieren (Ihr habt Glück, ihr habt Copy/Paste ;) Ja, es ist wirklich die richtige Serial. Also weiter zu TryMe #2. Jetzt soll man eine korrekte Serial für seinen Namen ermitteln. Auch dieser Teil wurde zuerst von mir gelöst (ist ja auch noch leicht). TryMe #2 starten und einen Namen und eine Fake-Serial eingeben. Ich nehme LaZaRuS und 666999. In SICE und erneut einen bpx auf hmemcpy setzen. Raus aus SICE und den OK Button drücken. Das SICE Fenster erscheint wieder. Jetzt hat das CrackMe jedoch erst den Text aus einem Eingabefeld eingelesen. Also [CTRL]+[D] drücken und raus aus SICE. SICE wird sofort wieder erscheinen, da dann der Text vom zweiten Textfeld eingelesen wird. Wieder mit [F12] "nützlichen" Code suchen. Diesmal :0045FA6C. Man muss nur noch einmal F10 drücken. Wenn man dann "d edx" eingibt, kann man seinen Namen im Hexfenster (was weis ich wie das offiziell heisst) sehen und eine Zeile tiefer: $21C5249D - Sollte das die richtige Serial für LaZaRuS sein. "BC*" um alle Breakpoints zu löschen und raus aus SICE. Name und Serial eingeben und man sieht: "Congratz! Contact CiA to get your trial status!". Naja, so voreilig sind wir mal nicht. Es fehlt immer noch der Nagscreen. btw: R!SC hat es natürlich auch geschafft dieses CrackMe zu cracken. Seine Kombination ist R!SC / $C9ECB75B. Eigentlich ist ja selten (bei "normalen" Umständen) etwas schweres dran einen Nagscreen zu patchen. Diesmal wird der Schwierigkeitsgrad jedoch etwas angehoben durch die Tatsache das die EXE-Datei mit Shrinker (3.3 glaub ich) gepackt ist. Da entpacken doch recht lame ist und ich auch keinen Processpatcher einsetzen wollte (auch nicht besser) musste ich mich nach einer Alternative umsehen. Glücklicherweise half mir Phantasm, der mir ein Tut über mein Problem (Patchen von Shrinker-gepackten Dateien von R!SC) mailte. Ich würde vorschlagen das es sich der lernwillige Leser *sofort* besorgt. So begann ich zu arbeiten. Das Byte, dass es zu patchen galt war schnell gefunden - :00459BC2 (R!SC, den ich um Unterstützung bat, fand sogar noch ein besseres - :00460164). (Wer die Methode wissen will, mit der ich auf die Bytes kam, sollte entweder mir mailen oder mein Tut Nummer [Wasweisich] lesen. Bei jedem der jetzt weiterliest, setze ich vorraus, dass er entweder R!SC's tut durchgelesen hat oder wenigstens eine grobe Vorstellung hat, wie man Assembleranweisungen in ungenutzte Teile der EXEDatei umleitet und eigenen Code hinzufügt. Das erste was wir benötigen ist der "Entry point" des Programms. Normalerweise geht das einfach mit dem SICE Symbol Loader. Leider funktioniert er hier nicht. Es gibt einen alternativen Weg: Startet Procdump und ladet das CrackMe in den PE-Editor. Jetzt sieht man, dass der Entry Point bei 8C3DA ist. Jetzt noch schnell in die "Sections" sehen und eine Section suchen, die nahe am Entry Point liegt. Diesmal ist das ".load" bei 8B000. In der EXE Datei beginnt die .load Sektion bei 2800 (Raw Offset). Jetzt kann man ganz einfach mit 8C3DA-8B000+2800=3BDA den richtigen Entry Point bestimmen: 3BDA. Aber wie schaffen wirs jetzt, dass SICE hier aktiviert wird. Ändert einfach das Offset an 3BDA in CC. Das ist der Op-Code für INT03. Jetzt setzt in SICE mit "bpint 03" einen Breakpoint auf INT03. Wenn man jetzt das CrackMe startet, wird SICE ganz am Anfang aktiv. Jetzt müssen wir die Veränderungen rückgängig machen (sonst machts Crash). Man macht das mit "e eip 83", weil vorher das Offset 83h war. Jetzt kann man mit "tracen" anfangen (F10). Wenn man über den Call an :0048C45C tracet, erscheint der Nag-Screen, also müssen wir da rein (F8). Jetzt weitertracen bis man an "Call [ebp-20]" kommt. Das ist das Ende der Shrinker Sektion (glaubts mir einfach, es ist so ;). Notiert euch die Hexcodes des Calls und des vorherigen push: FF7508FF55E0 - Sucht dies im Hexeditor und notiert das Offset: 3CDC. Alles schön und gut, aber was brint das? Kurz gesagt: Wir müssen die ASM-Anweisungen am Ende der Shrinker Sektion umleiten in Code der die EXEDatei patcht (den wir natürlich auch noch schreiben müssen) und dann normal im Programm weitermachen. Als erstes brauchen wir unbenutzte Teile der EXE-Datei (R!SC hat sich 5530 ausgesucht, ich etwas anderes, aber machen wir mit R!SC's Offset weiter. Unbenutzer Code ist ein grosser Block von 00h (wir brauchen aber nur 10 Byte oder so). Irgendwie müssen wir diesen Teil ja in SICE wiedererkennen, also geben wir hier einen Text ein: Ich nehme "lazarro" (Vorsicht: Wer "GotYa" oder "HelloWorld" nimmt, erwischt auf unerklärliche Weise Op-Codes, die einen Reboot verursachen). Jetzt SICE starten und bis zum letzten Push vor "Call [ebp-20]" vorrücken. Dann nach "lazarro" suchen (s 0 l ffffffff 'lazarr'). Man findet es an :0048DD30. Dahin müssen wir die Instruktionen umleiten. "a eip" eingeben, damit man die aktuelle Anweisung ändern kann. Ändert diese in "jmp 48DD30". Jetzt weitertracen und man landet bei lazarro. Jetzt kam mein grosses Problem: Ich dachte die Datei wäre 4mal gepackt, sie ist aber nur 1mal gepackt und 3mal verschlüsselt. Also hab ich R!SC "angebettelt" mir zu helfen. Er erkannte meine Blindheit und teilte mir mit, dass jedes Byte der Datei verschlüsselt wurde, indem 7Bh addiert wurde (3*7Bh genauer). Wenns nicht verschlüsselt gewesen wäre, wärs simpler geworden. Jetzt aber zum patchen. Gebt "a eip" ein und danach die folgenden Anweisungen. mov byte ptr [460164], B8 // ändert CALL zu MOV push dword ptr [ebp+08] // der Push, den wir mit dem JMP überschrieben call [ebp-20] // und weiter im Programm Eigentlich - wenn nix verschlüsselt wäre - müsste man das Byte in B8 ändern. So muss man aber 3*7Bh subtrahieren. Das ergibt dann 29h. Jetzt müsste der Nagscreen verschwunden sein und das Programm laufen. Wenn nicht, habt ihr einen Fehler gemacht. Lest dieses Tut und R!SC's tut erneut und ihr bekommt den Bogen raus. Wenn alles funktioniert hat, macht das ganze nochmal und schreibt die Bytes auf, die die drei Anweisungen darstellen. Es sind C6056401460029FF7508FF55E0. Diese müsst ihr im Hex-Editor an Offset 5530 eintragen, da die Veränderungen, die man in SICE macht ja nur im RAM sind. Ausserdem müsst ihr den PUSH/CALL an Offset 3CDC in einen JMP patchen. Die Op-Codes hierfür sind E94F180000. Jetzt ist der Nag für immer verschwunden. Das wars dann auch schon: Ich möchte R!SC für seine Unterstützung und Phantasm für R!SC's Tut danken. R!SC's Hilfe findet ihr in "risc.txt" Der Patch wurde mit der Patchengine von Eternal Bliss und Borna Janes gemacht. III. BTW Wenn ihr irgenwelche Fragen habt: Ihr findet mich in #cracking4newbies und #cug (fast jeden Abend), ihr könnt mir mailen (lazarus_hf@hotmail.com) und ihr könnt meine Site besuchen: hello.to/lazarus