home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Reverse Code Engineering RCE CD +sandman 2000
/
ReverseCodeEngineeringRceCdsandman2000.iso
/
RCE
/
Mendoza
/
lxthowto2.txt
< prev
next >
Wrap
Text File
|
2000-05-25
|
13KB
|
318 lines
▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄
█ ▄▄▄▄ █ █ ▄▄▄▄ ▀▀▀▀▀▀▀▀▀ ▄▄▄▄ █
█ ████ █ █ ████ ████ ████▀████ █
█ ████ ▀▀▀▀ ████▄████ ████ ████ █
█ ████ ████ ▄▄▄███▄▄▄ ████ ▄▄▄▄▄█
█ ████ ████ ████ ████ ████ █
█ ████▄████ ████ ████ ████ █
█ ▀▀▀▀ ▄▄▄▄▄▄▄▄▄▄ ▀▀▀ ▄▄▄▄▄█
▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀
▄ 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]