FaTmiKE Crackme #2 Tutorial
(c) by k3dT

1) Spustime crackme a zkoumame... zadame nejake jmeno a serial. Zkusime kliknout na"Register". Nic se nestane - zadna hlaska nevyskoci nebo tak neco :( No uvidime jak budeme postupovat. Loadneme crackme do Ollyho.

2) Mrkneme na stringy aplikace - Proto v hlavnim okne Ollyho vyvolame kontext menu a zvolime "Search For" => "All Referenced Text Strings". Vidime ze tu neni zadna hlaska ktere bysme se mohli chytit (napr. "Registered") proto na to musime jinak.

3) Budeme chtit najit hlavni proceduru okna pomoci ktere najdeme proceduru tlacitka Register. Stejne jako v bodu 1) vyvolame kontext menu jen zvolime "Search For" => "All Intermodular Calls". Seradime si nalezene API podle abeecedy - staci kliknout na "Destination" v zahlavi tabulky. Najdeme tento radek:

Nastavime na nem stistknutim F2 breakpoint.

4) Pustime nasi aplikaci stisknutim F9. Aplikace se zastavi na nasem breakpointu. Vidime toto:

Olly je tak sikovny ze nam rovnou hlavni proceduru okna ukaze. Zacina na adrese 00401450.

5) Skocime na adresu 401450. Pouzijte toto tlacitko, pote zadejte adresu:

Goto Adress in Dissassambler

zascrolujeme trosku niz vidime:

oznacena cast rozhoduje kam se skoci pri jakym stisknuti tlacitka. Dame Breapoint na radek 401497 stiskneme F9 pro spusteni programu - nyni uz se crackme normalne pusti. Zadame nejake jmeno a cislo (k3dT / 123456) a klikneme na tlacitko Register. Program se nam zastavi na nasem breakpointu. Stiskneme 1x F8 (krokovani) a dostaneme se do procedury tlacitka Register v kterem zrejme bude kontrola serioveho cisla:

Nastavime Breakpoint na adresu 4014F4 a predchozi 2 zrusime (ALT+B - zvolime postupne adresy 4013F5 a 401497 a pouzijeme Delete na klavesnici).

6) Pomalu trasujeme kod pomoci F8 az dorazime na adresu 401531. Vsimneme si ze v registru ECX mame pointer na nase seriove cislo!

Na radku 401543 se kontroluje delka naseho jmena. Vidime ze musi byt delsi nebo rovna 3h znakum (k3dT jsou 4 :)
Na radku 40154C se kontroluje delka naseho serioveho cisla. Vidime ze musi byt dlouha 13h znaku (to je 19 desitkove). Nase "123456" ma jen 6 znaku proto si na 40154C dame breakpoint (ten z 4014F4 muzeme zrusit) a spustime CME pres F9 a zadame jako serial cislo 1234567890123456789. Pote stiskneme tlacitko Register. nas program se "necekame" zastavi na nasi kontrole delky serialu. Nyni vidime ze 13=13 proto se neprovede JNZ a muzeme pokracovat dale.

7) Nyni tu mame klasicky pomlckovy "check":

Na adrese 401556 se do registru CL nacte ASCII hodnota 5. pozice serialu. Na adrese 40155C se do registru AL nacte ASCII hodnota pomlcky(!) tj 2Dh. Pote se kontroluje zda-li je na nasi pate pozici pomlcka... jelikoz nas serial je 1234567890123456789 tak tam neni :( Dame si breakpoint na adresu 40155E, zrusime predchozi a pustime aplikaci pres F9. Upravime serial na 1234-67890123456789 a opet zkusime stisknout Register. Nyni vidime ze kod uz nikam neskace ale pokracuje. Dale se kotroluji pozice 10 a 15 na pritomnost pomlcky :( Hodime si breakpoint na adresu 40157E, zrusime predchozi a pustime F9. Upravime serial na 1234-6789-1234-6789 a stistkneme Register. Kontrolu na pomlcky mame za sebou :P

8) Nyni uvidime ze uz se neco zacne pocitat:

Ted popisu oznaceny blok: Postupne se berou ASCII hodnoty znaku ze jmena a scitaji se. Na radku 40159E se vysledek vynasobi cislem DEADBEEFh. pro moje zadane jmeno k3dT je soucet znaku: 6B+33+64+54 roven 156h (to je 342d = desitkove). Vynasobenim tohoto cisla konstantou DEADBEEFh dostaneme vysledek 7C1D134Ah.

9) Ted vidime ze se bude neco kontrolovat:

Vidime volani SprintfA s operandem %X coz znamena prevod integeru na hexa retezec. Pote se na adrese 4015C5 do registru DL nacte cislo 37h coz je ASCII hodnota 1. znaku naseho hashe ktery jsme si spocitali v kroku 8). Na adrese 4015C8 se do AL nacte 32h coz je ASCII hodnota 2. znaku naseho zadaneho serialu! Upravime nas serial na 1734-6789-1234-6789 a pokracujeme dal az projedeme vsecky tyto kontroly. Pokud jste byli uspesni, vzniklo vam cislo
17C4-61D9-1134-64A9. Spocitany hash bude tedy vzdy uvnitr vsech 4 ctyrcisli. Napr kdyz hash bude 12345678 bude SN vypadat takto: 'x12x-x34x-x56x-x78x'.

10) Dale uz jen vidime API na deaktivaci oken... zkusime pustit a....

Tlacitko Register a editboxy zesedly... ze by jsme meli spravny klic? :D Zkusime tlacitko "GO" a dostaneme hlasku o tom ze tato funkce je dostupna pouze v registrovane verzi :( Tak pokracujeme...

11) Zrejme bude jeste nejaky chceck pri stisknuti tlacitka GO!.. dame si tedy breakpoint na adresu 401497 (viz bod 5) a stiskneme tlacitko GO! stikneme trasovani - F8 a dostaneme se na adresu 4014E3 kde si dame breakpoint a predchozi zrusime.

12) Zkusime prejet breakpoint na nasi adrese 4014E3 pres F8 a bum. Aplikace nam vyhodi messagebox ktery uz jsme jednou videli. Proto vlezeme do CALLU na adrese 4014E3 pomoci F7 a mrkneme co je v nem.

13) Uhm... dynamicky CALL na adrese 4018E9 :) Mrkneme co je vevnitr... vidime cyklus dlouhy 0Bh kroku ktery neco XORuje (pozn. pouziva se mimo jine pro primitivni sifrovani). Zajimaveee :) Flakneme breakpoint na adresu 401106 a pustime program F9. jakmile se zastavi, mrkneme co to desifrovalo. Na radku 4010FB vidime kam se to ukladalo... adresy 40920B az (40920B+0B) tedy obsahuji XORovana data. prepneme si na dolni leve okno, vyvolame kontext menu a zvolime Goto -> Expression. Tam napiseme 40920B a potvrdime. Copak to nevidime? :) Desifroval se nam retezec "Information" ktery je jak jste si urcite vsimli caption messageboxu.

Zrusime breakpoint a vratime se na misto odkud jsme prisli do procedury pomoci F8. Dame si breapoint na adresu 4018E9. Vidime dalsi dynamicky CALL :] Ze by dalsi desifrovani? Mkrneme do nej...

14) Vidime podobnou deXORovaci rutinu jako v bode 13).. Koukneme co z ni vyleze:

Nase znama hlaska :p Uz vime kde se bere a proc se neukazala na zacatku naseho crackovani - vsechny hlasky byly zasifrovane aby sme to meli tezsi. Vratime se z podprocedury zpet pres F8.

15) Dal uz jen vidime volani MessageBoxu :( Tudy cesta nevede bohuzel... nekde bude jeste jeden check :P Jak vas urcite napadlo, budou existovat 2 rutiny tlacitka GO! - spravna a tato nespravna. A tipuju ze dodatecna kontrola serioveho cisla se bude provadej jen 1x po uspesnem zadani serialu tlacitkem Register. Zkusime tedy dat breakpoint na nasi znamou adresu 401497 (tam se rozhoduje kam se bude skakat) a restartovat aplikaci pres ALT+F2. Zadame znovu nick k3dT a serial 17C4-61D9-1134-64A9. Stikneme Register a hned pote GO!. A co to nevidime ? :) Sem nam to neskakalo...

Dej boze ze uvnitr bude jeste nejaka kontrola...

16) Dame si BP na adresu 4014E3 ostatni zrusime. Hned se podivame do toho CALLu. Hmm prvni blok:

Na konci oznaceneho bloku mame v ECX hodnotu 31343639 coz je slozenina ASCII kodu cisel 1 4 6 a 9. To jsou casti naseho serialu! 17C4-61D9-1134-64A9!!

Druhy blok:

Na konci oznaceneho druheho bloku mame v ECX take hodnotu 31343639 (coz je slozenina ASCII kodu cisel 1 4 6 a 9) bohuzel jsem spatne na zacatku zvolil testovaci SN :( To je 17C4-61D9-1134-64A9. Budeme si pamatovat tedy CAST A: 1469 a CAST B: 1469 :P Ted nejspise bude nasledovat check techto cisel :]

 

17) Dame si BP na adresu 401367 ostatni zrusime. Vlezeme do CALLu. OMG! Nejaky sileny XORovani :D Pekne napreskacku po jednotlivych cislech nasich 2 casti. Vyskocime z tehle procedury a misto toho vlezeme do CALLu volajici 401770:

Vidime ze se vysledky XORu 2 nasich hodnot CASTI A a CASTI B kontroluji s konstantami. No takze najit spravny chybejici cisla je sranda :) Restartneme Ollyho NEPOUSTIME crackme jen precteme data z adres 401776 = 4B4C2CA4h a 401786 = 5EC398ABh.Nyni staci jen preXORovat konstanty 97BE8h a 0D8VD1FFh temito hodnotami a precist z nich znaky.

18) 4B4C2CA4h XOR 97BE8h = 4B 45 57 4C = K E W L
5EC398ABh XOR 0D8BD1FFh = 53 48 49 54 = S H I T

=> seriove cislo dostane tento tvar KxxE-WxxL-SxxH-IxxT (xx jsou hashe jmena) to je v nasem pripade K7CE-W1DL-S13H-I4AT. Vypneme Ollyho, pustime cme zadame jako jmeno k3dT jako serial K7CE-W1DL-S13H-I4AT klikneme na 'Register', pote na 'GO!' a vychutname si pocit vitezstvi :D Doufam ze vas tohle crackme trosku pobavilo :) Bylo hodne jednoduche i tak se mi moc libilo :)

Kontakt : k3nny@seznam.cz | http://www.reborn.cz |