tak som sa na to trosicku malicko pozrel a poobracal to v debuggery - na zaciatok si sprav tieto
patchy(samozrejme, ze v olly musis mat najprv otvoreny subor "dokja.exe"):
patchni api ZwSetInformationThread z(u mna vyzera tato api takto, u teba moze vyzerat inak):
mov eax,0e5
mov edx,7ffe0300
call dword ptr ds:[edx]
retn 10
na(tj dam sa na instrukciu "mov eax,0e5", stlacim medzernik v olly a napisem tam toto)(tym tuto api
znefunkcnime(tato api nam zhovaduje nasu pracu)):
retn 10
patchni api GetTickCount na(tymto si usetris vela "slepych uliciek", kt ta budu cakat v kode):
xor eax,eax
retn
patchni "BeingDebugged" byte v PEB na 00h(01h znamena, ze je aktivny debugger) - patchut to
mozes bud nejaky antiantidebug pluginom v olly(napr StrongOD - v nom moznost "HidePEB")(alebo
sa to da patchnut aj rucne, ale pre teba bude lahsie spravit to cez ten nejaky plugin)
patchni "NtGlobalFlag" byte V PEB(aj ked mam dojem, ze som niekde cital, ze "NtGlobalFlag" je
hodnota dlzky dword a nie byte, to je ale jedno, nas zaujima len byte) - potrebujes tam mat
00h, lebo 70h znamena, ze je debugger aktivny. patchnut sa to da tak, ze nieco malo kodu
assemblujes do procesu, a zistis presnu adresu "NtGlobalFlag" bytu, ale ja ti opat odporucam
pouzit nejaky plugin, kt to napatchuje za teba(opat napr StrongOD - kt v ramci tej moznosti
"HidePEB" vymaze aj tento "NtGlobalFlag" byte).
kod zaujimavy pre nas(pre teba) zacina hned po retn tej dlhej procky na EP virusu(dokja.exe),
cize skrolluje dole dole az uvidim retn(u mna adresa 0040d26c), dam tam bp, f9, f8 a som na
zaujimavej casti kodu(deju sa tam typicky virusove haluze) - takze mozes trasovat kolko len
chces, kod je dobre citatelny(bez obfuskacie a pod. veci - zameraj sa hlavne na pouzite api
funkcie, lebo pouzite api ti povedia velmi o behu kodu virusu) - hlavne o co ide, je to ze
povodny sekcie(pamat) procesu "dokja.exe" sa prepise na uplne ine PE a nakoniec sa sa prerobene
PE skoci(na jeho EP), je to adresa 0041081a - v momente ked si na EP noveho PE, tak mozes
proces zdumpovat a zistis, ze sa jedna o nejaky "Microsoft Visual C++ v8.0" app(tu je EP):
0041081A . E8 FD150000 CALL dokja.00411E1C
0041081F .^ E9 78FEFFFF JMP dokja.0041069C
no, prekrokujes(to "vsetko" co prekrokujes su len VC++ blbosti) to az na adresu 0040104b(call ebx);
vstup do callu a si tam(tento kod som presiel uz len zbezne, a dalej som to uz neskumal, ale je
pravdepodobne, ze sa to uz len dokonci a pokracuje sa v remotethreade na explorer.exe)
ovela zaujimavejsi podla mojho nazoru bude kod(remotethread), kt sa vykona na explorer.exe -
tu som ti pripravil maly navod ako kod nevytvarat a nevykonavat na explorer.exe ale na nasom
fake procese(kt mozme v pohode debugovat; debugovat proces explorer.exe je nahovno), a ako sa
attachnut na ten kod:
otvorim si exe(dokja.exe) v olly(samozrejme, ze to musi byt na neinfikovanom systeme)(a
samozrejme, ze musis mat spravene vsetky patchy, kt pisem hore) - dam hwbp
na api OpenProcess(do commandbaru napisem "he OpenProcess" a stlacim ENTER) a api
ZwWriteVirtualMemory(do commandbaru napisem "he ZwWriteVirtualMemory" a stlacim ENTER). pre lepsi
prehlad si stack window nastavime na adresu relativnu k ESP - klinem pravym tlacidlom mysi na
stack window(hocikde na stack) a dam ADDRESS/RELATIVE TO ESP. teraz v olly stlacam f9 dovtedy
pokym na stack neuvidim ako parameter api OpenProcess PID procesu explorer.exe(v mojom pripade je
to 2x, cize 2x som stlacil f9), vidim toto na stack:
ESP ==> > 00125359 /CALL to OpenProcess from 00125357
ESP+4 > 0000047A |Access = CREATE_THREAD|VM_OPERATION|VM_READ|VM_WRITE|DUP_HANDLE|QUERY_INFORMATION
ESP+8 > 00000000 |Inheritable = FALSE
ESP+C > 000004C8 \ProcessId = 4C8
ako vidime, tak "ESP+C" ukazuje PID procesu, kt sa ide otvarat - u mna je 4c8h PID explorer.exe
teraz si otvorim(spustim) nejaky fake proces na kt sa remotethread vytvori - ja dam napr kalkulacku
z windows(calc.exe) - zistim si jeho PID. teraz v olly kliknem pravym tlacidlom mysi na "ESP+C"
(v stack okne samozrejme) a dam MODIFY - tam doplnim PID calc.exe, kt som si zistil(na zaver stlacim
ENTER). teraz mozem hwbp na OpenProcess zrusit(do commandbaru napisem "hd OpenProcess" a stlacim
ENTER). dobre, teraz stlacim f9 - breakli sme na api ZwWriteVirtualMemory, kt zapisuje data do
target procesu, na stack vidim toto:
ESP ==> > 00125296 RETURN to 00125296 ;toto je len navratova adresa callu
ESP+4 > 000000BC ;handle procesu, do kt ideme zapisovat(handle vytorila api OpenProcess)
ESP+8 > 003F0000 ASCII "Actx " ;adresa v procese, na kt sa ma zapisovat
ESP+C > 0041A990 ASCII "VirtualProtect" ;buffer, kde su data kt sa zapisu do target procesu
ESP+10 > 00000E72 ;pocet bytov kt sa zapisu
ESP+14 > 00000000 ;pocet bytov, kt sa uz na proces zapisali(je NULL, cize sa parameter ignoruje)
toto co vidime, su parametre api ZwWriteVirtualMemory(pre viac info si pozri api WriteProcessMemory).
zaujima nas hlavne "ESP+C", kde je buffer dat, kt sa budu zapisovat. potrebujeme najst buffer, kde sa
budu zapisovat data, resp funkcny kod(kod, kt sa bude dat exekuovat). ked chcem vidiet co je v buffery,
tak staci na "ESP+C" kliknut pravym tlacidlom mysi a dat FOLLOW IN DUMP. dobre, teraz stlacim v olly
dalsich 3x f9 - v tomto momente sa bud zapisovat kod, kt sa da exekuovat, staci ked si pozries buffer
a vidim hned byty "55 8b", co je znak toho, ze sa ide zapisovat ten kod kt nas zaujima. v tomto momente
musime buffer patchnut tak aby sme na zaciatocnej adrese remotethreadu spravili nekonecnu slucku
(eb fe). zaciatocnu adresu remotethreadu som zistil tak, ze som si pozrel parametre api
CreateRemoteThread(tato api sa vsak vola az po zapisani vsetkych dat, takze parametre api som si
musel pozriet predom). a ta zaciatocna adresa je "buffer+1bd0", cize teraz na stack vidim toto:
ESP ==> > 00125296 RETURN to 00125296 ;toto je len navratova adresa callu
ESP+4 > 000000BC ;handle procesu, do kt ideme zapisovat(handle vytorila api OpenProcess)
ESP+8 > 00A30000 ;adresa v procese, na kt sa ma zapisovat
ESP+C > 00120914 ;buffer, kde su data kt sa zapisu do target procesu
ESP+10 > 0000F613 ;pocet bytov kt sa zapisu
ESP+14 > 00000000 ;pocet bytov, kt sa uz na proces zapisali(je NULL, cize sa parameter ignoruje)
v "ESP+C" je adresa buffera - 00120914h, k nej pripocitam +1bd0h a dostanem 001224E4h - toto je miesto
kde dame "eb fe" loop("breakpoint"). v olly kliknem pravym tlacidlom mysi na DUMP WINDOW(cast okna
olly vlavo dole) a dam GO TO/EXPRESSION a tam napisem 001224E4 a stlacim ENTER. vidim toto:
001224E4 55 8B U‹
kliknem lavym tlacidlom mysi na byte "55", a hned zacnem pisat na klavesnici EB FE - stlacim ENTER.
teraz mozem zrusit hwbp na ZwWriteVirtualMemory(hd ZwWriteVirtualMemory) a stlacim f9 - proces by sa
mal ukoncit.
teraz na nasom calc.exe procese ukoncime main thread a nechame bezat len nas remotethread(main thread
je ten, kt zabera malo CPU usage - no a ten thread kt zabera skoro celu CPU usage je ten nas
remotethread, je to kvoli tomu, ze tam mame ten EB FE loop). teraz si otvorim nove okno olly(novu
instanciu olly)(tentokrat nemusime robit patchy, kt som popisoval uplne zaciatku tohoto minitutiku),
dam si menu FILE/ATTACH, kliknem na calc.exe proces(mozem ho identifikovat podla PID napr.) a kliknem
na tlacidlo ATTACH. teraz stlacim hned po sebe f9 a f12( tj rozbehni a hned pauza). mali by sme sa
nachadza na nasom eb fe loope:
00A31BD0 - EB FE JMP SHORT 00A31BD0
klikem lavym tlacidlom mysi na adresu 00a31bd0(resp na ten riadok) - stlacim ctrl+e a pisem 55 8b
(to su povodne byty) a na zaver dam ENTER. no, a to je vsetko - mozes trasovat kod remotethreadu
(odporucam ti pouzivat hwbp a nie softwareove(f2)).