Copy Link
Add to Bookmark
Report
6x08 tELock 0.99 Unpacking
[ tELock 0.99 unpacking by ap0x ]
pH#6 .............F.u.l.l..R.e.v.e.r.s.e............. [ #Sadrzaj ]
0x01 ................................................ [ Intro ]
0x02 ................................................ [ Unpacking ]
0x03 ................................................ [ Contact ]
0x04 ................................................ [ Outro & Greetz ]
--[ 0x01 ]---------------------------------------------[ .Intro ]
Kad smo vec kuhinji zasto da ne skuvamo i tELock 0.99 :)
Da bi smo skuvali ovaj unpackme, trebace nam neki kulinarski alati:
[+] OllyDBG v.1.10 .................................. http://www.wasm.ru
[+] OllyInisible v.x ................................ http://www.wasm.ru
[+] LordPE v.1.4 .................................... http://www.wasm.ru
[+] ImpRec v.1.6 .................................... http://www.wasm.ru
[+] PeID v0.94 ...................................... http://www.wasm.ru
[+] tELock 0.9x - 0.99 ImpRec plugin ................ stize uz pH eZine
i naravno glavni sastojak naseg glavnog jela za danas:
[+] tELock 0.99 ................................. dELPHI.telock.0.99.exe
--[ 0x02 ]---------------------------------------------[ .Unpacking ]
-#UNPACKING#-------------------------------------------------------------
tElock smo vec vise puta sretali u knjizi The Art Of Reversing ali ova
vezija tELocka je opisana iz razloga sto ce nam pomoci da dodatno
sakrijemo Olly od detekcije. Naravno i ovaj antidebug trik je opisan u
poglavlju koje se bavi anti* trikovima ali je pomenut samo jedan aspekt
negove primene. Uz ovu zanimljivost moracemo da pobedimo i novi tip IAT
redirekcije.
Pocecemo od otvaranja mete dELPHI.telock.0.99.exe iz foldera Targets na
cijem cemo OEPu videti sledeci kod:
0045F09D > $^\E9 5EDFFFFF JMP dELPHI_t.0045D000
Pritisnucemo SHIFT+F9 i zavrsicemo na sledecem delu tELock koda:
0045EEAA |. FF02 INC DWORD PTR DS:[EDX]
Pritiskacemo SHIFT+F9 sve dok ne dodjemo do sledeceg exceptiona:
0045D1D0 F7F3 DIV EBX
0045D1D2 64:8F05 0000000> POP DWORD PTR FS:[0]
Ovde cemo postaviti breakpoint na POP DWORD PTR FS:[0] instrukciju jer
ona predstavlja vracanje iz SEHa koji je inicirao DIV EBX. Pritiskom na
SHIFT+F9 dolazimo do naseg breakpointa koji odmah potom uklanjamo jer
tELock ima proveru modifikacije svog koda pa mozemo biti uhvaceni ako to
ne ucinimo. Traceovanjem dalje dolazimo do sledeceg dekripcionog loopa:
0045D564 > /AC LODS BYTE PTR DS:[ESI]
0045D565 . |32C3 XOR AL,BL
0045D567 . |FEC0 INC AL
0045D569 . |34 A9 XOR AL,0A9
0045D56B . |F8 CLC
0045D56C . |C0C0 07 ROL AL,7
0045D56F . |AA STOS BYTE PTR ES:[EDI]
0045D570 . |8AD8 MOV BL,AL
0045D572 .^\E2 F0 LOOPD SHORT dELPHI_t.0045D564
koji dekriptuje kod ispod. Postavimo breakpoint na sledeci PUSHAD i
pritiskom na F9 dolazimo na njega. I ovaj breakpoint uklanjamo i
nastavljamo nas trace kroz kod ulazeci u svaki CALL koji ne vodi u neki
.dll fajl. I tako stizemo ovde:
0045D679 $ FF57 04 CALL NEAR DWORD PTR DS:[EDI+4] ;EnumWindows
Ako dopustimo da se ovaj API izvrsi OllyDBG ce se zatvoriti. Ali sta
radi ovaj API? Pogledajmo MSDN:
[ MSDN - EnumWindows ]
BOOL EnumWindows(
WNDENUMPROC lpEnumFunc, // pointer to callback function
LPARAM lParam // application-defined value
);
Dakle dva poslednja podatka na STACKu su parametri koje uzima
EnumWindows API. Poslednji parameter je pointer ka callback funkciji koja
uzima sve window handlove:
0012FF7C 0045D629 RETURN to dELPHI_t.0045D629 from dELPHI_t.0045D679
0012FF80 0045D613 dELPHI_t.0045D613
Dakle na adresi 0045D629 se nalazi funkcija koja ce nekako pronaci Olly.
Pogledajmo sta se tamo nalazi:
0045D629 . C8 000000 ENTER 0,0
0045D62D . 57 PUSH EDI
0045D62E . 8B7D 0C MOV EDI,DWORD PTR SS:[EBP+C]
0045D631 . 6A 20 PUSH 20
0045D633 . FF37 PUSH DWORD PTR DS:[EDI]
0045D635 . FF75 08 PUSH DWORD PTR SS:[EBP+8]
0045D638 . FF57 0C CALL NEAR DWORD PTR DS:[EDI+C] ; GetClassNameA
0045D63B . 8B07 MOV EAX,DWORD PTR DS:[EDI]
0045D63D . 8138 4F4C4C59 CMP DWORD PTR DS:[EAX],594C4C4F
0045D643 . 74 19 JE SHORT dELPHI_t.0045D65E
0045D645 . 8138 4F574C5F CMP DWORD PTR DS:[EAX],5F4C574F
0045D64B . 74 11 JE SHORT dELPHI_t.0045D65E
0045D64D . 8138 46696C65 CMP DWORD PTR DS:[EAX],656C6946
0045D653 . 75 1C JNZ SHORT dELPHI_t.0045D671
0045D655 . 8178 04 4D6F6> CMP DWORD PTR DS:[EAX+4],436E6F4D
0045D65C . 75 13 JNZ SHORT dELPHI_t.0045D671
0045D65E > 6A 00 PUSH 0
0045D660 . 6A 00 PUSH 0
0045D662 . 6A 10 PUSH 10
0045D664 . FF75 08 PUSH DWORD PTR SS:[EBP+8]
0045D667 . FF57 08 CALL NEAR DWORD PTR DS:[EDI+8]
0045D66A . 33C0 XOR EAX,EAX
0045D66C . 5F POP EDI
0045D66D . C9 LEAVE
0045D66E . C2 0800 RET 8
Kao sto vidimo ova funkcija svaki handle prozora koristi za pozivanje
funkcije GetClassNameA. Posle ovoga sledi poredjenje vracenog imena klase
prozora sa vrednosti 594C4C4Fh koja je samo hexadecimalni zapis stringa
OLLY, a posto znamo da je classname OllyDBGa OLLYDBG znamo da ce ovaj
jednostavan CMP detektovati Olly. Zbog ovoga cemo ili privremeno (patch
se mora vratiti zbog CRC provere) patchovati JE u NOP ili cemo patchovati
Olly i izmeniti njegov classname. Ovaj patch za OllyDBG mozete preuzeti
sa mog web sajta.
Dalje pritiskamo SHIFT+F9 sve dok ne dodjemo do sledeceg exceptiona:
0045EB71 8DC0 LEA EAX,EAX
Ovo smo vec videli u tELocku 0.98 tako da znamo da sada treba da
postavimo memoriski breakpoint na glavnu sekciju. Posle dva nova klika na
SHIFT+F9 dolazimo na OEP:
0044CF38 55 PUSH EBP
0044CF39 8BEC MOV EBP,ESP
0044CF3B 83C4 F0 ADD ESP,-10
0044CF3E B8 C8CD4400 MOV EAX,dELPHI_t.0044CDC8
0044CF43 E8 1C96FBFF CALL dELPHI_t.00406564
Ovde mozemo da uradimo dump pomocu LordPEa i da pokusamo da popravimo
importe pomocu ImpReca. On ce naci sve njih ali dobar deo njih nece biti
ispravan. Ako pogledamo jedan od njih videcemo nacin na koji se izvodi
redirekcija:
008E0000 B8 FCA565DD MOV EAX,DD65A5FC
008E0005 B8 06008E00 MOV EAX,8E0006 ; 1
008E000A EB 02 JMP SHORT 008E000E
008E000C CD 20 INT 20
008E000E 05 18000000 ADD EAX,18 ; 2
008E0013 8B00 MOV EAX,DWORD PTR DS:[EAX] ; 3
008E0015 35 00008E00 XOR EAX,8E0000 ; 4
008E001A 90 NOP
008E001B 90 NOP
008E001C 50 PUSH EAX
008E001D C3 RET
Ovde je ocigledno da su samo instrukcije obelezene brojevima 1,2,3 i 4
bitne za redirekciju. Naravno postoji jos tipova redirekcije:
00D90392 1BC2 SBB EAX,EDX
00D90394 E8 08000000 CALL 00D903A1
00D90399 40 INC EAX
00D9039A E9 09000000 JMP 00D903A8
00D9039F 33C7 XOR EAX,EDI
00D903A1 C1E8 92 SHR EAX,92
00D903A4 C3 RET
00D903A5 83E0 25 AND EAX,25
00D903A8 25 E5AE65DD AND EAX,DD65AEE5
00D903AD B8 AE03D900 MOV EAX,0D903AE
00D903B2 EB 02 JMP SHORT 00D903B6
00D903B4 CD 20 INT 20
00D903B6 05 18000000 ADD EAX,18
00D903BB 8B00 MOV EAX,DWORD PTR DS:[EAX]
00D903BD 35 9203D900 XOR EAX,0D90392
00D903C2 90 NOP
00D903C3 90 NOP
00D903C4 50 PUSH EAX
00D903C5 C3 RET
ali se sve svode na korake 1,2,3 i 4 tako da mozemo da trazimo samo njih
i na osnovu toga mozemo da izracunamo tacan API koji se koristi. Dakle
recept za pravljenje plugina bi bio:
- Potrazimo MOV EAX,xxxxxxxx; JMP +2; INT 20
- Iscitajmo vrednosti EAXa
- Dodajmo +18 na EAX
- Iscitajmo vrednost XOR EAX,xxxxxxxx
- Kada XORujemo EAX sa iscitanom vrednoscu XORa dobija API pointer
- Ovaj pointer vracamo ImpRecu
Sve ovo je pretoceno u jos jedan plugin za ImpRec koji takodje mozete
preuzeti sa mog sajta.
-#INLINE IAT FIXING#-----------------------------------------------------
Vec smo otpakovali ovaj paker ali samo za popravku importa koristili
ImpRec plugin. Sada nas interesuje da li mozemo da popravimo IAT bez
koriscenja ImpReca.
Pocecemo od otvaranja mete dELPHI.telock.0.99.exe iz foldera Targets na
cijem cemo OEPu videti sledeci kod:
0045F09D > $^\E9 5EDFFFFF JMP dELPHI_t.0045D000
Posto popravljamo IAT mozemo da postavimo breakpoint na bilo koji od dva
APIja koji se koriste za ispunjavanje IATa. Dakle postavljamo breakpoint
ili na GetProcAddress ili na LoadLibrary. Ja sam se odlucio za
LoadLibrary posto on mora uslediti pre poziva GetProcAddress APIja. Dakle
pritisnucemo CTRL+G, unecemo LoadLibraryA i postavicemo breakpoint na RET
4 instrukciju na samom kraju LoadLibraryA APIja. Ovo radimo zbog toga sto
tELock detektuje breakpointe tako da je najbolje breakpointe postavljati
na samom kraju API koda.
Kada ovo uradimo pritiskacemo SHIFT+F9 sve dok ne dodjemo do naseg
breakpointa drugi put. Kazem drugi, posto ce nas tek drugo stajanje na
breakpoint i izvrsenje RET instrukcije vratiti u tELock kod. Odnosno
nacicemo se ovde:
0045E619 . 53 PUSH EBX
0045E61A . FF95 721C4000 CALL NEAR DWORD PTR SS:[EBP+401C72] ;LoadLibrary
0045E620 . 85C0 TEST EAX,EAX
0045E622 . 0F85 C8000000 JNZ dELPHI_t.0045E6F0
0045E628 . 8B95 63374000 MOV EDX,DWORD PTR SS:[EBP+403763]
Traceovacemo kod sve dok ne dodjemo do ovde:
0045E7F7 . 48 DEC EAX
0045E7F8 . 74 1F JE SHORT dELPHI_t.0045E819
0045E7FA . 8BD8 MOV EBX,EAX
0045E7FC . 6BC0 40 IMUL EAX,EAX,40
0045E7FF . 6A 04 PUSH 4
0045E801 . 68 00100000 PUSH 1000
0045E806 . 50 PUSH EAX
0045E807 . 6A 00 PUSH 0
0045E809 . FF95 7A1C4000 CALL NEAR DWORD PTR SS:[EBP+401C7A] ;VirtualAlloc
Prema onome sto znamo o API redirekcijama svaki redirect kod se smesta u
novu alokaciju. Dakle VirtualAlloc API mora biti pozvan kako bi alocirao
proctor za redirekciju. To znaci da ako zelimo da zaobidjemo API
redirekciju JE skok sa adrese 0045E7F8 mora uvek izvrsiti, zbog cega
tELock nece koristiti redirekcije nego ce ispuniti IAT na pravi nacin. Da
bi smo ovo iskoristili zapisacemo adresu tog skoka, resetovacemo metu i
pristiskacemo SHIFT+F9 sve dok ne dodjemo do prve LEA EAX,EAX
instrukcije. Onda mozemo da izmenimo JE skok JMP i videcemo da ce se IAT
sam popraviti. Ostaje nam da uradimo dump i da na sasvim standardan nacin
popravimo importe pomocu ImpReca. Sada vidite da nikakav plugin nije ni
potreban jer se importi mogu sami popraviti jednim malim inline patchom.
--[ 0x03 ]---------------------------------------------[ .Contact ]
WebSite: http://ap0x.jezgra.net
email: ap0x.rce[at]gmail[dot][com]
--[ 0x04 ]---------------------------------------------[ Outro & Greetz ]
Kuvanje ovog protectora i nije bilo nekakav problem, zar ne :)
Greetz:
deroko | SND | TSRh | Reversing Labs | b4d_s3c70r | Jezgra
--[ EOF ]----------------------------------------------[ made by ap0x ]