Cracking Tuturial #2 by WKz_Daedalus

Hier is noch ein Tuturial fr alle blutigen Beginner...

Was soll diesmal dran glauben ?

Ich habe mich fr Seven Kingdoms entschieden, weil es auch einen sehr einfachen Copylock hat

Brauchen wir neue Tools ?

Nein, wir brauchen wieder nur Windasm, Hiew und nen Rechner.


Let'z go 

Installiere 7K in der Singleplayer-Installation.
So mut du zwar auf Sound verzichtent, brauchst aber auch blo 40MB Speicher auf der Platte.
Jetzt starte mal 7K ohne CD und was siehst du?
Die Option fr Singleplayer ist einfach abgedunkelt. Schweinerei !
Lade 7K mit Windasm. 
Nach der Fehlermeldung brauchen wir diesmal natrlich nicht suchen.
Klick stattdessen auf den Button mit "Imp Fn" drauf.
Imported Functions sind sogennante Apis, Funktionen die vom Betriebssystem berreit gestellt werden.
Wir suchen die Function "GetDriveTypeA" in der Kernel32.
GetDriveTypeA gibt die Art eines Laufwerks zurck, z.B. ob man von der Platte oder einer CD startet.
Nachdem du den Api gefunden hast msstest du das hier sehen :

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00484F81(U)
|
:00484F2A FE45F8                  inc [ebp-08]	<-----------------------------------------------------------------------|	
															|
* Referenced by a (U)nconditional or (C)onditional Jump at Address:		  ' Dieser Teil der Routine		|						
|:00484F25(U)									  ' sorgt dafr dass das		|
|										  ' nchste Laufwerk gecheckt wird	|
:00484F2D 33C0                    xor eax, eax										|
:00484F2F 8A45F8                  mov al, byte ptr [ebp-08]								|
:00484F32 83F85A                  cmp eax, 0000005A									|
:00484F35 0F8D4B000000            jnl 00484F86										|
:00484F3B 8A45F8                  mov al, byte ptr [ebp-08]								|
:00484F3E A248335600              mov byte ptr [00563348], al								|
:00484F43 8A45F8                  mov al, byte ptr [ebp-08]								|
:00484F46 8845FC                  mov byte ptr [ebp-04], al								|
:00484F49 8D45FC                  lea eax, dword ptr [ebp-04]								|
:00484F4C 50                      push eax										|
															|
* Reference To: KERNEL32.GetDriveTypeA, Ord:00CEh				' berprft ob Laufwerk	ein		|
                                  |						' CD-Drive ist				|
:00484F4D FF152C835800            Call dword ptr [0058832C]								|
:00484F53 83F805                  cmp eax, 00000005				' 00000005 = CDROM		        |
:00484F56 0F8525000000            jne 00484F81	>-------------------------------|					|
										|					|
* Possible StringData Ref from Data Obj ->"D:\7K.EXE"				|					|
                                  |						|					|
:00484F5C 6848335600              push 00563348					|					|
:00484F61 B9A8CE5600              mov ecx, 0056CEA8				|					|
:00484F66 E804FB0000              call 00494A6F					| 'callt ein Sub-Prog 			|
:00484F6B 85C0                    test eax, eax					| 'Checkt ob D:\7K.exe da ist		|
:00484F6D 0F840E000000            je 00484F81	>-------------------------------|					|
:00484F73 8A45F8                  mov al, byte ptr [ebp-08]			|					|
:00484F76 8B4DF4                  mov ecx, dword ptr [ebp-0C]			|					|
:00484F79 884159                  mov byte ptr [ecx+59], al			|					|
:00484F7C E905000000              jmp 00484F86 >-----------------|		| ' jump aus der Routine raus		|
								 |		|					|
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:		|					|
|:00484F56(C), :00484F6D(C)					 |		|					|
|								 |		|					|
:00484F81 E9A4FFFFFF              jmp 00484F2A	<-------------------------------| ' jumpt zum beginn der Routine zurck |
								 |
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00484F35(C), :00484F7C(U)					 |
|								 |
:00484F86 E900000000              jmp 00484F8B  <----------------|

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00484F86(U)
|
:00484F8B 5F                      pop edi

Hier meine Erklrung :

Mit GetDriveTypeA wird gecheckt ob das aktueller Laufwerk ein CD-Drive ist.
Wenn es keines ist, jumpt der Prog ber einen Umweg, der uns nur irritieren soll zum Beginn der Routine.
Wenn der Drive ein CD-Drive ist geht es weiter zum nchsten Test.
Bei 484F66 wird folgender Sub-Prog gecallt :

* Referenced by a CALL at Addresses:
|:00417B6F   , :00417B8D   , :0046F72F   , :0047EBCF   , :004820A3   		' sehr hufig benutzte Sub
|:004820BA   , :00482142   , :00482159   , :00484A35   , :00484E77   
|:00484F66   , :00487B4F   , :0048BBE1   , :0049BF88   , :004A1423   
|:004A379E   , :004A3811   , :004A7CC1   , :004A7D8B   , :004B53B6   
|:004B53FF   , :004B58D4   , :004ED53A   , :00532CCE   
|
:00494A6F 55                      push ebp
:00494A70 8BEC                    mov ebp, esp
:00494A72 81EC48010000            sub esp, 00000148
:00494A78 53                      push ebx
:00494A79 56                      push esi
:00494A7A 57                      push edi
:00494A7B 898DB8FEFFFF            mov dword ptr [ebp+FFFFFEB8], ecx
:00494A81 8D85C0FEFFFF            lea eax, dword ptr [ebp+FFFFFEC0]
:00494A87 50                      push eax
:00494A88 8B4508                  mov eax, dword ptr [ebp+08]
:00494A8B 50                      push eax

* Reference To: KERNEL32.FindFirstFileA, Ord:0079h				'Api der feststellt welche Datei die erste
                                  |						'im Verzeichnis ist; normalerweise 7K.Exe
:00494A8C FF1580835800            Call dword ptr [00588380]
:00494A92 8985BCFEFFFF            mov dword ptr [ebp+FFFFFEBC], eax
:00494A98 83BDBCFEFFFFFF          cmp dword ptr [ebp+FFFFFEBC], FFFFFFFF
:00494A9F 0F840A000000            je 00494AAF >---------------------------------| 
:00494AA5 B801000000              mov eax, 00000001			   	|	
:00494AAA E902000000              jmp 00494AB1 >------------------------|       | 'berspringt Vernderung
									|	|
* Referenced by a (U)nconditional or (C)onditional Jump at Address:	|	|
|:00494A9F(C)								|	|
|									|	|
:00494AAF 33C0                    xor eax, eax <--------------------------------| 'verndert eax fr Vergleichsoperation						
									|
* Referenced by a (U)nconditional or (C)onditional Jump at Address:	|
|:00494AAA(U)								|
|									|
:00494AB1 E900000000              jmp 00494AB6 <------------------------|				

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00494AB1(U)
|
:00494AB6 5F                      pop edi
:00494AB7 5E                      pop esi
:00494AB8 5B                      pop ebx
:00494AB9 C9                      leave
:00494ABA C20400                  ret 0004	' Hier kehrt das Prog wieder zum normalen Code zurck

In diesen Fall knnen wir aber an dieser Stelle nichts ndern, da diese Sub sehr oft gecallt wird.
Kehren wir nun also zu unseren richtigen Code zurck. 
Der von der Sub genderte Wert wird nun mit einen anderen verglichen.
Wenn beide gleich sind, jumpt er wieder zum Beginn der Routine.
Wenn keiner der beiden Jumps ausgefhrt wird, kommem wir zu zu den Jump bei 494AAA, der zum Spielstart fhrt.
Wir mssen also diesen Jump erreichen.
Dies tuen wir indem wir die beiden anderen Jumps einfach killen !
Zuerst brauchen wir die Offsets : 84356 und 8436D.
Gut jetzt ffne die Exe in Hiew und Nope die Beiden Jumps aus.
Das Heisst berschreibe die beide Jump-Befehle komplett mit 90.
Achtung : 
wenn du dies hattest...
	0F840E000000            
	8A45F8      
...muss dass rauskommen :     
	909090909090
	8A45F8
In Assembler rutschen manchmal die Zeile durcheinander, wenn du eine vernderst !

So das war's...

2 Tuturialz an einen Tag... Not Bad !!!        

		WKz_Daedalus@gmx.net
		www.geocities.com/winkillerz

Greetz :
		Alle WKz Memberz ( vorallen matrix )
		r!sc
		Black Check
		sn00pee
		gonzo 
		xcrk
		Laxity
		Duellist



  
