Cracking4neWBies - Lekce č.9

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: DjH
Datum: 19.8.2007
Hodnocení/Hlasovalo: 3.04/24

Cracking pro začátečníky...podevété :-)

Cracking4neWBies

Lekce č.9

Crackneme si hru…





Promiňte mi to, že teď píšu až moc za sebe, ale víceméně, jedná se jen o MOJE :-) lekce o crackingu. Tak budu hodně mluvit za sebe.
Jako každej moderní puberťáckej kluk chodím do baru. Chodím tam většinou v pátek, a chodím do klubu, který se nazývá „9“ –devítka-. Je tam hodně kulečníkových stolů, a celkově je to vlasně kulečníkový klub. A náhodou jsem zaštrachal mezi svými CD od PCWorldu a co nevidím: 3D Live Pool… Říkám si „bezva, konečně nějaký 3D kulec“… Přečtu si informace a co nevidím: trial 30. Říkám si OMG, proč ne, třeba to cracknu.
V té chvíli jsem to bral spíše z legrace… Hra nainstalovaná a co nevidím…žádný trial 30, ale Times Run 10! Neboli hru spustíte 10krát a dost. Když jsem si hru otevřel v PEiD, uviděl jsem, že kulec je kódovaný ve Visual C++ 6. Podíval jsem se na Crypto analyser, a vidím nějaké Zlib, ADLER32…a nějaká sena, nerozumim tomu vela :-)
Když jsem se na to podíval v Resource Hackeru, a našel jsem si v Dialogs onko, které mi říká, že x Runs zbývá, už jsem si myslel že mám vyhráno, ale opak byl pravdou. Program jsem si nátáhl do Olly, a hledám string „times“…nic se nenašlo. Asi půl hodiny jsem ten kulec hrál, a až mě to přestalo bavit, řekl jsem si, že risk je zisk. Spustil jsem tedy program už jen 7x. Nyní po startu program nenaběhne, jen se oběví okno, že 0 runs zbývá a tlačítko quit. Hru byste měli najít i zde v balíčku (i s crackem a zdrojákama).
Používám svůj styl crackování, možná ho používá hodně crackerů, co já vím, já žádného pořádného neznám, ale já mému stylu říkám „Lame Call’o’trasing“ :-)
Jedná se o to, že v programu je hodně callů. Já zkusím je nejdříve přeskočit (F8), a když udělají práci, kterou já chci vystopovat, program restartuju (nebo třeba stisku tlačítko Registrovat…záleží na situaci…). Ještě předtím nastavím na ten call BreakPoint. Vykonám opět svou práci a když se zastaví Dbg na callu, na který jsem dal BP, tak ho vytrasuju (F7). Je možné že v i „v“ tomto callu, budou další cally, které budeme muset trasovat, a které ne. Uvedu grafický příklad:

1.Call
2.Call
----Call
----Call
--------Call
------------Operace//zde je operace, kterou hledáme
--------Call
3.Call


Přitom 1, 2 a 3 jsou po sobě jdoucí cally (když přeskočíme [F8] call č.2 vykoná se vlastně celá operace…) Jestli pořád nechápete, vysvětlím to na tomto příkladu, kde si hru crackneme.

Hru natáhněte do Olly, až vám bude „zbývat“ 0 spuštění!!!
Tak, teď ji jen tak nanečisto spusťe, a ihned se vám objeví okno, že spuštění už jsou vyčerpané, a po kliknutí na quit hru ukončíte.
Takže natáhneme hru do Olly… a nespouštíme F9!! Jako první akci uděláme krok, tedy F8, hru nebudeme spouštět, celou ji vykrokujeme. Krokujeme až k prvnímu CALLu na adrese 0044BBDE…nic, okno nám nevyskočilo… Takto krokujem, dokud okno nevyskočí… Je to CALL na adrese 0044BC81. Když tento CALL přeskočíme [F8], Objeví se okno. Ale my chceme zjistit kde. Nastavíme tedy na tento call BP a restartujeme aplikaci [Ctrl+F2]
Stiskneme tentokrát [F9] a Dbg se zastaví na našem zadaném BP. Ten my vytrasujeme [F7]. Opět jen trasujeme a nic nespouštíme… Objevíme se zde:
00412C80 /$ 8B4424 04 MOV EAX, DWORD PTR SS:[ESP+4] ; 3D_Live_.00400000
00412C84 |. B9 60CA4600 MOV ECX, 3D_Live_.0046CA60
00412C89 |. 50 PUSH EAX ; /Arg1
00412C8A |. E8 71E4FEFF CALL 3D_Live_.00401100 ; \3D_Live_.00401100
00412C8F |. 85C0 TEST EAX, EAX
00412C91 |. 7D 05 JGE SHORT 3D_Live_.00412C98
00412C93 |. 33C0 XOR EAX, EAX
00412C95 |. C2 1000 RETN 10
00412C98 |> B9 60CA4600 MOV ECX, 3D_Live_.0046CA60
00412C9D |. E8 CE04FFFF CALL 3D_Live_.00403170
00412CA2 \. C2 1000 RETN 10


Můžeme si všimnout jedné věci. Před námi jsou dva CALLy a na konci je RETN (RETURN, vrátí se k tomu CALLu, od kterého „přilétl“). To znamená, že jeden z těchto dvou Callů to musí být (protože za RETN bysme se nedostali…). Krokujeme [F8]ičkou, a zjistíme, že je to hned první call, který volá naše otracné okno. Nastavíme tedy na něj BP a aplikaci opět restartujeme. Stiskneme dvakrát [F9] (nejprve se zastaví na prvním BP a potom na druhém), a trasujeme tento call [F7]. Opět potom krokujeme pomocí [F8] dokud se nezobrazí okno. Na nic se nedívejte, na žádné EAX, EBX, to hoďte za hlavu, prostě klikejte na [F8] dokud se nezobrazí to otravné okno… Dokrokovali jsme nyní na CALL na adrese 004012B6. Nastavíme opět BP, restartujeme aplikaci a 3x stiskneme [F9] a pak [F7] (snad nemusím vysvětlovat proč). Opět krokujeme [F8] dokud se nezobrazí okno. A jsme tu! Dostali jsme se sem:
0040223D |. 85C0 TEST EAX, EAX
.0040223F |. 74 31 JE SHORT 3D_Live_.00402272 //jestl je ZF=1
tak skoč na 00402272

.00402241 |. 8B86 E8A40200 MOV EAX, DWORD PTR DS:[ESI+2A4E8]
.00402247 |. 8B96 F0A40200 MOV EDX, DWORD PTR DS:[ESI+2A4F0]
.0040224D |. 8B8E E4A40200 MOV ECX, DWORD PTR DS:[ESI+2A4E4]
.00402253 |. 2BD0 SUB EDX, EAX
.00402255 |. 6A 40 PUSH 40 ; /Flags = SWP_SHOWWINDOW //zde se volá nějaké okno…
.00402257 |. 52 PUSH EDX ; |Height
.00402258 |. 8B96 ECA40200 MOV EDX, DWORD PTR DS:[ESI+2A4EC] ; |
.0040225E |. 2BD1 SUB EDX, ECX ; |
.00402260 |. 52 PUSH EDX ; |Width
.00402261 |. 50 PUSH EAX ; |Y
.00402262 |. 8B86 D8A30200 MOV EAX, DWORD PTR DS:[ESI+2A3D8] ; |
.00402268 |. 51 PUSH ECX ; |X
.00402269 |. 6A FE PUSH -2 ; |InsertAfter = HWND_NOTOPMOST
.0040226B |. 50 PUSH EAX ; |hWnd
.0040226C |. FF15 0C824500 CALL NEAR DWORD PTR DS:[<&USER32.SetW>; \SetWindowPos
.00402272 |> 8B86 E4A30200 MOV EAX, DWORD PTR DS:[ESI+2A3E4]
Na adrese 0040226C se vám potom otevře okno. Ovšem aby na tuto adresu program nešel, stačí aby na adrese 0040223F by byl ZF=1. Toho docílíme tak, že přehodíme instrukci JE za JNZ. Skusíme si to patchnout a uložit do executable. A hle! Hra naběhne v pohodě!! Při výrobě patchu v C++ musíme dbát na to, aby před aplikací patchu bylo počet zbývajících runs, nula. Jinak by třeba při zbývajících 7 runs program nenaběhl. Patch bude vypadat asi takto (c++ source):
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "Form1.h"
{
FILE *f;


int adr=0x1400B; //offset
int owr=0x74; //hex

f = fopen( "3D Live Pool.exe" , "rb+");
if (f==NULL) { MessageBox::Show( "File can not be found!", "Error", MessageBoxButtons::OK, MessageBoxIcon::Exclamation );
exit(1);
}


fseek(f,adr,SEEK_SET);


fwrite(&owr,1,1,f);
MessageBox::Show( "Cracked :-)", "Cracked...:-)" ,MessageBoxButtons::OK, MessageBoxIcon::Exclamation );
fclose(f);
}





Ještě malé upozornění:
Když programujete ve Visual C++, musí být v includes „stdafx.h“. Třeba Dev-C++ vám nahlásí, že tento soubor nemá v includes. To platí pro všechny Source v C++ zde uveřejněné. Já jsem si crack upravil tak, aby v Title programu zobrazoval místo „3D Live Pool v2.21 – Unregistered“ toto: „3D Live Pool v2.21-Cracked by DjH“ :-). Source i hra jsou přiložené.
Crack odzkoušený, běžíí!
P.S.:Setup hry zabírá pouze 1.46 MB, ale to neznamená, že hra není dobrá! Hra je vynikající, až někdy na tu fyziku…doporučuju ji všem milovníkům klulecu :-) (malá, neplacená reklama :-D )

Autor cracklý program dále nebude používat, a nenese zodpovědnost za zneužití tohoto článku!!! Toto byla jen demostrace cracknutí "opravdové hry" :-)

Na závěr…
Just Enjoy!! :-D