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

  1. ▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄       ▄▄▄▄▄▄▄▄
  2.  █ ▄▄▄▄ █  █ ▄▄▄▄ ▀▀▀▀▀▀▀▀▀ ▄▄▄▄ █
  3.  █ ████ █  █ ████ ████ ████▀████ █
  4.  █ ████ ▀▀▀▀ ████▄████ ████ ████ █ 
  5.  █ ████ ████ ▄▄▄███▄▄▄ ████ ▄▄▄▄▄█
  6.  █ ████ ████ ████ ████ ████ █
  7.  █ ████▄████ ████ ████ ████ █
  8.  █ ▀▀▀▀ ▄▄▄▄▄▄▄▄▄▄ ▀▀▀ ▄▄▄▄▄█ 
  9.  ▀▀▀▀▀▀▀▀        ▀▀▀▀▀▀▀   
  10.     ▄ lAXITy '98 pRESENTs: ▄              
  11.  
  12.    Laxity Cracking tutorial #2
  13.             *German*
  14.  
  15.  
  16. Cracking - HowTo #2 by VTeC [Laxity]
  17.  
  18.  
  19. Auf vielfachen Wunsch hier nun ein deutsches Cracking-Tutorial.
  20.  
  21. Ich habe einen Spiele-Update-Patch gewaehlt, da der vorliegende
  22. Kopierschutz relativ simpel und beispielhaft fuer viele Games ist;
  23. zudem kommt es immer wieder vor, dass die Leutz ueber ein gecracktes
  24. Game-Release verfuegen, aber die Updates nicht einspielen koennen,
  25. da mit dem Update auch der Kopierschutz reaktiviert wird (gilt fuer 
  26. Updates, die die ausfuehrbaren Dateien mit den neuen Versionen 
  27. ueberschreiben, Patcher scheitern i.d.R. an den durch Cracks 
  28. modifizierten Dateien).
  29.  
  30. Wer nicht ueber das benoetigte Hauptprogramm verfuegt, kann dennoch
  31. das Update-Archiv auspacken (ist ein WinZIP-Selfextractor) und alles
  32. an der darin enthaltenen M1TP2.EXE nachvollziehen; lediglich das 
  33. Zocken ist dann nicht moeglich. :-)
  34.  
  35.  
  36. Zielprogramm
  37. ============
  38.  
  39. - M1 Tank Platoon II v1.2 Upgrade Patch sowie das zugrundeliegende 
  40.   Game (getestet mit RAZOR-Release, sollte aber auch mit der kompletten
  41.   CD der U.S.-Version funktionieren).
  42.  
  43.  
  44. Protection-Typ
  45. ==============
  46.  
  47. Simpler CD-Check
  48.  
  49.  
  50. Benoetigte Tools
  51. ================
  52.  
  53. - W32Dasm 8.9 (Disassembler) 
  54. - ein beliebiger Hex-Editor, am besten aber HIEW 5.84, da man damit die 
  55.   Zieldatei auch in Assembler-Darstellung einsehen und/oder editieren kann.
  56.  
  57.  
  58. URLs
  59. ====
  60.  
  61. - ftp://ftp.avault.com/patches/m1tp2v12.exe (M1 Tank Platoon II v1.2 Patch)
  62. - ftp://ftp.cs.tu-berlin.de/pub/msdos/mirrors/stuba/pc/utilprog/hiew584.zip 
  63.   (HIEW v5.84)
  64. - http://202.102.15.149/~person/paulgao/cracks/RVWDSM89.ZIP (W32Dasm v8.9)
  65.  
  66.  
  67. Vorgehen
  68. ========
  69.  
  70. Den v1.2 Update Patch installieren und M1 Tank Platoon II starten (wenn Ihr 
  71. die CD habt, muss das Game zuvor *komplett* auf Platte installiert worden 
  72. sein, und die CD sollte natuerlich aus dem CD-Laufwerk entnommen sein :-)). 
  73. Es erscheint die freundliche Aufforderung, die CD einzulegen: "Please insert 
  74. M1 Tank Platoon II CD". 
  75. Solche Dialogtexte bieten einen idealen Ansatzpunkt, um den Kopierschutz 
  76. anzugreifen, da man sich, wenn man den Bezug darauf im Programm finden kann, 
  77. bereits in (bzw.in der Naehe) der betreffenden Schutzroutine befindet.
  78.  
  79. Mit W32Dasm erstellt man ein sogenanntes "dead listing" des Zielprogrammes,
  80. d.h. man analysiert es nicht, waehrend es ausgefuehrt wird, sondern verfolgt
  81. den Programmverlauf anhand der gelisteten Assembler-Befehle, die das Programm 
  82. bei Ausfuehrung abarbeiten wuerde.
  83.  
  84. Mit W32Dasm wird zunaechst das benoetigte Listing erzeugt. Zu diesem Zweck
  85. W32Dasm starten und ueber den Menuepunkt "Disassembler -> Open File to 
  86. Disassemble" die Datei M1TP2.EXE disassemblieren. Nach dem Disassemblieren 
  87. als naechstes das Listing ueber den Menuepunkt "Disassembler -> Save 
  88. Disassembly Text File and Create Project File" abspeichern. 
  89.  
  90.  
  91. Analyse
  92. =======
  93.  
  94. Nun mit einem Dateiviewer, z.B. Norton Commander, das Listing "M1TP2.ALF"
  95. laden und nach dem String "Please insert M1 Tank Platoon II CD" suchen. 
  96. An der Adresse 00419AB6 gibt es einen Bezug auf diesen String. Was das 
  97. Programm mit diesem String im Detail anfaengt, um die Meldung auszugeben, 
  98. soll hier nicht Thema sein. Jetzt gilt es naemlich lediglich herauszufinden,
  99. von wo die Routine, die diese Meldung ausgibt, aufgerufen wird. 
  100. Ein paar Zeilen weiter oben im Listing findet sich ein Verweis auf einen 
  101. bedingten Sprung bei 00419A19.
  102.  
  103. * Referenced by a (U)nconditional or (C)onditional Jump at Address:
  104. :00419A19(C)                                      <=== zu analysierender Sprung  
  105.  
  106. :00419AAF 6A00                    push 00000000
  107.  
  108. * Possible StringData Ref from Data Obj ->"M1 Tank Platoon II"
  109.                                   |
  110. :00419AB1 68EC944700              push 004794EC
  111.  
  112. * Possible StringData Ref from Data Obj ->"Please insert M1 Tank Platoon "
  113.                                         ->"II CD"
  114.                                   |
  115. :00419AB6 68C8944700              push 004794C8   <=== Text der Messagebox
  116. :00419ABB 6A00                    push 00000000
  117.  
  118.  
  119. Durch Hochscrollen des Listings gelangt man schnell zu der betreffenden
  120. Adresse. 
  121.  
  122. Es gibt nun verschiedene Moeglichkeiten, an den Crack heranzugehen.
  123. Man kann den CD-Check in der Form cracken, dass man die Routine patcht, 
  124. die bestimmt, wie sich das Programm beim Fehlen der CD verhaelt, hier 
  125. moechte ich allerdings zeigen, wie man den kompletten Check entfernt. 
  126.  
  127. Zu diesem Zweck betrachten wir den Sprung bei 00419A19. Wie wir gesehen
  128. haben, wird dort beim Fehlen der CD die Routine angesprungen, die die
  129. Fehlerdialogbox ausgibt. Dieser Sprung selbst steht innerhalb einer 
  130. Prozedur, die wiederum von einem Call bei 004116A4 aufgerufen wird. 
  131.   
  132.  
  133. * Referenced by a CALL at Address:
  134. :004116A4                                         <=== zu analysierender Call 
  135.  
  136. :00419A00 83EC70                  sub esp, 00000070
  137. :00419A03 53                      push ebx
  138. :00419A04 56                      push esi
  139. :00419A05 57                      push edi
  140. :00419A06 33DB                    xor ebx, ebx
  141. :00419A08 55                      push ebp
  142.  
  143. * Reference To: KERNEL32.GetLogicalDrives, Ord:00F9h
  144.                                   |
  145. :00419A09 FF15D0F28800            Call dword ptr [0088F2D0]
  146. :00419A0F 8BF8                    mov edi, eax
  147. :00419A11 881DD0A38700            mov byte ptr [0087A3D0], bl
  148. :00419A17 85FF                    test edi, edi
  149. :00419A19 0F8490000000            je 00419AAF     <=== bedingter Sprung zur 
  150.                                            Fehlerroutine 
  151.  
  152.  
  153. Nun liegt es nahe, sich genau anzusehen, was bei 004116A4 passiert.
  154.  
  155. * Referenced by a CALL at Address:
  156. :0045E146   
  157.  
  158. :004116A0 83EC1C                  sub esp, 0000001C
  159. :004116A3 56                      push esi
  160. :004116A4 E857830000              call 00419A00   <=== Aufruf CD-Check
  161. :004116A9 85C0                    test eax, eax   <=== Erg. des Checks in EAX=0?
  162. :004116AB 7509                    jne 004116B6    <=== wenn nicht, good boy!
  163. :004116AD 33C0                    xor eax, eax
  164. :004116AF 5E                      pop esi
  165. :004116B0 83C41C                  add esp, 0000001C
  166. :004116B3 C21000                  ret 0010
  167.  
  168. Der Call bei 004116A4 repraesentiert den Aufruf der kompletten CD-Check-Routine mit
  169. allen Unterroutinen. Der Rueckgabewert dieses Checks wird im Register EAX ueber-
  170. geben. Ist EAX ungleich 0, war der CD-Check erfolgreich, ist EAX=0, so wird der
  171. boese User ohne CD aus dem Programm geworfen.
  172.  
  173. Mit diesem Wissen kann man sich das Analysieren der nicht ganz kurzen Prozedur 
  174. ab 00411A00 getrost sparen, sofern man lediglich an einem schnellen Ergebnis 
  175. interessiert ist. 
  176.  
  177. Zusammenfassend kann man also "call 00419A00" in "Rufe CD-Check auf" 
  178. uebersetzen.
  179.  
  180.  
  181. Crack
  182. =====
  183.  
  184. Kommen wir nun zum eigentlichen Crack, der mit dem Ergebnis unserer Analyse 
  185. nun moeglich ist. Es gibt auch hier mehrere Moeglichkeiten, ich greife hier 
  186. nur eine heraus, die ich persoenlich fuer die Eleganteste halte.
  187.  
  188. Wenn "call 00419A00" also den CD-Check aufruft, liegt es nahe, das Programm 
  189. so zu patchen, dass dieser Check ueberhaupt nicht mehr erfolgt. Auf diese 
  190. Weise wird verhindert, dass "ueberfluessiger" Code ausgefuehrt und somit 
  191. Rechenzeit verschwendet wird. :-))
  192.  
  193. Wie wird man diesen Aufruf nun los? 
  194.  
  195. Die einfachste Loesung waere es, den Call durch No-Operation-Instruktionen 
  196. zu ersetzen, sogenannte NOPs. Ein NOP wird durch ein Byte mit dem Wert 90h 
  197. erzielt.
  198.  
  199. Betrachten wir noch einmal die betreffende Stelle im Programm:
  200.  
  201. :004116A4 E857830000              call 00419A00 
  202.  
  203. Im linken Bereich befinden sich neben der Adressangabe :004116A4 die Prozessor-
  204. anweisungen in der Form von hexadezimalen Opcodes, d.h. die einzelnen Bytes, 
  205. die die Befehle repraesentieren, naemlich E857830000, rechts ist die Bedeutung 
  206. der Instruktion gelistet (call 00419A00).
  207.  
  208. Da die vorliegende Instruktion (E857830000) 5 Bytes lang ist, muessen 
  209. auch 5 NOPs gesetzt werden, um den Call wegzupatchen, also muss E857830000  
  210. durch 9090909090 ersetzt werden, um den gewuenschten Effekt zu erzielen. 
  211. Der Crack funktioniert so zwar, jedoch sollte man mit der Verwendung 
  212. von NOPs sparsam umgehen, da manche clevere Protections solche Patches 
  213. foermlich "riechen". 
  214.  
  215. Zudem ist es Zufall, dass das Register EAX nach dem Weg-Noppen des Calls
  216. einen Wert enthaelt, der das Programm in den richtigen Ausfuehrungszweig
  217. springen laesst. Das Programm checkt ja immer noch den Rueckgabewert des
  218. Calls, auch wenn dieser selbst weggepatcht wurde.  
  219. Um das Ganze "clean" zu cracken, muesste beim NOP-Patch hier auch noch der 
  220. bedingte Sprung nach dem CD-Check-Call von 
  221.  
  222. :004116AB 7509                    jne 004116B6   <=== fuehre Programm aus,
  223.                                                       wenn CD-Check ok  
  224. auf
  225.  
  226. :004116AB EB09                    jmp 004116B6   <=== fuehre Programm unab- 
  227.                                                       haengig vom Ergebnis
  228.                                                       des CD-Checks aus                                    
  229.  
  230. umgebogen werden, so dass man folgenden Code erhaelt:
  231.  
  232. :004116A4 90                      nop 
  233. :004116A5 90                      nop
  234. :004116A6 90                      nop
  235. :004116A7 90                      nop
  236. :004116A8 90                      nop 
  237. :004116A9 85C0                    test eax, eax   
  238. :004116AB 7509                    jmp 004116B6   
  239.  
  240.  
  241. Das Alles kann man sich jedoch sparen, letztlich will das Programm doch nur
  242. im Register EAX den Wert 1 vorfinden, dann ist es gluecklich. Also tun wir 
  243. ihm den Gefallen. :-)
  244.  
  245. :004116A4 E857830000              call 00419A00     <=== hier manipulieren     
  246. :004116A9 85C0                    test eax, eax     
  247. :004116AB 7509                    jne 004116B6   
  248.   
  249.  
  250. Also aendern wir 
  251.  
  252. :004116A4 E857830000              call 00419A00     <=== Aufruf CD-Check
  253.  
  254. in 
  255.  
  256. :004116A4 B801000000              mov eax, 00000001 <=== positives Ergebnis des 
  257.                                                          Checks anstelle des 
  258.                                                          Checks :-)) 
  259.  
  260. Das Ganze ist also ein Drei-Byte-Patch (E8=>B8, 57=>01, 83=>00), und es ergibt
  261. sich folgender manipulierter Code:
  262.  
  263. :004116A4 B801000000              mov eax, 00000001 <=== bingo!
  264. :004116A9 85C0                    test eax, eax     <=== Resultat ist immer ok
  265. :004116AB 7509                    jne 004116B6      <=== erwuenschter Sprung 
  266.                                                          erfolgt immer
  267.  
  268.  
  269. Als letztes muessen wir nur noch den Offset in der Datei M1TP2.EXE ermitteln,
  270. an dem der Patch zu erfolgen hat.
  271.  
  272. Dazu wird in W32Dasm, der ja seit dem Erstellen des Listings friedlich im 
  273. Hintergrund schlummerte, das Menue "Goto -> Goto Code Location" benutzt. 
  274. Im daraufhin erscheinenden Eingabefenster ist die Programmadresse 004116A4 
  275. einzutragen. Nach Betaetigen des OK-Buttons kann man den Datei-Offset in 
  276. der Statuszeile von W32Dasm ablesen, in unserem Fall 10AA4h. Diesen Offset 
  277. bitte notieren, er wird spaeter benoetigt.
  278.  
  279. W32Dasm kann jetzt geschlossen werden, es wird nur noch der Hex-Editor 
  280. benoetigt, in diesem Beispiel HIEW.
  281.  
  282. HIEW ist ein sehr leistungsfaehiges Tool, das zunaechst etwas Konfiguration 
  283. erfordert.
  284.  
  285. (Nicht ungeduldig werden, wir haben's bald) <g> 
  286.  
  287. 1. Download von HIEW584.ZIP.
  288. 2. Entpacken in beliebiges Verzeichnis
  289. 3. Umbenennen von HIEW.DOS in HIEW.EXE
  290. 4. Editieren von HIEW.INI
  291.  
  292.    Die Eintraege fuer "StartMode" und "ShowOffset" in HIEW.INI sind wie 
  293.    folgt zu setzen und abzuspeichern:
  294.  
  295.    StartMode               = Code        
  296.    ShowOffset              = Global                    
  297.  
  298.  
  299. Nun muss M1TP2.EXE ins HIEW-Verzeichnis kopiert werden. HIEW wird dann mit
  300. "HIEW M1TP2.EXE" gestartet. Mit der Taste F5 kann man zu einem beliebigen
  301. Datei-Offset springen. In das blinkende Offset-Feld oben links wird dann der 
  302. von uns ermittelte Offset 10AA4 eingetragen und mit <ENTER> bestaetigt.
  303. Nun befinden wir uns an der interessanten Stelle und sehen den mittlerweile
  304. wohlbekannten CD-Check-Call vor uns.
  305. Mit F3 wechselt man in den Editor-Modus von HIEW. Nun einfach die zu aendernden
  306. Bytes eingeben: B8 01 00, mit F9 das Ganze abspeichern und HIEW beenden.
  307.  
  308. Die gepatchte M1TP2.EXE nun ins M1 Tank Platoon II-Verzeichnis kopieren 
  309. (Original ueberschreiben oder vorher umbenennen, wie's beliebt) ... fertig!
  310.  
  311. Herzlichen Glueckwunsch, dank dieses Tutorials ist M1 Tank Platoon II v1.2 
  312. nun gecrackt.
  313. War doch nicht schwer, oder? :-) 
  314.  
  315.  
  316. Watch out for more releases from Laxity - German Cracking Force!
  317.  
  318. VTeC [Laxity]