         
         
         
        
      
       
      
      
            
     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]