home *** CD-ROM | disk | FTP | other *** search
- ▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄
- █ ▄▄▄▄ █ █ ▄▄▄▄ ▀▀▀▀▀▀▀▀▀ ▄▄▄▄ █
- █ ████ █ █ ████ ████ ████▀████ █
- █ ████ ▀▀▀▀ ████▄████ ████ ████ █
- █ ████ ████ ▄▄▄███▄▄▄ ████ ▄▄▄▄▄█
- █ ████ ████ ████ ████ ████ █
- █ ████▄████ ████ ████ ████ █
- █ ▀▀▀▀ ▄▄▄▄▄▄▄▄▄▄ ▀▀▀ ▄▄▄▄▄█
- ▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀
- ▄ 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) <g>
-
- 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 <ENTER> 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]