Copy Link
Add to Bookmark
Report

5x03 PariteB reversing

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

                 [ Win32.Parite.B reversing by ap0x ] 

pH#5 .............F.u.l.l..R.e.v.e.r.s.e............. [ #Sadrzaj ]
0x01 ................................................ [ Intro ]
0x02 ................................................ [ AntiVirus ]
0x03 ................................................ [ Outro & Greetz ]


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

Posto se svima nama prilikom koriscenja kompjutera desavaju najrazlicitije
zgode ili nezgode ja sam za ovaj broj pH eZina odlucio da vam ispricam jednu
moju nezgodu. Naravno ova nezgoda je kompjuterske prirode i moze se prilicno
lako popraviti uz pomoc naseg omiljenog oruzija: OllyDBGa.

--[ 0x02 ]-----------------------------------------------------[ AntiVirus ]

Pa da pocnemo, ustvari posto priroda sve uglavnom radi sama nikako, ali nikako
NE klikcite 2x na fajl parite.b.exe! Ja ne preuzimam odgovornost ako se zarazite
ovom napascu od virusa, ali cak i ako vam se ruka omakne postoje resenja...
Pocecemo od pocetka.
Detekcija virusa je prilicno laka. Ako otvorite bilo koji .exe fajl inficiran
ovim virusom pomocu LordPEa videcete sledecu stvar:

Sekcija[1] ... Sekcija[2] ... Sekcija[N]

Poslednja sekcija svakog inficiranog PE fajla ce nositi random ime koje se
sastoji od 5 karaktera. Tacke, tri random slova i jos jednog slova koje ne
pripada standardnom ASCII opsegu pa iz tog razloga ne moze biti prikazano kao
slovo. U nasem slucaju ime poslednje sekcije je .vsp

Pristupicemo analizi virusa, odnosno otvoricemo fajl parite.b.exe pomocu
Olly-a. Na OEPu inficiranog fajla nalazi se sledeci kod:

00417000 > $ 90 NOP
00417001 . BB D3223001 MOV EBX,13022D3
00417006 . 90 NOP
00417007 . 90 NOP
00417008 . BF 24704100 MOV EDI,patch.00417024
0041700D . 68 98050000 PUSH 598
00417012 . 5A POP EDX
00417013 . 90 NOP
00417014 . 90 NOP
00417015 > FF343A PUSH DWORD PTR DS:[EDX+EDI]
00417018 . 311C24 XOR DWORD PTR SS:[ESP],EBX
0041701B . 8F043A POP DWORD PTR DS:[EDX+EDI]
0041701E . 90 NOP
0041701F . 83EA 02 SUB EDX,2
00417022 . 83EA 02 SUB EDX,2
00417025 . 90 NOP
00417026 .^ 75 ED JNZ SHORT patch.00417015

Mislim da je svima jasno da se ovde vrsi dekripcija ostatka koda pa kako bi
nastavili sa analizom koda moramo da dekriptujemo ostatak traceovanjem kroz ovaj
kod. Ovo radite iskljucivo sa step over ili step into, odnosno sa F8 ili F7.
Nikako ni u jednom trenutku ne pritiskajte F9 ili cete se inficirati virusom!
Analizirajmo sta se ovde desava:

00417015 > FF343A PUSH DWORD PTR DS:[EDX+EDI]
00417018 . 311C24 XOR DWORD PTR SS:[ESP],EBX
0041701B . 8F043A POP DWORD PTR DS:[EDX+EDI]

DWORD na lokaciji EDX+EDI se smesta na STACK posle cega se isti taj element na
STACKu dekriptuje pomocu XORa. Kada se ovo izvrsi dekriptovan bajt se pomocu
instrukcije POP smesta nazad na lokaciju EDX+EDI. Imajte na umu da je ovo samo
jedna varijacija polimorfnog OEPa ovog virusa. Sledecih par instrukcija nam
govori da se kao brojac bajtova koje treba dekriptovati koristi EDX, odnosno iz
ovoga:

0041701E . 90 NOP
0041701F . 83EA 02 SUB EDX,2
00417022 . 83EA 02 SUB EDX,2
00417025 . 90 NOP
00417026 .^ 75 ED JNZ SHORT patch.00417015

saznajemo da ce virus nastaviti sa izvrsavanjem kada EDX bude jednak nula. Kada
se ovo desi sledeca instrukcija ce biti izvrsena:

00417028 . 3B5F 31 CMP EBX,DWORD PTR DS:[EDI+31]

Ali ovo nema smisla, EDI je pointer ka nekoj lokaciji na STACKu, a virus jos
nista nije stavio na tu lokaciju, a sudeci po ovom kodu i nece bar ne dok EDX ne
bude nula. Ovo znaci da je i ovaj deo koda enkriptovan i da instrukcija na
adresi 00417028 nije prava, bar ne jos. Posto se ovaj kod mora izvrsiti 0x598
puta nema smisla da traceujemo rucno kroz ovaj loop. Dakle uradicemo sledece:
Selektovacemo adresu 00417028 i desnim klikom cemo postaviti Hardware
break-point on execution. Tek kada ovo uradimo mozemo da pritisnemo F9 jer ce
Olly sigurno zastati na adresi 00417028 cak i ako se njen sadrzaj promeni.
Pritiskom na F9 primecujemo da se kod sa adrese 00417028 promenio sa:

00417028 . 3B5F 31 CMP EBX,DWORD PTR DS:[EDI+31]

u

00417028 . E8 7D010000 CALL patch.004171AA

Pritiskom na F7! ulazimo u ovaj CALL (ne pokusavajte da pritisnete F8 ili F9
jer cete se inficirati virusom) dolazimo do sledeceg koda:

004171AA 55 DB 55 ; CHAR 'U'
004171AB 8B DB 8B
004171AC EC DB EC
004171AD 81 DB 81
004171AE C4 DB C4
004171AF C0 DB C0
004171B0 FE DB FE
004171B1 FF DB FF

Ocigledno je da Olly jos nije analizirao ovaj deo koda pa cemo pritisnuti
CTRL+A posle cega cemo videti sledece:

004171AA /$ 55 PUSH EBP
004171AB |. 8BEC MOV EBP,ESP
004171AD |. 81C4 C0FEFFFF ADD ESP,-140
004171B3 |. 8BC5 MOV EAX,EBP
004171B5 |. 83C0 04 ADD EAX,4
004171B8 |. 8BD5 MOV EDX,EBP
004171BA |. 53 PUSH EBX
004171BB |. 56 PUSH ESI
004171BC |. 57 PUSH EDI
004171BD |. 33DB XOR EBX,EBX
004171BF |. 8B38 MOV EDI,DWORD PTR DS:[EAX]
004171C1 |. 8D4D C8 LEA ECX,DWORD PTR SS:[EBP-38]
004171C4 |. 83EF 05 SUB EDI,5
004171C7 |. 8B47 0C MOV EAX,DWORD PTR DS:[EDI+C]
004171CA |. 8DB7 84000000 LEA ESI,DWORD PTR DS:[EDI+84]
004171D0 |. 0347 08 ADD EAX,DWORD PTR DS:[EDI+8]
004171D3 |. 83C2 04 ADD EDX,4
004171D6 |. 8902 MOV DWORD PTR DS:[EDX],EAX
004171D8 |. 56 PUSH ESI ; /Arg3
004171D9 |. 57 PUSH EDI ; |Arg2
004171DA |. 51 PUSH ECX ; |Arg1
004171DB |. E8 6A000000 CALL patch.0041724A ; \patch.0041724A
...

E ovo vec lici na nesto. Sada cemo polako traceovati kroz kod sa F7 ulazeci u
SVAKI CALL kako bi smo videli sta je ovaj virus spremio za nas. Traceujuci kroz
kod stizemo ovde:

004171CA |. 8DB7 84000000 LEA ESI,DWORD PTR DS:[EDI+84]
004171D0 |. 0347 08 ADD EAX,DWORD PTR DS:[EDI+8]

LEA ESI smesta pointer ka stringu Kernel32.dll u ESI, a ADD EAX dodaje
0x00400000 na EAX. U tom trenutku EAX je bio jednak 0x000016C5, dok je posle
dodavanja dobio novu vrednost 0x004016C5. Ako odemo na ovu adresu videcemo
sledeci kod:

004016C5 . 6A 00 PUSH 0 ; /pModule = NULL
004016C7 . E8 E1170000 CALL <JMP.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA
004016CC . A3 4F394000 MOV DWORD PTR DS:[40394F],EAX
004016D1 . 33C9 XOR ECX,ECX
004016D3 . 8B91 00104000 MOV EDX,DWORD PTR DS:[ECX+401000]
004016D9 . 85D2 TEST EDX,EDX
004016DB . 0F84 19010000 JE patch.004017FA

Bez sumlje ovo je OEP inficiranog fajla. Ovo ce nam trebati posle, a sada cemo
nastaviti sa traceovanjem kroz kod sa F7 i ucicemo u prvi CALL koji se nalazi na
adresi 0x0041724A. U njemu je sledeci kod:

0041724A /$ 55 PUSH EBP
0041724B |. 8BEC MOV EBP,ESP
0041724D |. 53 PUSH EBX
0041724E |. 56 PUSH ESI
0041724F |. 57 PUSH EDI
00417250 |. 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C]
00417253 |. 8B5D 08 MOV EBX,DWORD PTR SS:[EBP+8]
00417256 |. 8B7D 10 MOV EDI,DWORD PTR SS:[EBP+10]
00417259 |. 8B50 20 MOV EDX,DWORD PTR DS:[EAX+20]
0041725C |. 8B0A MOV ECX,DWORD PTR DS:[EDX]
0041725E |. 890B MOV DWORD PTR DS:[EBX],ECX
00417260 |. 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C]
00417263 |. 8B50 20 MOV EDX,DWORD PTR DS:[EAX+20]
00417266 |. 83C2 04 ADD EDX,4
00417269 |. 8B0A MOV ECX,DWORD PTR DS:[EDX]
0041726B |. 894B 04 MOV DWORD PTR DS:[EBX+4],ECX
0041726E |. 57 PUSH EDI
0041726F |. FF13 CALL NEAR DWORD PTR DS:[EBX] ; kernel32.LoadLibraryA
...
0041727E |. FF70 24 PUSH DWORD PTR DS:[EAX+24]
00417281 |. 56 PUSH ESI
00417282 |. FF53 04 CALL NEAR DWORD PTR DS:[EBX+4] ; kernel32.GetProcAddress
...
00417290 |. FF70 28 PUSH DWORD PTR DS:[EAX+28]
00417293 |. 56 PUSH ESI
00417294 |. FF53 04 CALL NEAR DWORD PTR DS:[EBX+4] ; kernel32.GetProcAddress

Ovo je kod koji ucitava sve API pozive koji su potrebni za izvrsavanje virusa.
Ovo se radi pomocu APIja LoadLibraryA i GetProcAddress tako sto LoadLibrary
ucitava .dll fajl u kojem se nalaze API funkcije a GetProcAddress ucitava
pojedinacne APIje. Ucitavanje APIja je sve sto ovaj CALL radi a njihova lista bi
bila:

DS:[0041704C]=0040480E (patch.0040480E), ASCII "UnmapViewOfFile"
DS:[00417050]=00404820 (patch.00404820), ASCII "TerminateProcess"
EAX=004170B9 (patch.004170B9), ASCII "GetTempPathA"
EDX=004170C6 (patch.004170C6), ASCII "GetTempFileNameA"
ECX=004170D7 (patch.004170D7), ASCII "CreateFileA"
EAX=004170E3 (patch.004170E3), ASCII "ReadFile"
EDX=004170EC (patch.004170EC), ASCII "WriteFile"
ECX=004170F6 (patch.004170F6), ASCII "SetFilePointer"
EAX=00417105 (patch.00417105), ASCII "CloseHandle"
EDX=00417111 (patch.00417111), ASCII "GetTickCount"
ECX=0041711E (patch.0041711E), ASCII "GetModuleFileNameA"
EAX=0041713E (patch.0041713E), ASCII "RegOpenKeyExA"
EDX=0041714C (patch.0041714C), ASCII "RegQueryValueExA"
EDI=0041715D (patch.0041715D), ASCII "RegCloseKey"

Pre nego sto izacemo iz ovog CALLa primeticemo samo GetProcAddress i
LoadLibrary ne mogu biti dinamicki ucitani tako da zakljucujemo da Parite.B
modifikuje tablicu importa u koju ubacuje ova dva APIja ako ova dva APIja vec ne
postoje u import tablici. Kada izadjemo iz ovog CALL nacicemo se ovde:

004171E0 |. 84C0 TEST AL,AL
004171E2 |. 74 5E JE SHORT patch.00417242

Dakle ako Parite.B ne ucita sve potrebne APIje skocice ovde:

00417242 |> \5F POP EDI
00417243 |. 5E POP ESI
00417244 |. 5B POP EBX
00417245 |. 8BE5 MOV ESP,EBP
00417247 |. 5D POP EBP
00417248 \. C3 RET
00417249 90 NOP

Ovo izgleda kao sam kraj izvrsavanja glavnog koda, tako da bi ovo lako mogao da
bude virus exit point. Traceujmo dalje kroz kod virusa, odnosno udjimo u sledeci
CALL:

004171EF |. 52 PUSH EDX ; |Arg1 = 0012FE7C
004171F0 |. E8 61010000 CALL patch.00417356 ; \patch.00417356

Tracujuci kroz njega primecujemo sledeci kod:

00417371 |. 50 PUSH EAX
00417372 |. 68 19000200 PUSH 20019
00417377 |. 8D97 BD000000 LEA EDX,DWORD PTR DS:[EDI+BD]
0041737D |. 6A 00 PUSH 0
0041737F |. 52 PUSH EDX
00417380 |. 68 01000080 PUSH 80000001
00417385 |. FF56 2C CALL NEAR DWORD PTR DS:[ESI+2C] ; ADVAPI32.RegOpenKeyExA


Ovde Parite.B otvara kljuc "Software\Microsoft\Windows\CurrentVersion\Explorer"
koji se nalazi pod granom HKEY_CURRENT_USER, da bi dalje potrazio vrednost
podkljuca "PINF" upravo ovde:

00417395 |. 51 PUSH ECX
00417396 |. FF75 08 PUSH DWORD PTR SS:[EBP+8]
00417399 |. 6A 00 PUSH 0
0041739B |. 6A 00 PUSH 0
0041739D |. 57 PUSH EDI
0041739E |. FF75 FC PUSH DWORD PTR SS:[EBP-4]
004173A1 |. FF56 30 CALL NEAR DWORD PTR DS:[ESI+30] ; ADVAPI32.RegQueryValueExA

koji ukoliko je virus vec instaliran sadrzi putanju do njegove lokacije. U mom
slucaju to bi bilo:

"PINF"=hex:07,00,43,3a,5c,44,4f,43,55,4d,45,7e,31,5c,61,70,30,78,5c,4c,4f,43,\
41,4c,53,7e,31,5c,54,65,6d,70,5c,6c,6b,69,31,31,2e,74,6d,70,00

Posto kod vas virus jos nije instaliran (bar se nadam) ovaj kljuc nece
postojati. Posto je ovo sve sto ovaj CALL radi vraticemo se iz njega i
zavrsicemo ovde:

004171F5 |. 84C0 TEST AL,AL
004171F7 |. 74 1E JE SHORT patch.00417217
004171F9 |. 66:83BD C0FEF>CMP WORD PTR SS:[EBP-140],7
00417201 |. 72 14 JB SHORT patch.00417217

TEST AL,AL ce izvrsiti skok JE samo ako kod vas ne postoji kljuc PINF. Posto
kod mene ovaj kljuc postoji (pitam se zasto) ja cu uci u sledeci CALL:

0041720F |. 50 PUSH EAX ; |Arg1
00417210 |. E8 A9010000 CALL patch.004173BE ; \patch.004173BE

U kojem cemo videti sledeci kod:

004173BE /$ 55 PUSH EBP
004173BF |. 8BEC MOV EBP,ESP
004173C1 |. 53 PUSH EBX
004173C2 |. 8B5D 0C MOV EBX,DWORD PTR SS:[EBP+C]
004173C5 |. FF75 08 PUSH DWORD PTR SS:[EBP+8]
004173C8 |. FF13 CALL NEAR DWORD PTR DS:[EBX] ; kernel32.LoadLibraryA

On nam jasno govori da je instalacioni .tmp fajl virusa ustvari .dll fajl. Ovo
se jasno vidi iz CALLa na adresi 004173C8 jer je on poziv ka LoadLibraryA APIju
koji bi ucitao samo .dll fajl da on postoji. Posto ovaj fajl ne postoji (vise)
na mom kompjuteru izacicemo iz ovog CALLa i docicemo do mesta do kojeg bi smo
dosli u slucaju da PINF kljuc ne postoji, dakle sada smo ovde:

00417215 |. 8BD8 MOV EBX,EAX
00417217 |> 84DB TEST BL,BL
00417219 |. 75 27 JNZ SHORT patch.00417242

I posto sledeci JNZ skok nece biti izvrsen moramo uci u sledeci CALL:

00417226 |. 52 PUSH EDX ; |Arg1
00417227 |. E8 CA010000 CALL patch.004173F6 ; \patch.004173F6

Ovaj malo duzi CALL cu izdeliti na par celina. Prva bi bila sledeci kod koji
ucitava tacnu putanju do inficiranog .exe fajla pomocu GetModuleFileNameA APIja.

00417426 |. 50 PUSH EAX
00417427 |. 6A 00 PUSH 0
00417429 |. FF53 28 CALL NEAR DWORD PTR DS:[EBX+28] ; kernel32.GetModuleFileNameA

Onda sledeci kod koji pomocu CreateFileA otvara taj isti fajl, najverovatnije
zbog kopiranja.

0041742C |. 6A 00 PUSH 0
0041742E |. 6A 01 PUSH 1
00417430 |. 6A 03 PUSH 3
00417432 |. 6A 00 PUSH 0
00417434 |. 6A 01 PUSH 1
00417436 |. 8D95 ECFEFFFF LEA EDX,DWORD PTR SS:[EBP-114]
0041743C |. 68 00000080 PUSH 80000000
00417441 |. 52 PUSH EDX
00417442 |. FF53 10 CALL NEAR DWORD PTR DS:[EBX+10] ; kernel32.CreateFileA

Dalje se pomocu GetTickCount, GetTempPathA i GetTempFileNameA kreira novo ime
za fajl koji ce biti smesten u Temp direktorijum. To se desava ovde:

00417456 |. 50 PUSH EAX
00417457 |. 68 04010000 PUSH 104
0041745C |. FF53 08 CALL NEAR DWORD PTR DS:[EBX+8] ; kernel32.GetTempPathA
0041745F |. FF53 24 CALL NEAR DWORD PTR DS:[EBX+24] ; kernel32.GetTickCount
00417462 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
00417465 |. 33C9 XOR ECX,ECX
00417467 |> 33C0 /XOR EAX,EAX
00417469 |. 8A440D F8 |MOV AL,BYTE PTR SS:[EBP+ECX-8]
0041746D |. 51 |PUSH ECX
0041746E |. B9 0A000000 |MOV ECX,0A
00417473 |. 99 |CDQ
00417474 |. F7F9 |IDIV ECX
00417476 |. 59 |POP ECX
00417477 |. 04 61 |ADD AL,61
00417479 |. 88440D F8 |MOV BYTE PTR SS:[EBP+ECX-8],AL
0041747D |. 41 |INC ECX
0041747E |. 83F9 02 |CMP ECX,2
00417481 |.^ 7E E4 \JLE SHORT patch.00417467
00417483 |. C645 FB 00 MOV BYTE PTR SS:[EBP-5],0
00417487 |. 56 PUSH ESI
00417488 |. 6A 00 PUSH 0
0041748A |. 8D4D F8 LEA ECX,DWORD PTR SS:[EBP-8]
0041748D |. 51 PUSH ECX
0041748E |. 8D85 ECFEFFFF LEA EAX,DWORD PTR SS:[EBP-114]
00417494 |. 50 PUSH EAX
00417495 |. FF53 0C CALL NEAR DWORD PTR DS:[EBX+C] ; kernel32.GetTempFileNameA

Taj fajl ce odmah potom biti kreiran pomocu komande CreateFileA. Ovaj fajl ce
se uvek nalaziti u Temp direktorijumu.

00417498 |. 6A 00 PUSH 0
0041749A |. 68 80000000 PUSH 80
0041749F |. 6A 02 PUSH 2
004174A1 |. 6A 00 PUSH 0
004174A3 |. 6A 01 PUSH 1
004174A5 |. 68 000000C0 PUSH C0000000
004174AA |. 56 PUSH ESI
004174AB |. FF53 10 CALL NEAR DWORD PTR DS:[EBX+10] ; kernel32.CreateFileA

Predstoji nam sledeci loop koji ce kreirati sadrzaj fajla koji ce biti snimljen
u Temp direktorijum.

004174CF |. 81FE 00280000 CMP ESI,2800
004174D5 |. 76 56 JBE SHORT patch.0041752D
004174D7 |> 6A 00 /PUSH 0
004174D9 |. 8D55 F0 |LEA EDX,DWORD PTR SS:[EBP-10]
004174DC |. 52 |PUSH EDX
004174DD |. 68 00280000 |PUSH 2800
004174E2 |. 8D8D ECD6FFFF |LEA ECX,DWORD PTR SS:[EBP-2914]
004174E8 |. 51 |PUSH ECX
004174E9 |. 57 |PUSH EDI
004174EA |. FF53 14 |CALL NEAR DWORD PTR DS:[EBX+14] ; kernel32.ReadFile
004174ED |. 68 00280000 |PUSH 2800 ; /Arg3 = 00002800
004174F2 |. 8D85 ECD6FFFF |LEA EAX,DWORD PTR SS:[EBP-2914] ; |
004174F8 |. 50 |PUSH EAX ; |Arg2
004174F9 |. 8B55 10 |MOV EDX,DWORD PTR SS:[EBP+10] ; |
004174FC |. FFB2 80000000 |PUSH DWORD PTR DS:[EDX+80] ; |Arg1
00417502 |. E8 8B000000 |CALL patch.00417592 ; \patch.00417592
00417507 |. 8D4D F0 |LEA ECX,DWORD PTR SS:[EBP-10]
0041750A |. 6A 00 |PUSH 0
0041750C |. 51 |PUSH ECX
0041750D |. 8D85 ECD6FFFF |LEA EAX,DWORD PTR SS:[EBP-2914]
00417513 |. 68 00280000 |PUSH 2800
00417518 |. 50 |PUSH EAX
00417519 |. FF75 F4 |PUSH DWORD PTR SS:[EBP-C]
0041751C |. FF53 18 |CALL NEAR DWORD PTR DS:[EBX+18] ; kernel32.WriteFile
0041751F |. 81EE 00280000 |SUB ESI,2800
00417525 |. 81FE 00280000 |CMP ESI,2800
0041752B |.^ 77 AA \JA SHORT patch.004174D7

Posebno je interesantan CALL na adresi 00417502:

00417592 /$ 55 PUSH EBP
00417593 |. 8BEC MOV EBP,ESP
00417595 |. 53 PUSH EBX
00417596 |. 8B5D 08 MOV EBX,DWORD PTR SS:[EBP+8]
00417599 |. 8B55 0C MOV EDX,DWORD PTR SS:[EBP+C]
0041759C |. 8B4D 10 MOV ECX,DWORD PTR SS:[EBP+10]
0041759F |. 85C9 TEST ECX,ECX
004175A1 |. 79 03 JNS SHORT patch.004175A6
004175A3 |. 83C1 03 ADD ECX,3
004175A6 |> C1F9 02 SAR ECX,2
004175A9 |. 33C0 XOR EAX,EAX
004175AB |. 3BC8 CMP ECX,EAX
004175AD |. 7E 08 JLE SHORT patch.004175B7
004175AF |> 311C82 /XOR DWORD PTR DS:[EDX+EAX*4],EBX
004175B2 |. 40 |INC EAX
004175B3 |. 3BC8 |CMP ECX,EAX
004175B5 |.^ 7F F8 \JG SHORT patch.004175AF
004175B7 |> 5B POP EBX
004175B8 |. 5D POP EBP
004175B9 \. C2 0C00 RET 0C

On se koristi za dekriptovanje .dll fajla koji se nalazi u inficiranom .exe
fajlu. Dakle odavde zakljucujemo da se u inficiranom .exe fajlu nalaze sledece
stvari: originalni .exe + dumper + .dll Dumper kako smo videli za sada sluzi za
extraktovanje .dll fajla u Temp direktorijum, ali nastavimo dalje sa
traceovanjem, mozda pronadjemo jos nesto zanimljivo. Ovde:

00417555 |. 6A 00 PUSH 0
00417557 |. 8D4D F0 LEA ECX,DWORD PTR SS:[EBP-10]
0041755A |. 51 PUSH ECX
0041755B |. 56 PUSH ESI
0041755C |. 8D85 ECD6FFFF LEA EAX,DWORD PTR SS:[EBP-2914]
00417562 |. 50 PUSH EAX
00417563 |. FF75 F4 PUSH DWORD PTR SS:[EBP-C]
00417566 |. FF53 18 CALL NEAR DWORD PTR DS:[EBX+18] ; kernel32.WriteFile

se konacno fajl iz memorije zapisuje na disk. Posle cega sledi zatvaranje
handleova, prvo se zatvara handle fajla koji se zapisuje u Temp direktorijum, a
onda se zatvara handle inficiranog .exe.

00417569 |. FF75 F4 PUSH DWORD PTR SS:[EBP-C]
0041756C |. FF53 20 CALL NEAR DWORD PTR DS:[EBX+20] ; kernel32.CloseHandle
...
00417579 |> \57 PUSH EDI
0041757A |. FF53 20 CALL NEAR DWORD PTR DS:[EBX+20] ; kernel32.CloseHandle

Posle ovoga sledi najvazniji CALL i koji moramo da udjemo da bi smo shvatili
kako to Parite.B radi. Dakle u ovom CALLu:

0041723C |. 50 PUSH EAX ; |Arg1
0041723D |. E8 7C010000 CALL patch.004173BE ; \patch.004173BE


cemo videti sledeci kod:

004173C2 |. 8B5D 0C MOV EBX,DWORD PTR SS:[EBP+C]
004173C5 |. FF75 08 PUSH DWORD PTR SS:[EBP+8]
004173C8 |. FF13 CALL NEAR DWORD PTR DS:[EBX] ; kernel32.LoadLibraryA

LoadLibrary koji ucitava fajl koji je snimljen u Temp direktorijum. Posle ovoga
Parite.B ce ucitati funkciju koja se nalazi na lokaciji koja se nalazi u EDXu.
To se desava ovde::

004173D7 |. 52 PUSH EDX ; patch.004171A1
004173D8 |. 50 PUSH EAX
004173D9 |. FF53 04 CALL NEAR DWORD PTR DS:[EBX+4]
004173DC |. 85C0 TEST EAX,EAX
004173DE |. 74 0D JE SHORT patch.004173ED

a u EDXu se nalazi sledeci pointer ka stringu 004171A1 ASCII "Initiate". Odavde
saznajemo da je glavna funkcija .dll fajla koji se nalazi u Temp direktorijumu
Initiate koja ce ovde biti startovana:

004173E0 |. FF75 10 PUSH DWORD PTR SS:[EBP+10]
004173E3 |. FFD0 CALL NEAR EAX ; ixq19.Initiate
004173E5 |. 84C0 TEST AL,AL
004173E7 |. 74 04 JE SHORT patch.004173ED
004173E9 |. B0 01 MOV AL,1
004173EB |. EB 02 JMP SHORT patch.004173EF

Ovo se nikako ne sme desiti jer cete se INFICIRATI virusom. Iz ovog razloga
cemo NOPovati PUSH [EBP+10] i CALL EAX kako bi smo sprecili zarazu. Posle ovoga
nam ostaje samo da izadjemo iz ovog CALLa i da izvrsimo i sledeci CALL:

00417242 |> \5F POP EDI ; patch.00417024
00417243 |. 5E POP ESI
00417244 |. 5B POP EBX
00417245 |. 8BE5 MOV ESP,EBP
00417247 |. 5D POP EBP
00417248 \. C3 RET
00417249 90 NOP

Kada se ovo desi, odnosno kada se izvrsi RET komanda mi cemo se naci na OEPu
inficirane mete. Kao sto smo predpostavili OEP se nalazi na adresi 0x004016C5 i
izgleda ovako:

004016C5 . 6A 00 PUSH 0 ; /pModule = NULL
004016C7 . E8 E1170000 CALL <JMP.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA
004016CC . A3 4F394000 MOV DWORD PTR DS:[40394F],EAX

Sada nam preostaje samo da dezinfikujemo ovaj fajl. To cemo uraditi pomocu
LordPEa pomocu kojeg cemo promeniti EntryPoint na 0x000016C5. Ali ovo nije sve,
oticicemo u Sections prozor u kojem cemo izabrati poslednju sekciju .vsp i
desnim klikom na nju izabracemo opciju wipe section header. Ovo ce ukloniti
poslenju sekciju iz PE headera ali ne i iz PE fajla. Da bi smo i stvarno fizicki
obrisali poslednju sekciju moracemo da zatvorimo LordPE i da pomocu bilo kog Hex
Editora obrisemo sve podatke od 0x12E00 pa do kraja .exe fajla. Ovako cemo i
konacno obrisati virus iz .exe fajla. Pokusajmo sada da otvorimo dezinfikovan
fajl pomocu Ollya i videcemo da ce on izbaciti 0xC0000005 error. Sta smo to
zaboravili da uradimo? O da potrebno je jos popraviti tablicu importa. Ovo cemo
uraditi tako sto cemo kliknuti na opciju Direktories u LordPEu gde cemo pomocu
klika na ... pored import table podatka imati pregled cele tablice importa. Sada
jos samo treba da u novoj listi izaberemo kernel32.dll i pogledamo sta se to
poziva iz ovog .dll-a. Prve dve adrese 0x000175BE i 0x000175CD su pogresne pa
posto nemozemo da ih obrisemo izabracemo TrunkValue prvog sledeceg validnog
APIja (GetTempPathA), odnosno 0x00004832 i upisacemo ga u ThunkValue invalidnih
importa. Posle ovoga mozemo da snimimo promene koje smo nacili. Sada ovaj fajl
moze biti otvoren pomocu Ollya, a kao sto vidimo njegova velicina se sa 248 kb
smanjila na samo 75 kb. Primer ispravno uklonjenog virusa mozete pogledati na
fajlu cleaned.exe!

--[ 0x02 ]----------------------------------------------------[ Outro & Greetz ]

Virusi mogu biti napast, ali ono sto je bitno je ono sto smo danas nucili. Svi
virusi koji inficiraju .exe fajlove mogu biti lako uklonjeni a originalni .exe
fajlovi ocisceni i ponovo bezbedno upotrebljeni. Preporucujem samo da pazite na
zaraze koje vladaju, nisu svi virusi isti... ako shvatate sta hocu da kazem ;)

Greetz:

deroko | SND | TSRh | Reversing Labs | b4d_s3c70r | Jezgra | BlackHat

--[ 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