Copy Link
Add to Bookmark
Report

2x09 Full Reverse (Target VCT #3)

eZine's profile picture
Published in 
phearless
 · 10 months ago

                     [ Target: VCT #3 ] 

pH#2 .............F.u.l.l..R.e.v.e.r.s.e............. [ #Sadrzaj ]
0x01 ................................................ [ Intro ]
0x02 ................................................ [ Tools of trade ]
0x03 ................................................ [ Unpacking ]
0x04 ................................................ [ Patching ]
0x05 ................................................ [ Fishing ]
0x06 ................................................ [ Keygening I ]
0x07 ................................................ [ Keygening II ]
0x08 ................................................ [ Outro & Greetz ]


--[ 0x01 ]----------------------------------------------[ Intro ]

Kao sto vec sigurno znate ovo je drugo izdanje eZina pH. U ovom, ali i u
svakom sledecem, izdanju eZina vas ocekuje rubrika koja se bavi reversnim
inzinjeringom. Za metu ovog drugog izdanja eZina sam izabrao jednu metu
od koje sam svojevremeno totalno izludeo! Naime meta koju cemo mi
reversovati VCT-CrackMe #3 koju je napravio hacnho koristi veoma podao
trik iskljucenja Task Managera. Ono sto ce vam se desiti odmah prilikom
starta same mete je automatsko i trajno iskljucenje Task Managera, tako
da kada pritisnete vasu a i moju omiljenu kombinaciju tastera CTRL + ALT
+ DEL na ekranu ce se samo pojaviti obavestenje da je Tasm Manager
iskljucen. Naravno sada shvatate da ovo moze da iznervira bilo koga!

--[ 0x02 ]---------------------------------------------[ Tools of trade ]

Da bi smo "popravili" ovaj crackme, trebace nam neki "vaspitni" alati:

[+] OllyDBG v.1.10 .................................. http://www.wasm.ru
[+] LordPE Delux .................................... http://www.wasm.ru
[+] ImpRec v.1.6 .................................... http://www.wasm.ru
[+] PeID v0.93 ...................................... http://www.wasm.ru
[+] ResHacker 3.4.0 ................................. http://www.wasm.ru

i naravno meta:

[+] VCT #3 .......................................... my.target3.zip

Svi ovi alati su neophodni svakom reverseru pa predlazem da ako ih vec
nemate, podhitno ih nabavite! Bez njih se dalje citanje ovog teksta ne
isplati!

--[ 0x03 ]---------------------------------------------[ Unpacking ]

Ok predpostavljam da ste do sada sigurno startovali nasu metu, cime ste
sebi (ako radite na NT sistemima) iskljucili Task Manager. Posto nam se
ovaj postupak programa ne svidja ni najmanje pokusacemo da otvorimo metu
pomocu Ollya. Ali ce se nas Olly pobuniti prilikom ovoga govoreci nam da
meta koju pokusavamo da otvorimo ima izmenjen entery point i da je meta
najverovatnije SFX tipa. Posto je meta ocigledno zapakovana/zasticena
nekim pakerom iskoristicemo PeID da identifikujemo kojim je pakerom je
zasticena nasa meta. Posle skeniranja PeIDom videli smo da je meta
zasticena pakerom koji svi sigurno dobro poznajete ASPack 2.12 -> Alexey
Solodovnikov. Postoji vise nacina odpakivanja ovog pakera...

--= Nacin 1 =------------------------------------------[ Unpacking ]

Nasu metu mozemo odpakovati pomocu PeIDovog plug-ina Generinc unpacker.
Ovo je ujedno i najlaksi nacin za odpakivanje ASPacka. Posle klika na
dugme -> PeID ce pronaci OEP mete, koji se nalazi na adresi 00493020, a
posle klika na dugme Unpack, PeID ce odpakovati metu i popraviti importe.

--= Nacin 2 =------------------------------------------[ Unpacking ]

Nasu metu mozemo odpakovati pomocu y0dinog programa ASPackDie. Ovaj
program je takodje genericki unpacker za sve 2.x verzije ASPacka. Ovaj
program se moze preuzeti sa adrese http://y0da.cjb.net i veoma je
jednostavan za koriscenje.

--= Nacin 3 =------------------------------------------[ Unpacking ]

Mozda najtezi i najduzi ali definitivno i najbolji nacin za odpakivanje
pakovanih aplikacija je rucni nacin. Za ovo cemo otvoriti metu pomocu
Ollya. Na samom OEPu pakovane metevidecemo sledece:

004AF001 > 60 PUSHAD
004AF002 E8 03000000 CALL vct_crac.004AF00A
004AF007 - E9 EB045D45 JMP 45A7F4F7

Posto je ovo ocigledno deo koda koji pripada pakeru pritisnucemo jednom
dugme F8 posle cega cemo se naci na sledecoj ASM komandi, to jest na
sledecem CALLu. Ako pogledate registe videcete da se ESP registar
promenio:

EAX 00000000
ECX 0012FFB0
EDX 7FFE0304
EBX 7FFDF000
ESP 0012FFA4 <- Crven
EBP 0012FFF0
ESI 00560718
EDI 77F5164E ntdll.77F5164E
EIP 004AF002 vct_crac.004AF002

Selektovacemo ovaj registar i kliknucemo desnim dugmetom na njega posle
cega cemo izabrati opciju Follow in Dump. Ovo ce nas odvesti na sledece
mesto u Hex dumpu:

0012FFA4 4E 16 F5 77 18 07 56 00 N..w..V.
0012FFAC F0 FF 12 00 C4 FF 12 00 ........
0012FFB4 00 F0 FD 7F 04 03 FE 7F ........
0012FFBC B0 FF 12 00 00 00 00 00 ........

Ovde cemo postaviti jedan memoriski break-point na prva cetiti bajta, to
jest na 4E,16,F5,77. Nji cemo selektovati i desnim klikom cemo izabrati
sledecu opciju: Breakpoint -> Hardware, on access -> Dword. Posle
postavljanja ovog break-pointa ostaje nam da kliknemo na F9, posle cega
cemo se naci ovde:

004AF3B0 /75 08 JNZ SHORT vct_crac.004AF3BA
004AF3B2 |B8 01000000 MOV EAX,1
004AF3B7 |C2 0C00 RET 0C
004AF3BA \68 20304900 PUSH vct_crac.00493020
004AF3BF C3 RET

Sada nam ostaje samo da 3x pritisnemo F8, to jest da izvrsimo sve
komande od, ukljucujuci i, RET komandu. Posle ovoga cemo se naci na
pravom OEPu zapakovane mete:

00493020 55 DB 55 ; CHAR 'U'
00493021 8B DB 8B
00493022 EC DB EC
00493023 83 DB 83

Ali da li je ovo OEP? Naravno da jeste, Olly samo nije stigao da
analizira kod. Ali posle klika na CTRL + A, Olly ce analizirati kod i
onaj ne citljivi kod ce postati ovo:

00493020 55 PUSH EBP
00493021 8BEC MOV EBP,ESP
00493023 83C4 F0 ADD ESP,-10
00493026 B8 602D4900 MOV EAX,vct_crac.00492D60
0049302B E8 9833F7FF CALL vct_crac.004063C8
00493030 A1 28544900 MOV EAX,DWORD PTR DS:[495428]
00493035 8B00 MOV EAX,DWORD PTR DS:[EAX]

Dakle ovo je mesto gde cemo uraditi dump pomocu LordPEa i popravku
importa pomocu ImpReca. Zapamtite samo da je adresa pravog OEPa jednaka
00493020 - 00400000 = 93020, to jest RVA - ImageBase = OEP.
Posle uspesnog odpakivanja mozete odpakovani fajl ponovo skenirati sa
PeIDom i videcete da je odpakovana meta kompajlovana sa Delphiem.

--[ 0x04 ]---------------------------------------------[ Patching ]

Pravila koja je pred nas stavio ovaj crackme se mogu videti klikom na
Help -> Rules:

Part 1: Analyze the algorithm (write a small turtorial) and make a keygen
for generate this serial.
Part 2: Just make a keygen for generate Unlock Code for every Hardware ID.
Part 3: Patch for enable TaskManger Button.
Part 4: Patch for this crackme cannot import key into Registry.

Posto nas trenutno interesuje kako da vratimo kontrolu nad nasim Task
Managerom prvo cemo uraditi korake 3 i 4, posle cega cemo se vratiti na
pravljenje keygeneratora.

--= Pathovanje dela 3 =--------------------------------[ Patching ]

Kao i sve stvari vezane za RCE i ova se moze uraditi na vise nacina.

--= Pathovanje dela 3 / Nacin 1 =----------------------[ Patching ]

Prvi nacin je ujedno i najlaksi. Ako zelite da ukljucite neko dugme bez
obizira na to da li je meta kompajlovana pomocu VC++, MASMA ili Delphia
najbolje je da koristite program po imenu ResHacker. Kada otvorite Delphi
metu pomocu ovog programa sve forme koje se nalaze u njoj cete naci pod
granom ./RCDATA. U ovoj grani ce se nalaziti podgrane sa imenima formova
koji se pojavljuju, to jest koriste. Jedini ovakav form u ovoj meti je
TFORM1. Dakle zakljucicemo da se u njemu nalazi dugme koje treba da
ukljucimo. Ako kliknemo na ./RCDATA/TFORM1/0 videcemo neki resource
listing. U tom listingu cemo potraziti string Enabled = False jer je nase
dugme inicajlno iskljuceno. Taj string cemo naci ovde:

object Button1: TButton
Left = 72
Top = 272
Width = 145
Height = 33
Caption = 'Enable TaskManager'
Enabled = False
TabOrder = 4
OnClick = Button1Click
end

Da bi smo ovo dugme ukljucili potrebno je da izmenimo string False u
True, posle cega je pre pritiska na File -> Save potrebno pritisnuti
dugme compile script. Kada snimite fajl ResHacker ce snimiti novi fajl a
stari ce backupovati sa postfixom _original.exe. Nama je bitno ovo
backupovanje jer kao sto cete videti sam ResHacker nece uspeti da ukljuci
dugme, to jest posle snimanja originalni fajl se nece moci startovati!
Toliko o ResHackeru, izgleda da cemo njega koristiti neki drugi put... Ne
ocajavajte jos, znamo mi jos po koji trik!

--= Pathovanje dela 3 / Nacin 2 =----------------------[ Patching ]

Posto prvi nacin nije uspeo ovaj put, moracemo da patchovanje uradimo
pomocu Ollya. Ovo i nije nesto preterano tezak nacin, naravno ako znate
osnove Delphi resursa. Dakle otvoricemo nasu metu pomocu Olly i
otvoricemo prozor Executable modules (ALT+E) posle cega cemo izabrati
nasu metu, to jest glavni .exe fajl koji se u mom slucaju zove
dumped_.exe. Kada izaberete ovaj fajl desnim klikom na njega izaberite
opciju View all resources... posle cega u listi koja ce se pojaviti treba
izabrati TFORM1 i desnim klikom na njega pogledati njegov sadrzaj klikom
na opciju Dump. Posle ovoga klikom na dugme CTRL + L otvoricemo search
prozor u cijem ASCII delu cemo uneti ime dugmeta koje smo odlucili da
ukljucimo. Ovo smo saznali iz ResHackera, tako da cemo kao string uneti
Button1. Posle klika na OK zavrsicemo ovde:

004AE0AF 42 75 74 74 6F 6E 31 04 4C 65 66 74 02 48 03 54 Button1.Left.H.T
004AE0BF 6F 70 03 10 01 05 57 69 64 74 68 03 91 00 06 48 op....Width....H
004AE0CF 65 69 67 68 74 02 21 07 43 61 70 74 69 6F 6E 06 eight.!.Caption.
004AE0DF 12 45 6E 61 62 6C 65 20 54 61 73 6B 4D 61 6E 61 .Enable TaskMana
004AE0EF 67 65 72 07 45 6E 61 62 6C 65 64 08 08 54 61 62 ger.Enabled..Tab

Posto znamo da nam je bitan samo Enabled parametar pogledacemo njega i
prvi bajt koji se nalazi iza stringa Enabled. Ovaj bajt je 0x08. Ovo nam
je jako bitno jer u Delphi resursima 0x08 znaci False a 0x09 znaci True.
Dakle izabracemo taj bajt, kliknucemo desnim dugmetom na njega i
izabracemo Binary -> Edit (CTRL+E). Iz ovog novog prozora cemo saznati
adresu na kojoj se nalazi ovaj 0x08 bajt. Ta adresa se moze procitati iz
naziva prozora i iznosi 004AE0FA. Posle ovoga se mozemo vratiti u CPU
prozor (ALT+C) da bi smo konacno izvrsili patchovanje.
Kada se nadjemo ponovo u CPU prozoru oticicemo na adresu koju treba da
patcujemo klikom na CTRL+G ce se otvoriti novi prozor u koji cemo uneti
adresu na koju zelimo da odemo, unecemo 004AE0FA. Kada se nadjemo na toj
adresi pritisnucemo CTRL+E i izmenicemo prvi 0x08 bajt u 0x09. Kada i ovo
uradimo selektovacemo izmenjeni kod i pritiskom na desno dugme cemo
izabrati Copy to executable -> Section -> desno dugme u novom prozoru ->
Save file... Na novo snimljenom fajlu cemo dalje vrsiti reversing...

--= Pathovanje dela 4 =--------------------------------[ Patching ]

Posto smo uspesno patchovali program tako da mu dugme Enable Task
Manager bude uvek ukljuceno, sada cemo patchovati program tako da nikada
ne ubaci kljuc u registry koji ce iskljuciti Task Manager. Ovo cemo
uraditi tako sto cemo pretraziti nasu metu i pronacicemo sve stringove
koji predstavljaju putanje do registry kljuceva. Klikom na desno dugme u
CPU prozoru, Search for -> All referenced strings... pronacicemo sve
stringove koji se nalaze u fajlu. Od svih stringova interesantni su nam
samo sledeci stringovi:

Text strings referenced in dumped_:CODE, item 3910
Address=00491E65
Disassembly=MOV EDX,dumped_.00491E90
Text string="Software\Microsoft\Windows\CurrentVersion\Policies\system\"

Text strings referenced in dumped_:CODE, item 3911
Address=00491E73
Disassembly=MOV EDX,dumped_.00491ED4
Text string="DisableTaskMgr"

Text strings referenced in dumped_:CODE, item 3917
Address=00491F01
Disassembly=MOV EDX,dumped_.00491F30
Text string="Software\Microsoft\Windows\CurrentVersion\Policies\system\"

Text strings referenced in dumped_:CODE, item 3918
Address=00491F12
Disassembly=MOV EDX,dumped_.00491F74
Text string="DisableTaskMgr"

Ovi stringovi predstavljaju putanju do registry stringa koji se koristi
za iskljucivanje Task Managera. Ali zasto ih ima na dva mesta? I zasto su
ova para stringova ista? Da bi smo odgovorili na ovo kliknucemo 2x na
svaku od ovih putanja. Posle klika na ove putanje docicemo do sledeca dva
CALLa ciji su glavni delovi:

00491F0D |. B9 01000000 MOV ECX,1
00491F12 |. BA 741F4900 MOV EDX,dumped_.00491F74 ASCII "DisableTaskMgr"
00491F17 |. 8BC3 MOV EAX,EBX

00491E71 |. 33C9 XOR ECX,ECX
00491E73 |. BA D41E4900 MOV EDX,dumped_.00491ED4 ASCII "DisableTaskMgr"
00491E78 |. 8BC3 MOV EAX,EBX

Kao sto vidimo vrednost kljuca DisableTaskMgr zavisi od vrednosti ECX
registra. Ovo znaci da se prvi CALL 00491EE4, koristi za iskljucivanje
Task Managera, pa cemo bas taj CALL patchovati.
Patch cemo uraditi na prvoj adresi samog CALLa. Taj CALL je pre
patchovanje izgledao ovako:

00491EE4 /$ 53 PUSH EBX
00491EE5 |. B2 01 MOV DL,1
00491EE7 |. A1 74564300 MOV EAX,DWORD PTR DS:[435674]

Da se ovaj kod nikada ne bi izvrsio, jednostavno cemo umesto prve
komande, komande PUSH EBX uneti komandu RET koja oznacava vracanje iz
CALLa. Dakle kada se ovaj CALL pozove jedina komanda koja ce se izvrsiti
je vracanje iz CALLa. Posle patchovanja ovaj kod ce izgledati ovako:

00491EE4 C3 RET
00491EE5 |. B2 01 MOV DL,1
00491EE7 |. A1 74564300 MOV EAX,DWORD PTR DS:[435674]

Kao i prosli put, mi cemo patchovati kod klikom na Copy to executable ->
Section -> desno dugme u novom prozoru -> Save file... I uspesno smo
zavrsili i drugi, to jest cetvrti korak.

--[ 0x05 ]---------------------------------------------[ Fishing ]

Svima vama koji se bavite reversingom, bilo pocetnicki ili duze vreme,
poznat je termin Fishing. On se odnosi na tehniku vadjenja tacnih
seriskih brojeva iz mete koju reversujemo. Posto se nasa meta sastoji od
dva polja za unosenje seriskih brojeva ovaj deo teksta cu podeliti na dva
dela.

--= Fising serial #1 =---------------------------------[ Fishing ]

Prvo cemo pronaci seriski broj za prvo polje za unos, za Part 1. Da bi
smo "upecali" tacan seriski broj za vas kompjuter potrebno je da u polje
za unos unesemo pogresan seriski broj! Da pogresan, jer cemo samo tako
saznati gde to program obradjuje podatke koji se odnose na proveru
seriskog broja. Unesite 111111 u polje za unos seriskog broja i
pritisnite dugme Check! Posle ovoga ce vam program prikazati poruku da je
uneti seriski broj netacan - "Wrong code, try again!!!". Ova poruka ce
nam pomoci da nadjemo gde se to racuna tacan seriski broj. Upalite Olly i
u njemu potrazite String reference, potrazicemo poruku koju program
izbacuje kada se unese pogresan seriski broj. Ova poruka se nalazi ovde:

0049220A MOV EDX,004922D8 "The editbox cannot empty, please try again"
00492270 MOV ECX,00492304 "Good job! Is now cracked..."
00492275 MOV EDX,00492320 "Congratulation! Now, continue part 2!"
0049228A MOV ECX,00492348 "Bad boy!"
0049228F MOV EDX,00492354 "Wrong code, try again!!!"

Obratite paznju da postoje dva identicna mesta na kojima se pojavljuje
ista poruka o netacno unesenom seriskom broju. Nama treba deo koji se
odnosi na prvi deo, na Part 1. Primetite string "Congratulation! Now,
continue part 2!"
... Dakle na pravom smo mestu. Da bi smo videli gde se
to racuna tacan seriski broj kliknite dva puta na sting "Good job! Is now
cracked..."
. Posle ovoga cemo se naci u CALLu koji pocinje na adresi
004921D4. Stoga cemo postaviti jedan break-point na tu adresu, njenom
selekcijom i klikom na F2. Sada cemo ponovo uneti pogresan seriski broj u
metu i pritisnucemo dugme Check!. Posle ovoga meta ce zastati sa
izvrsavanjem na adresi na kojoj smo postavili break-point! Posle ovoga
cemo izvrsavati kod polako sa F8 sve dok se ne nadjemo na sledecoj
adresi:

0049221D |> \B8 1F70E600 MOV EAX,0E6701F
00492222 |. BA 8F10E500 MOV EDX,0E5108F
00492227 |. 8BCA MOV ECX,EDX
00492229 |. 33C8 XOR ECX,EAX
0049222B |. BE C45EE500 MOV ESI,0E55EC4
00492230 |. 23C8 AND ECX,EAX
00492232 |. 33D1 XOR EDX,ECX
00492234 |. 03F2 ADD ESI,EDX
00492236 |. 8BC6 MOV EAX,ESI
00492238 |. 03C0 ADD EAX,EAX
0049223A |. 8BF0 MOV ESI,EAX
0049223C |> 8D55 F8 LEA EDX,DWORD PTR SS:[EBP-8]
0049223F |. 8B83 FC020000 MOV EAX,DWORD PTR DS:[EBX+2FC]
00492245 |. E8 A617FCFF CALL dumped_.004539F0
0049224A |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
0049224D |. 50 PUSH EAX
0049224E |. 8975 F0 MOV DWORD PTR SS:[EBP-10],ESI
00492251 |. DB45 F0 FILD DWORD PTR SS:[EBP-10]
00492254 |. 83C4 F4 ADD ESP,-0C
00492257 |. DB3C24 FSTP TBYTE PTR SS:[ESP]
0049225A |. 9B WAIT
0049225B |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
0049225E |. E8 8983F7FF CALL dumped_.0040A5EC
00492263 |. 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
00492266 |. 58 POP EAX
00492267 |. E8 2821F7FF CALL dumped_.00404394
0049226C |. /75 1A JNZ SHORT dumped_.00492288

Sta se ovde dogadja? Ovde se verovali ili ne racuna tacan seriski broj!
Kako znamo ovo? Pa jednostavno, odmah ispod se nalaze dve poruke, poruka
o tacno unetom seriskom broju i ona o netacno unetom seriskom broju. Da
bi smo otkrili koji je tacan seriski broj pritiskacemo F8 sve dok ne
dodjemo do adrese 00492267 na kojoj ce se u registrima pojaviti sledece
vrednosti:

EAX 00935D6C ASCII "111111" <- Nas lazni seriski broj
ECX 00000000
EDX 00935164 ASCII "60399302" <- Tacan seriski broj!
EBX 009320C4
ESP 0012F35C
EBP 0012F380
ESI 03999EC6
EDI 0012F618
EIP 00492267 dumped_.00492267

Posto se odmah ispod CALLa na adresi 0049226C nalazi JNZ skok koji
odredjuje da li ce se pojaviti poruka o tacnom ili netacnom seriskom
broju, zakljucujemo da je vrednosti 60399302 tacan seriski broj (ovo se
moze razlikovati na vasem kompjuteru)! Stoga cemo pritisnuti F9 kako bi
smo "odpauzirali" program i u metu cemo uneti ovu vrednosti, i... uspeli
smo, pronasli smo tacan seriski broj za deo 1. Lako je zar ne?

--= Fising serial #2 =---------------------------------[ Fishing ]

Videli smo da je "pecanje" seriskig brojeva izuzetno lako pa cemo isti
postupak primeniti i na drugi deo, odnosno na Part 2. Ponovo cemo uneti
netacan seriski broj u nasu metu posle cega ce meta izbaciti ponovo istu
poruku o netacno unetom seriskom broju - "Wrong code, try again!!!". Tu
poruku cemo potraziti u prozoru String reference...

00492484 MOV ECX,00492524 "Error"
00492489 MOV EDX,0049252C "The editbox cannot empty, please try again"
004924C3 MOV ECX,00492558 "Good job! Is now cracked..."
004924C8 MOV EDX,00492574 "Congratulation! Now, continue part 3!"
004924DD MOV ECX,0049259C "Bad boy!"
004924E2 MOV EDX,004925A8 "Wrong code, try again!!!"

Kao i u proslom delu ovog teksta klikuncemo 2x na string
"Congratulation! Now, continue part 3!" posle cega cemo doci u CALL koji
pocinje na adresi 00492454. Ponovo cemo postaviti break-point na prvu
adresu CALLa i u metu cemo uneti pogresan podatak 111111. Ne dajte da vas
zbuni cinjenica da se ovaj deo zasniva na Hardware IDu. Za "pecanje"
seriskog broja ovo nije bitno! Posle klika na dugme Check! program ce
zastati na nasem break-pointu a mi cemo pritiskati F8 sve dok ne dodjemo
do:

004924B9 |. 58 POP EAX
004924BA |. E8 D51EF7FF CALL dumped_.00404394
004924BF |. 75 1A JNZ SHORT dumped_.004924DB

Zasto bas ovde? Pa kao i u proslom primeru ovde se odlucuje da li ce se
prikazati poruka o tacnom ili netacnom seriskom broju! Vodjeni proslim
delom i cinjenicom da Delphi za poredjenje stringova koristi iste
registre za poredjenje stringova zakljucicemo da se tacan seriski broj
nalazi u registru EDX:

EAX 00939BC4 ASCII "111111" <- Nas lazni seriski broj
ECX 00000000
EDX 00939C24 <- Tacan seriski broj?
EBX 009320C4
ESP 0012F284
EBP 0012F2A0
ESI 00434B30 dumped_.00434B30
EDI 0012F538
EIP 004924BA dumped_.004924BA

Da li je ovo tacan seriski broj? Sta je ovo uopste? Pa posto registri
sadrze samo adrese na kojima se nalaze stringovi (u ovom slucaju), ovo
znaci da se tacan seriski broj nalazi na adresi 00939C24. Stoga cemo
selektovati registar EDX i desnim klikom na njega cemo izabrati opciju
Follow in dump. Posle ovoga ce se u donjem levom prozoru prikazati
sledece:

009395C0 6E 8A 2A 4B EB 06 AC CB n.*K....
009395C8 6B 8A 35 43 41 39 30 43 k.5CA90C
009395D0 32 37 00 00 42 00 00 00 27..B...

Da li je ovo seriski broj? Jeste iz razloga sto ako budete traceovali u
CALL za poredjenje dva stringa videcete da se bas ovaj string poredi! Ali
koji je to tacno string? Pa posto se stringovi zavrsavaju bajtom 0x00
string predstavlja sve od adrese 009395C0 do prvog 0x00 bajta!
Dakle tacan seriski broj je onaj broj koji se nikako ne moze uneti u
polje za unos seriskog broja! Cudno ali nas tacan seriski broj je bas
takav. Ne zaboravite da ce se seriski broj na vasem kompjuteru
razlikovati, pa ce stoga mozda kod vas seriski broj biti "citljiv" i
"unesiv". Ovo cete jednostavno znati, ako se u EDXu nalazi neka vrednost
stringa, onda je moguce uneti tacan seriski broj u polje za unos a
njegova vrednost ce biti ista kao vrednost EDX registra!

--[ 0x06 ]---------------------------------------------[ KeyGen I ]

Prvi deo keygeneratora se zasniva na onome sto smo naucili iz dela gde
smo pecali seriski broj za ovaj deo programa. Tamo smo primetili da se
seriski racuna na sledecem delu koda:

0049221D |> \B8 1F70E600 MOV EAX,0E6701F
00492222 |. BA 8F10E500 MOV EDX,0E5108F
00492227 |. 8BCA MOV ECX,EDX
00492229 |. 33C8 XOR ECX,EAX
0049222B |. BE C45EE500 MOV ESI,0E55EC4
00492230 |. 23C8 AND ECX,EAX
00492232 |. 33D1 XOR EDX,ECX
00492234 |. 03F2 ADD ESI,EDX
00492236 |. 8BC6 MOV EAX,ESI
00492238 |. 03C0 ADD EAX,EAX
0049223A |. 8BF0 MOV ESI,EAX

Posle izvrsavanja ovog dela koda videcemo da i EAX i ESI sadrze sledecu
hexadecimalnu vrednost: 03999EC6. Ova vrednost iz ESIa se kasnije koristi
za dalje racunanje tacnog seriskog broja:

0049224E |. 8975 F0 MOV DWORD PTR SS:[EBP-10],ESI
00492251 |. DB45 F0 FILD DWORD PTR SS:[EBP-10]
00492254 |. 83C4 F4 ADD ESP,-0C
00492257 |. DB3C24 FSTP TBYTE PTR SS:[ESP]
0049225A |. 9B WAIT

I na samom kraju se seriski broj sa adrese [ESP] prebacuje u string i
poredi sa unetim brojem. Ovo radi sledeci deo koda:

0049225B |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
0049225E |. E8 8983F7FF CALL dumped_.0040A5EC

Kada se sve ovo zavrsi 0x03999EC6 postaje 60399302. Posto su nam bitni
samo delovi koda koje sam ja ovde naveo lako mozemo napisati jedan VC++
keygenerator. Deo koda koji se koristi za racunanje seriskog broja u meti
bi ripovan u VC++ izgledao ovako:

__asm{
MOV EAX,0x0E6701F
MOV EDX,0x0E5108F
MOV ECX,EDX
XOR ECX,EAX
MOV ESI,0x0E55EC4
AND ECX,EAX
XOR EDX,ECX
ADD ESI,EDX
MOV EAX,ESI
ADD EAX,EAX
MOV ESI,EAX
MOV DWORD PTR SS:[EBP-32],ESI
FILD DWORD PTR SS:[EBP-32]
MOV EAX,DWORD PTR SS:[EBP-32]
MOV serial,EAX
}
wsprintf(buffer,"%i",serial);

Gde je serial integer a buffer char [200]. Za dodatne detalje pogledati
attachovan fajl keygen-source3.rar!

--[ 0x07 ]---------------------------------------------[ KeyGen II ]

Kao sto smo to videli u delu ovog teksta koji se odnosi na "pecanje"
seriskog broja, tacan seriski broj se racuna u CALLu na adresi 004924B1,
to jest ovde:

004924AD |. 50 PUSH EAX
004924AE |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
004924B1 |. E8 D2FBFFFF CALL dumped_.00492088

Ono sto je bitno za ovaj deo programa je ono sto je ocigledno, a to je
da se seriski broj racuna na osnovu unikatnog finger-printa sistema. Ovaj
finger-print se moze zasnivati na velikom broju podataka specificnim za
vas sistem. Ali ovde se taj hardwareID zasniva samo na jednom podatku,
zasniva se na podacima koje program dobija od APIa GetVolumeInformation:

004920A9 . 6A 00 PUSH 0 <----[GetVolumeInformation]---\
004920AB . 6A 00 PUSH 0 |
004920AD . 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C] |
004920B0 . 50 PUSH EAX |
004920B1 . 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10] |
004920B4 . 50 PUSH EAX |
004920B5 . 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8] |
004920B8 . 50 PUSH EAX |
004920B9 . 6A 00 PUSH 0 |
004920BB . 6A 00 PUSH 0 |
004920BD . 68 C4214900 PUSH dumped_.004921C4 |
004920C2 . E8 1547F7FF CALL <&kernel32.GetVolumeInformation>/
004920C7 . 8B15 94104000 MOV EDX,DWORD PTR DS:[401094]
004920CD . B8 04000000 MOV EAX,4
004920D2 . E8 B12FF7FF CALL dumped_.00405088
004920D7 . 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
004920DA . 33C0 XOR EAX,EAX
004920DC . 55 PUSH EBP
004920DD . 68 93214900 PUSH dumped_.00492193
004920E2 . 64:FF30 PUSH DWORD PTR FS:[EAX]
004920E5 . 64:8920 MOV DWORD PTR FS:[EAX],ESP
004920E8 . 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
004920EB . 33D2 XOR EDX,EDX
004920ED . 52 PUSH EDX <-----[Important Call]----\
004920EE . 50 PUSH EAX |
004920EF . 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14] |
004920F2 . E8 1D6CF7FF CALL dumped_.00408D14 >-------------/
004920F7 . 8B55 EC MOV EDX,DWORD PTR SS:[EBP-14]

A ovo smo zakljucili na osnovu cinjenice da se posle izvrsavanja vaznog
CALLa obelezenog u gornjem isecku koda u registrima nalazi HardwareID
broj:

EAX 0012F264
ECX 00000000
EDX 00935164 ASCII "1554582567"
EBX 009320C4
ESP 0012F23C
EBP 0012F278
ESI 00434B30 dumped_.00434B30
EDI 0012F294
EIP 004920FA dumped_.004920FA

Posto onaj vazan CALL sa adrese 004920F2 sluzi za pretvaranje
hexadecimalnog broja 5CA90C27 u decimalni 1554582567. Na osnovu ove
cinjenice zakljucujemo da je jedan od podataka vezanih za glavni Volume
na kojem se nalazi nasa meta bitan za racunanje HardwareID broja.
Otvoricemo Windows shell [DOS]:
---------------------------------------------------------[C-o-n-s-o-l-e]-
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\ApOx.MYPLACE>cd\

C:\>vol
Volume in drive C is Matrix
Volume Serial Number is 5CA9-0C27
C:\>
-------------------------------------------------------------------------

Dakle ocigledno je da je serial number glavne particije C:\ ustvari
HardwareId broj. Dajle, ako nastavimo da traceujemo kroz kod docicemo do
sledece petlje koja se koristi za racunanje seriskog broja:

00492112 . BB 01000000 MOV EBX,1 /* Part 1 *\
00492117 > 6A 00 PUSH 0 <------[Serial loop]------\
00492119 . 68 E4070000 PUSH 7E4 |
0049211E . 8BC3 MOV EAX,EBX |
00492120 . 99 CDQ |
00492121 . 52 PUSH EDX |
00492122 . 50 PUSH EAX |
00492123 . B8 8F4F1B72 MOV EAX,721B4F8F |
00492128 . BA 845D0500 MOV EDX,55D84 |
0049212D . E8 D62FF7FF CALL dumped_.00405108 <--[Call #1]--/
00492132 . E8 F52FF7FF CALL dumped_.0040512C <--[Call #2]--/
00492137 . 52 PUSH EDX |
00492138 . 50 PUSH EAX |
00492139 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] |
0049213C . 8B00 MOV EAX,DWORD PTR DS:[EAX] |
0049213E . 8A4418 FF MOV AL,BYTE PTR DS:[EAX+EBX-1] |
00492142 . 25 FF000000 AND EAX,0FF |
00492147 . 33D2 XOR EDX,EDX |
00492149 . 330424 XOR EAX,DWORD PTR SS:[ESP] |
0049214C . 335424 04 XOR EDX,DWORD PTR SS:[ESP+4] |
00492150 . 83C4 08 ADD ESP,8 |
00492153 . 50 PUSH EAX |
00492154 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] |
00492157 . E8 4423F7FF CALL dumped_.004044A0 |
0049215C . 5A POP EDX |
0049215D . 885418 FF MOV BYTE PTR DS:[EAX+EBX-1],DL |
00492161 . 43 INC EBX |
00492162 . 4E DEC ESI |
00492163 .^ 75 B2 JNZ SHORT dumped_.00492117 >--------/

Kao sto vidimo ovde se nalaze dva jako bitna CALLa koja se koriste za
dodatno racunanje seriskog broja. Izvojicemo ova dva CALLa:

00405108 /$ 52 PUSH EDX /*
00405109 |. 50 PUSH EAX * Part 2
0040510A |. 8B4424 10 MOV EAX,DWORD PTR SS:[ESP+10] *
0040510E |. F72424 MUL DWORD PTR SS:[ESP] *
00405111 |. 89C1 MOV ECX,EAX *
00405113 |. 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4] *
00405117 |. F76424 0C MUL DWORD PTR SS:[ESP+C] *
0040511B |. 01C1 ADD ECX,EAX *
0040511D |. 8B0424 MOV EAX,DWORD PTR SS:[ESP] *
00405120 |. F76424 0C MUL DWORD PTR SS:[ESP+C] *
00405124 |. 01CA ADD EDX,ECX *
00405126 |. 59 POP ECX *
00405127 |. 59 POP ECX *
00405128 \. C2 0800 RET 8 */


Prvi CALL je linearan koji nema nikakvih grana a iz ovog razloga
potrebno je samo da iskopiramo ceo ovaj kod u keygenerator. Ovo cemo
uraditi i sa drugim CALLom ali cemo morati malo da izmenimo ove skokove
koji se izvrsavaju:

0040512C /$ 55 PUSH EBP /*
0040512D |. 53 PUSH EBX * Part 3
0040512E |. 56 PUSH ESI |
0040512F |. 57 PUSH EDI
00405130 |. 31FF XOR EDI,EDI
00405132 |. 8B5C24 14 MOV EBX,DWORD PTR SS:[ESP+14]
00405136 |. 8B4C24 18 MOV ECX,DWORD PTR SS:[ESP+18]
0040513A |. 09C9 OR ECX,ECX
0040513C |. 75 08 JNZ SHORT dumped_.00405146 >-\
0040513E |. 09D2 OR EDX,EDX |
00405140 |. 74 5C JE SHORT dumped_.0040519E >--|----\
00405142 |. 09DB OR EBX,EBX | |
00405144 |. 74 58 JE SHORT dumped_.0040519E >--|--\ |
00405146 |> 09D2 OR EDX,EDX <-----------------/ | |
00405148 |. 79 0A JNS SHORT dumped_.00405154 >--\ | |
0040514A |. F7DA NEG EDX | | |
0040514C |. F7D8 NEG EAX | | |
0040514E |. 83DA 00 SBB EDX,0 | | |
00405151 |. 83CF 01 OR EDI,1 | | |
00405154 |> 09C9 OR ECX,ECX <------------------/ | |
00405156 |. 79 0A JNS SHORT dumped_.00405162 >--\ | |
00405158 |. F7D9 NEG ECX | | |
0040515A |. F7DB NEG EBX | | |
0040515C |. 83D9 00 SBB ECX,0 | | |
0040515F |. 83F7 01 XOR EDI,1 | | |
00405162 |> 89CD MOV EBP,ECX <-----------------/ | |
00405164 |. B9 40000000 MOV ECX,40 | |
00405169 |. 57 PUSH EDI | |
0040516A |. 31FF XOR EDI,EDI | |
0040516C |. 31F6 XOR ESI,ESI | |
0040516E |> D1E0 /SHL EAX,1 <------------------\ | |
00405170 |. D1D2 |RCL EDX,1 | | |
00405172 |. D1D6 |RCL ESI,1 | | |
00405174 |. D1D7 |RCL EDI,1 | | |
00405176 |. 39EF |CMP EDI,EBP | | |
00405178 |. 72 0B |JB SHORT 00405185 >------\ | | |
0040517A |. 77 04 |JA SHORT 00405180 >------|-\ | | |
0040517C |. 39DE |CMP ESI,EBX | | | | |
0040517E |. 72 05 |JB SHORT 00405185 >----\ | | | | |
00405180 |> 29DE |SUB ESI,EBX <----------|-|-/ | | |
00405182 |. 19EF |SBB EDI,EBP | | | | |
00405184 |. 40 |INC EAX | | | | |
00405185 |>^ E2 E7 \LOOPD SHORT 0040516E <-/-/---/ | |
00405187 |. 5B POP EBX | |
00405188 |. F7C3 01000000 TEST EBX,1 | |
0040518E |. 74 07 JE SHORT dumped_.00405197 >---\ | |
00405190 |. F7DA NEG EDX | | |
00405192 |. F7D8 NEG EAX | | |
00405194 |. 83DA 00 SBB EDX,0 | | |
00405197 |> 5F POP EDI <-------------------\-/ | |
00405198 |. 5E POP ESI | | |
00405199 |. 5B POP EBX | | |
0040519A |. 5D POP EBP | | |
0040519B |. C2 0800 RET 8 | | |
0040519E |> F7F3 DIV EBX <-------------------|---/-/
004051A0 |. 31D2 XOR EDX,EDX | |
004051A2 \.^ EB F3 JMP SHORT 00405197 >--------/ *
004051A4 . C3 RET */


Ali ovo nije kraj rutine za generaciju "tacnog" seriskog broja. Ne,
posto se u Part 2 i Part 3 izracunaju dve posebne vrednosti, to jest
[EBP-18] i [EBP-4] se dodaju jedna na drugu ovde:

00492172 . 8B4D E8 MOV ECX,DWORD PTR SS:[EBP-18]
00492175 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00492178 . 8B10 MOV EDX,DWORD PTR DS:[EAX]
0049217A . 8BC7 MOV EAX,EDI
0049217C . E8 1321F7FF CALL dumped_.00404294
00492181 . 33C0 XOR EAX,EAX

Ostalo je jos samo da sav ovaj kod pretvorimo u ASM kod za ubacivanje u
nas VC++ keygenerator koji ce izgledati ovako:

unsigned int len_name;
len_name = strlen(name);
__asm{
MOV ESI,EAX // EAX = length of HDID
MOV DWORD PTR SS:[EBP-4],ECX // ECX = pointer to HDID
XOR EAX,EAX
MOV EBX,0x01
_00492117:
PUSH 0x00
PUSH 0x7E4
MOV EAX,EBX
CDQ
PUSH EDX
PUSH EAX
MOV EAX,0x721B4F8F
MOV EDX,0x55D84
CALL _00405108
CALL _0040512C
PUSH EDX
PUSH EAX
MOV EAX,DWORD PTR DS:[EBP-0x04]
MOV EAX,DWORD PTR SS:[EAX+EBX-1]
AND EAX,0x0FF
XOR EDX,EDX
XOR EAX,DWORD PTR SS:[ESP]
XOR EDX,DWORD PTR SS:[ESP+4]
ADD ESP,0x08
PUSH EAX
MOV EAX,DWORD PTR SS:[EBP-4]
POP EDX
MOV BYTE PTR DS:[EBP+0x24+EBX],DL // Save First part
INC EBX
DEC ESI
JNE _00492117
JMP _END

_00405108:
PUSH EDX
PUSH EAX
MOV EAX,DWORD PTR SS:[ESP+0x10]
MUL DWORD PTR SS:[ESP]
MOV ECX,EAX
MOV EAX,DWORD PTR SS:[ESP+4]
MUL DWORD PTR SS:[ESP+0xC]
ADD ECX,EAX
MOV EAX,DWORD PTR SS:[ESP]
MUL DWORD PTR SS:[ESP+0xC]
ADD EDX,ECX
POP ECX
POP ECX
RET 8
RET

_0040512C:
PUSH EBP
PUSH EBX
PUSH ESI
PUSH EDI
XOR EDI,EDI
MOV EBX,DWORD PTR SS:[ESP+0x14]
MOV ECX,DWORD PTR SS:[ESP+0x18]
OR ECX,ECX
JNE _00405146
OR EDX,EDX
JE _0040519E
OR EBX,EBX
JE _0040519E
_00405146:
OR EDX,EDX
JNS _00405154
NEG EDX
NEG EAX
SBB EDX,0x00
OR EDI,0x01
_00405154:
OR ECX,ECX
JNS _00405162
NEG ECX
NEG EBX
SBB ECX,0x00
XOR EDI,0x01
_00405162:
MOV EBP,ECX
MOV ECX,0x040
PUSH EDI
XOR EDI,EDI
XOR ESI,ESI
_0040516E:
SHL EAX,0x01
RCL EDX,0x01
RCL ESI,0x01
RCL EDI,0x01
CMP EDI,EBP
JB _00405185
JA _00405180
CMP ESI,EBX
JB _00405185
_00405180:
SUB ESI,EBX
SBB EDI,EBP
INC EAX
_00405185:
LOOP _0040516E
POP EBX
TEST EBX,0x01
JE _00405197
NEG EDX
NEG EAX
SBB EDX,0x00
_00405197:
POP EDI
POP ESI
POP EBX
POP EBP
RET 8
_0040519E:
DIV EBX
XOR EDX,EDX
JMP _00405197
RET
_END:
MOV EAX,EBP
ADD EAX,0x25
PUSH EAX
PUSH IDC_SERIAL
PUSH hWnd
CALL NEAR DWORD PTR DS:[SetDlgItemTextA]
}

unsigned int hid,z;
hid = 0;
z = 1;
for(i=0;i<strlen(name);i++){
hid = hid + ((name[strlen(name) - i - 1] - 0x30) * z);
z = z * 10;
}
sprintf(buffer,"%lX",hid);
SetDlgItemText(hWnd,IDC_SERIAL2,buffer);

Ostatak koda vezanog za keygenerator pogledajte u fajlu
keygen.source3.rar! Obratite paznju samo da oba dela vezana za
keygenerator imaju rucne ispravke vezane za kod. Ovi delovi koda su
komentarisani, a popravke su morale biti radjene zbog nekompatibilnosti
nekih funkcija VC++a i odredjenih ASM komandi! Bez obzira na sve necete
imati nikakvih problema prilikom kompajlovanja jer su sve greske rucno
ispravljene!

--[ 0x08 ]---------------------------------------------[ Outro & Greetz ]

Ovo je sigurno bio jedan jako dugacak tekst ali siguran sam da vam je
sve jasno. Videli smo da iako program ima problem sa racunanjem seriskog
broja u drugom delu keygenerator se idalje moze napraviti! Zbog
specijalnih karaktera koji se koriste u drugom delu crackmea seriski je
podeljen u dva dela a u metu se unosi "lepljenjem" seriskog jedan a odmah
iza njega seriskog broj dva. Ovo je treci crackme grupe VCT, jos samo dva
na www.crackmes.de ali moj zadatak za ovo izdanje pH eZina je zavrsen...


Greetz:

SeekNDestroy | TSRh | EMiNENCE | CoolPHat | ELUSIVE | [ES]
b4d_s3c70r | asphyx | B0r0 | loco | Kostolomac | Virus Krew | Jezgra

--[ EOF ]----------------------------------------------[ made by Ap0x ]

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT