ÜÜÜÜÜÜÜÜ ÜÜÜÜÜÜÜÜ ÜÜÜÜÜÜÜÜ Û ÜÜÜÜ Û Û ÜÜÜÜ ßßßßßßßßß ÜÜÜÜ Û Û ÛÛÛÛ Û Û ÛÛÛÛ ÛÛÛÛ ÛÛÛÛßÛÛÛÛ Û Û ÛÛÛÛ ßßßß ÛÛÛÛÜÛÛÛÛ ÛÛÛÛ ÛÛÛÛ Û Û ÛÛÛÛ ÛÛÛÛ ÜÜÜÛÛÛÜÜÜ ÛÛÛÛ ÜÜÜÜÜÛ Û ÛÛÛÛ ÛÛÛÛ ÛÛÛÛ ÛÛÛÛ ÛÛÛÛ Û Û ÛÛÛÛÜÛÛÛÛ ÛÛÛÛ ÛÛÛÛ ÛÛÛÛ Û Û ßßßß ÜÜÜÜÜÜÜÜÜÜ ßßß ÜÜÜÜÜÛ ßßßßßßßß ßßßßßßß Ü lAXITy '98 pRESENTs: Ü Laxity Cracking tutorial #2 *German* Cracking - HowTo #2 by VTeC [Laxity] Auf vielfachen Wunsch hier nun ein deutsches Cracking-Tutorial. Ich habe einen Spiele-Update-Patch gewaehlt, da der vorliegende Kopierschutz relativ simpel und beispielhaft fuer viele Games ist; zudem kommt es immer wieder vor, dass die Leutz ueber ein gecracktes Game-Release verfuegen, aber die Updates nicht einspielen koennen, da mit dem Update auch der Kopierschutz reaktiviert wird (gilt fuer Updates, die die ausfuehrbaren Dateien mit den neuen Versionen ueberschreiben, Patcher scheitern i.d.R. an den durch Cracks modifizierten Dateien). Wer nicht ueber das benoetigte Hauptprogramm verfuegt, kann dennoch das Update-Archiv auspacken (ist ein WinZIP-Selfextractor) und alles an der darin enthaltenen M1TP2.EXE nachvollziehen; lediglich das Zocken ist dann nicht moeglich. :-) Zielprogramm ============ - M1 Tank Platoon II v1.2 Upgrade Patch sowie das zugrundeliegende Game (getestet mit RAZOR-Release, sollte aber auch mit der kompletten CD der U.S.-Version funktionieren). Protection-Typ ============== Simpler CD-Check Benoetigte Tools ================ - W32Dasm 8.9 (Disassembler) - ein beliebiger Hex-Editor, am besten aber HIEW 5.84, da man damit die Zieldatei auch in Assembler-Darstellung einsehen und/oder editieren kann. URLs ==== - ftp://ftp.avault.com/patches/m1tp2v12.exe (M1 Tank Platoon II v1.2 Patch) - ftp://ftp.cs.tu-berlin.de/pub/msdos/mirrors/stuba/pc/utilprog/hiew584.zip (HIEW v5.84) - http://202.102.15.149/~person/paulgao/cracks/RVWDSM89.ZIP (W32Dasm v8.9) Vorgehen ======== Den v1.2 Update Patch installieren und M1 Tank Platoon II starten (wenn Ihr die CD habt, muss das Game zuvor *komplett* auf Platte installiert worden sein, und die CD sollte natuerlich aus dem CD-Laufwerk entnommen sein :-)). Es erscheint die freundliche Aufforderung, die CD einzulegen: "Please insert M1 Tank Platoon II CD". Solche Dialogtexte bieten einen idealen Ansatzpunkt, um den Kopierschutz anzugreifen, da man sich, wenn man den Bezug darauf im Programm finden kann, bereits in (bzw.in der Naehe) der betreffenden Schutzroutine befindet. Mit W32Dasm erstellt man ein sogenanntes "dead listing" des Zielprogrammes, d.h. man analysiert es nicht, waehrend es ausgefuehrt wird, sondern verfolgt den Programmverlauf anhand der gelisteten Assembler-Befehle, die das Programm bei Ausfuehrung abarbeiten wuerde. Mit W32Dasm wird zunaechst das benoetigte Listing erzeugt. Zu diesem Zweck W32Dasm starten und ueber den Menuepunkt "Disassembler -> Open File to Disassemble" die Datei M1TP2.EXE disassemblieren. Nach dem Disassemblieren als naechstes das Listing ueber den Menuepunkt "Disassembler -> Save Disassembly Text File and Create Project File" abspeichern. Analyse ======= Nun mit einem Dateiviewer, z.B. Norton Commander, das Listing "M1TP2.ALF" laden und nach dem String "Please insert M1 Tank Platoon II CD" suchen. An der Adresse 00419AB6 gibt es einen Bezug auf diesen String. Was das Programm mit diesem String im Detail anfaengt, um die Meldung auszugeben, soll hier nicht Thema sein. Jetzt gilt es naemlich lediglich herauszufinden, von wo die Routine, die diese Meldung ausgibt, aufgerufen wird. Ein paar Zeilen weiter oben im Listing findet sich ein Verweis auf einen bedingten Sprung bei 00419A19. * Referenced by a (U)nconditional or (C)onditional Jump at Address: :00419A19(C) <=== zu analysierender Sprung :00419AAF 6A00 push 00000000 * Possible StringData Ref from Data Obj ->"M1 Tank Platoon II" | :00419AB1 68EC944700 push 004794EC * Possible StringData Ref from Data Obj ->"Please insert M1 Tank Platoon " ->"II CD" | :00419AB6 68C8944700 push 004794C8 <=== Text der Messagebox :00419ABB 6A00 push 00000000 Durch Hochscrollen des Listings gelangt man schnell zu der betreffenden Adresse. Es gibt nun verschiedene Moeglichkeiten, an den Crack heranzugehen. Man kann den CD-Check in der Form cracken, dass man die Routine patcht, die bestimmt, wie sich das Programm beim Fehlen der CD verhaelt, hier moechte ich allerdings zeigen, wie man den kompletten Check entfernt. Zu diesem Zweck betrachten wir den Sprung bei 00419A19. Wie wir gesehen haben, wird dort beim Fehlen der CD die Routine angesprungen, die die Fehlerdialogbox ausgibt. Dieser Sprung selbst steht innerhalb einer Prozedur, die wiederum von einem Call bei 004116A4 aufgerufen wird. * Referenced by a CALL at Address: :004116A4 <=== zu analysierender Call :00419A00 83EC70 sub esp, 00000070 :00419A03 53 push ebx :00419A04 56 push esi :00419A05 57 push edi :00419A06 33DB xor ebx, ebx :00419A08 55 push ebp * Reference To: KERNEL32.GetLogicalDrives, Ord:00F9h | :00419A09 FF15D0F28800 Call dword ptr [0088F2D0] :00419A0F 8BF8 mov edi, eax :00419A11 881DD0A38700 mov byte ptr [0087A3D0], bl :00419A17 85FF test edi, edi :00419A19 0F8490000000 je 00419AAF <=== bedingter Sprung zur Fehlerroutine Nun liegt es nahe, sich genau anzusehen, was bei 004116A4 passiert. * Referenced by a CALL at Address: :0045E146 :004116A0 83EC1C sub esp, 0000001C :004116A3 56 push esi :004116A4 E857830000 call 00419A00 <=== Aufruf CD-Check :004116A9 85C0 test eax, eax <=== Erg. des Checks in EAX=0? :004116AB 7509 jne 004116B6 <=== wenn nicht, good boy! :004116AD 33C0 xor eax, eax :004116AF 5E pop esi :004116B0 83C41C add esp, 0000001C :004116B3 C21000 ret 0010 Der Call bei 004116A4 repraesentiert den Aufruf der kompletten CD-Check-Routine mit allen Unterroutinen. Der Rueckgabewert dieses Checks wird im Register EAX ueber- geben. Ist EAX ungleich 0, war der CD-Check erfolgreich, ist EAX=0, so wird der boese User ohne CD aus dem Programm geworfen. Mit diesem Wissen kann man sich das Analysieren der nicht ganz kurzen Prozedur ab 00411A00 getrost sparen, sofern man lediglich an einem schnellen Ergebnis interessiert ist. Zusammenfassend kann man also "call 00419A00" in "Rufe CD-Check auf" uebersetzen. Crack ===== Kommen wir nun zum eigentlichen Crack, der mit dem Ergebnis unserer Analyse nun moeglich ist. Es gibt auch hier mehrere Moeglichkeiten, ich greife hier nur eine heraus, die ich persoenlich fuer die Eleganteste halte. Wenn "call 00419A00" also den CD-Check aufruft, liegt es nahe, das Programm so zu patchen, dass dieser Check ueberhaupt nicht mehr erfolgt. Auf diese Weise wird verhindert, dass "ueberfluessiger" Code ausgefuehrt und somit Rechenzeit verschwendet wird. :-)) Wie wird man diesen Aufruf nun los? Die einfachste Loesung waere es, den Call durch No-Operation-Instruktionen zu ersetzen, sogenannte NOPs. Ein NOP wird durch ein Byte mit dem Wert 90h erzielt. Betrachten wir noch einmal die betreffende Stelle im Programm: :004116A4 E857830000 call 00419A00 Im linken Bereich befinden sich neben der Adressangabe :004116A4 die Prozessor- anweisungen in der Form von hexadezimalen Opcodes, d.h. die einzelnen Bytes, die die Befehle repraesentieren, naemlich E857830000, rechts ist die Bedeutung der Instruktion gelistet (call 00419A00). Da die vorliegende Instruktion (E857830000) 5 Bytes lang ist, muessen auch 5 NOPs gesetzt werden, um den Call wegzupatchen, also muss E857830000 durch 9090909090 ersetzt werden, um den gewuenschten Effekt zu erzielen. Der Crack funktioniert so zwar, jedoch sollte man mit der Verwendung von NOPs sparsam umgehen, da manche clevere Protections solche Patches foermlich "riechen". Zudem ist es Zufall, dass das Register EAX nach dem Weg-Noppen des Calls einen Wert enthaelt, der das Programm in den richtigen Ausfuehrungszweig springen laesst. Das Programm checkt ja immer noch den Rueckgabewert des Calls, auch wenn dieser selbst weggepatcht wurde. Um das Ganze "clean" zu cracken, muesste beim NOP-Patch hier auch noch der bedingte Sprung nach dem CD-Check-Call von :004116AB 7509 jne 004116B6 <=== fuehre Programm aus, wenn CD-Check ok auf :004116AB EB09 jmp 004116B6 <=== fuehre Programm unab- haengig vom Ergebnis des CD-Checks aus umgebogen werden, so dass man folgenden Code erhaelt: :004116A4 90 nop :004116A5 90 nop :004116A6 90 nop :004116A7 90 nop :004116A8 90 nop :004116A9 85C0 test eax, eax :004116AB 7509 jmp 004116B6 Das Alles kann man sich jedoch sparen, letztlich will das Programm doch nur im Register EAX den Wert 1 vorfinden, dann ist es gluecklich. Also tun wir ihm den Gefallen. :-) :004116A4 E857830000 call 00419A00 <=== hier manipulieren :004116A9 85C0 test eax, eax :004116AB 7509 jne 004116B6 Also aendern wir :004116A4 E857830000 call 00419A00 <=== Aufruf CD-Check in :004116A4 B801000000 mov eax, 00000001 <=== positives Ergebnis des Checks anstelle des Checks :-)) Das Ganze ist also ein Drei-Byte-Patch (E8=>B8, 57=>01, 83=>00), und es ergibt sich folgender manipulierter Code: :004116A4 B801000000 mov eax, 00000001 <=== bingo! :004116A9 85C0 test eax, eax <=== Resultat ist immer ok :004116AB 7509 jne 004116B6 <=== erwuenschter Sprung erfolgt immer Als letztes muessen wir nur noch den Offset in der Datei M1TP2.EXE ermitteln, an dem der Patch zu erfolgen hat. Dazu wird in W32Dasm, der ja seit dem Erstellen des Listings friedlich im Hintergrund schlummerte, das Menue "Goto -> Goto Code Location" benutzt. Im daraufhin erscheinenden Eingabefenster ist die Programmadresse 004116A4 einzutragen. Nach Betaetigen des OK-Buttons kann man den Datei-Offset in der Statuszeile von W32Dasm ablesen, in unserem Fall 10AA4h. Diesen Offset bitte notieren, er wird spaeter benoetigt. W32Dasm kann jetzt geschlossen werden, es wird nur noch der Hex-Editor benoetigt, in diesem Beispiel HIEW. HIEW ist ein sehr leistungsfaehiges Tool, das zunaechst etwas Konfiguration erfordert. (Nicht ungeduldig werden, wir haben's bald) 1. Download von HIEW584.ZIP. 2. Entpacken in beliebiges Verzeichnis 3. Umbenennen von HIEW.DOS in HIEW.EXE 4. Editieren von HIEW.INI Die Eintraege fuer "StartMode" und "ShowOffset" in HIEW.INI sind wie folgt zu setzen und abzuspeichern: StartMode = Code ShowOffset = Global Nun muss M1TP2.EXE ins HIEW-Verzeichnis kopiert werden. HIEW wird dann mit "HIEW M1TP2.EXE" gestartet. Mit der Taste F5 kann man zu einem beliebigen Datei-Offset springen. In das blinkende Offset-Feld oben links wird dann der von uns ermittelte Offset 10AA4 eingetragen und mit bestaetigt. Nun befinden wir uns an der interessanten Stelle und sehen den mittlerweile wohlbekannten CD-Check-Call vor uns. Mit F3 wechselt man in den Editor-Modus von HIEW. Nun einfach die zu aendernden Bytes eingeben: B8 01 00, mit F9 das Ganze abspeichern und HIEW beenden. Die gepatchte M1TP2.EXE nun ins M1 Tank Platoon II-Verzeichnis kopieren (Original ueberschreiben oder vorher umbenennen, wie's beliebt) ... fertig! Herzlichen Glueckwunsch, dank dieses Tutorials ist M1 Tank Platoon II v1.2 nun gecrackt. War doch nicht schwer, oder? :-) Watch out for more releases from Laxity - German Cracking Force! VTeC [Laxity]