[ Pera_Anarhista @ 02.09.2003. 17:06 ] @
caos
cini mi se da je ovo pravi forum za ovakvo pitanje, posto su na forumu virii samo pocetnicka pitanja. Zanima me, da li je moguce postaviti virus na pocetak program, program kopirati negde drugde (recimo negde usred data sekcije ili na kraj fajla), onda kada se program startuje, virus se izvrsi, vrati deo programa namesto virusa nazad na svoje mesto i startuje originalan program u memoriji ?

Kako funkcionisu fixupsi pod windowsima ? kako da otkrijem da li ce se deo koji ja pomeram u neki drugi deo biti promenjen od strane windowsa pri ucitavanju (tj., da windows ne promeni moj virus!) ??

ajd, hvala vam unapred, nadam se da ce mi neko pomoci...

p.s. cisto da se zna da ne pravim gluposti, vec da mi je tema za maturski "pravljenje metamorfnog virusa"....
[ Spodletela @ 03.09.2003. 14:38 ] @
Metamorfnog? Dobro si zaglavio :)

Jeste moguce, ali u glavnom upotrebljavaju se dvije metode; prva je kreiranje novog sectiona, i kopiranja virusa tamo a druga je resizanje poslednje sekcije i kopiranje kode na kraj te sekcije. Za startovanje samo promjeniš entry point u PE headeru i shraniš originalno (koju zoveš posle štartovanja virusa) i to bi trebalo biti to. Govorim ti samo iz ciste teorije, jer imam fiksnu ideju da cu (nekog dana) to da izvedem iz cja ali bilo koju metodu infekcije gledam u svakom slucaju nabašem na pisanje address independant kode, koja je za to što sam naumio suviše komplikovana.

Što se tice metamorfizma (ja bi promienio temu u polymorfizam, ali glava je tvoja :), imaš na umu da napišeš svoj engine?
[ Pera_Anarhista @ 03.09.2003. 16:37 ] @
caos
ja sam pe infekciju vec odradio, sada hocu da je usavrsim -> svi virusi se kopiraju na kraj i stoga se lako mogu detektovati (koji to jos program ima entrypoint u zadnjoj sekciji ??). Zato hocu da virus upisem na pocetak fajla, a code negde drugde da premestim, pa da ga u memoriji vratim... ako hoces, nije mi frka da ti posaljem source za pe infekciju u assembleru sa komentarima prevedenim na srpski (original je na nemackom, dijaspora, sta ces :)). c mozes odmah da batalis, suvise je komplikovano, sa asemblerom je stvarno lakse, a brzo se uhodas...

Da, metamorf (znaci, svaka linija koda se menja i ceo virus nikada nije isti, bas zato metamorf, a ne polimorf :)) cu da pravim, imam vec ideja... nije to bas toliko tesko...
[ Spodletela @ 04.09.2003. 08:03 ] @
Polimorfizam; dekoder za kodu virusa se mjenja (koda je svaki put drugacije kriptovana), ali koda ostaje ista
Metamorfizam; promijenjanje kode virusa na takav nacin, da sa drugim inštrukcijama radi isto (e pa to nije bas lako :)

"asemblerom je stvarno lakse"; e tu je moj problem... sa asseblerom jeste lakše da insertujem nešto u PE ali sve ostalo postaje puno teže... koda koju želim da insertujem snosi negde oko ~7000 lina c++ kode koju bi bilo potrebno da se ponovo napiše u asmju a to je nešto što nije baš lako. Osim toga, taj kod ce vjerovatno upotrebljavat na cjeloj firmi, tako da ne mogu da računam da svatko razumije asm, onda su tu i lahkoca promenjivanja,... uradio samo funkciju HMODULE LoadLibrary(BYTE *pBuffer, DWORD dwBuffer), tako da ne moram da promjenim baš svu kodu u asm ali treba da promjenim ovu funkciju (zapravo class) u address independant kodu.

Primio si prv msg? Imam in nešto "malo" linkova za tebe...
[ Sundance @ 04.09.2003. 14:06 ] @
Tebi definitivno treba EPO (EntryPoint Obscuring) :) Neki stave obicni jmp na posljednji section, neki patchaju random api u import tablici, a neki stvaaarko kul virusi debuggiraju program u pozadini, skuze logiku izvodjenja (!) i onda patchaju neki call/jmp ili nes slicno.. (mistfall engine je recimo vrh svih takvih metoda).

To u vezi relokacija, postoji cak i jedna metoda enkripcije tijela virusa preko relokacija postavljanjem odgovarajuceg offset-displacementa na nekim VA i podesavanja .reloc sectiona da vindoze Loader prije nego sto se program pokrene vrati virus u operabilno stanje. Moj ti je savjet da izbjegnes to sa kopiranjem dijela izvornog koda programa velicine virusa u zadnji section ili wherever te eventualnu primjenu relokacija na taj dio programa koji si iskopirao rucno i da koristis EPO.

Metamorf. Funkcionalne metamorfe ikad napravljene mozes nabrojati na prste jedne ruke. imas u 29a#6 txt od Mentall Drillera o procesu apstrakcije pravljenja metamorfa - toliko je spooky da bi 99% asm programera samo shudder at the thought da pokusa napraviti nesto slicno (metaPHOR ima oko 500k asm koda!) I nemoj zaboravit kad bude gotov da ga ovdi negdi okacis :-))
[ Spodletela @ 04.09.2003. 16:22 ] @
E pa dobro, cuvao sam mistfall i z0mbijev link za kasnije ali pošto je sundance vec "probrbljao" :)

Ali treba da znaš; ovaj tip je lud... potpuno lud :)
http://z0mbie.host.sk/

I još malo (p.s. imam i jedan virus objavljen ovdje, naravno samo laboratorijski primjerak... totalno polimorfican :)
http://29a.host.sk/

O i ne smijes da promasis ovo:
http://z0mbie.host.sk/z10d.zip (OVO JE VIRUS, ne možeš da ga slucajno pokrenes, ali...)
http://z0mbie.host.sk/rpme.zip

I jedan izsjek iz RPME;

PERMUTATION

Considering instruction list, we have three main parts of the
permutation:
1. - disassembling code (creation of the instruction list)
- post-processing list (*)
2. - modifying instruction list (permutation itself)
3. - assembling new code
- linking (**)

(*) Disassembling should be followed by some post-process, which
will make instructions independent on their initial offsets, replacing
all links to labels (i.e. relative instruction offsets) with links to
list entries.

Also this list post-processing procedure will mark labels, i.e.
instructions with the XREF mark.
This xref-information needed for the following mutation.

(**) Assembling requires some post-process, called linking.
It will replace links to list entries with relative instruction offsets.
[ Pera_Anarhista @ 04.09.2003. 17:07 ] @
caos svima, hvala na odgovorima, nisam ih, iskreno receno, ocekivao :)
ovaj forum mi je izgledao mrtav...

whatever... :)

gore navedene sajtove sam vec odavno overio (i podosta toga naucio :)). Sada, da li sam ja prepametan (malo verovatno) ili sam glup (vise verovatno), pa mi je metafor izgledao prost ? Ja sam sve to shvatio ovako:

1) disasmbler -> sve se prevede na neki nas asembler
2) obeleze se labeli i promenljive u nasem asembleru, da bi mogli slobodno da pomeramo i smanjujemo kod
3) sve se smanji da kod ne bi vecito rastao
4) odredjene komande se zamene drugima (tipa, xor eax, eax = mov eax, 0 i slicno), ubaci se malo suvisnih komandi (da bi kod koliko toliko odgovarao statistici standardnih programa)
5) assembler -> svi labeli i varijable se iznova izracunaju i sve se to 'sklopi' u binari.
6) infekcija fajla

da li sam ja sada tu nesto propustio ? meni je sada najteze napraviti disasembler / asembler, ali nije nesto nemoguce (ako se ogranicim na ono malo komandi koje mi trebaju).

do sledeceg pisanja

p.s. da li je moguce premestiti onako divljacki neki deo originalnog programa (iz .code sekcije), pa ga vratiti nazad na njegovo mesto i tu ga startovati ? (pod pretpostavkom da sam uradio pushad / popad prethodno) Kako ste vi rekli, sve relokacije se vrse u .reloc sekciji, a originalan kod se ne dira (bar sam ja to skapirao, a tako kaze i moj disasembler :))
[ Sundance @ 04.09.2003. 19:21 ] @
Yes, yes sve je to tako jednostavno :-) Samo pazi da ti generator trash instrukcija bude radio nesto pametnije od pus-pop, nop, call-ret i ostalih jednobajtnih cudesa, jer ce ti inace dosta AV monitora dati crveno svjetlo :) Mozda i nije tesko napraviti neki tiny disasm engine (da rippas suvisak sa z0mbievog LDE/ADE?), ukoliko se ogranicis na 30-ak instrukcija. Proucavanje tablica opkoda ce te zabaviti neko vrijeme :-) Jos je totalno fucked-up detekcija API poziva na neki genericki nacin (i reasembliranje istih na razlicite nacine) jer imaju razlicit broj parametara. A debuggiranje...ja jedva debuggiram svoj vlasiti kod, a kamoli jos neki koji je AI stvorio :) Kul txt: http://29a.host.sk/29a-6/29a-6.205

Ono sa kopiranjem dijela programa iz .code sectiona je teoretski moguce, samo po uvjetom da taj kod koji kopiras ne zahtijeva relokacije (jer ce inace Loader syebati tvoj virusni kod, a tvoj ce virusni kod trebati patchati iskopirani kod. a cinjenica je da 99% izvrsnih programa manje-vise ne treba relokacije... :) A zar nije lakse patchati jedan obicni jump <last section VA> ?
[ Pera_Anarhista @ 04.09.2003. 20:45 ] @
pozdrav
necu da patchujem neki jmp (sto bi isto bilo interesantno :)), jer necu da me anti virus lako detektuje (ako je na pocetku) i ne bih da pratim program (pretpostavljam da bi trebalo da pravim potpuni disasembler i za to da bih pronasao jmp ??). Videcu, jos nista nisam odlucio, tek planiram... pravo pitanje je i bilo : kako da otkrijem da li ce se nesto u .code sekcije relocirati (ne kapiram bas ni kada / kako se to desava ??).

Tablice za disasembl vec studiram :) ako neko ima nesto sto bi mi pomoglo, bio bih vrlo zahvalan.

necu ni koristiti glupave jednobajtne nopove ili nesto slicno... pre mi je palo na pamet, nesto ovako:
Code:

push eax
push ecx
mov eax, 22111984h         ; nije random, vec se broj u svakoj generaciji menja, nece valjda neko potrefiti datume ?? :)
mov eax, random       ; random komanda
add eax, random        ;  random komanda
add ecx, random        ;  random komanda (ovde bi moglo cak da bude i random mnogo komandi...)
cmp ecx, eax
jcc Vrati_se_nazad     ; random

sub ecx, 3                
xor eax, eax              
jmp Vrati_se_nazad

Vrati_se_nazad:
pop ecx
pop eax
Stvaran_kod:
...


tako nesto, pa onda moj program gleda da li ima negde push eax, push ecx, i onaj odredjen broj. par slicnih izmena i vecih blokova, pa onda ima i onih manjih... (tipa cmp reg, reg1; jge label sa cmp reg1, reg; jbe label i slicno).

Kod od metafora jeste ogroman, ali kada se bolje pogleda, najveci deo otpada na disasembler / asembler i na pe infekciju. nisam ga bas celog detaljno citao, ali na pocetku pise i da je polimorfan, pa su i to par linija... imam jos 3 meseca da ovo odradim, jel mislis/mislite da nema sanse ?? u slucaju da nema sanse da uspem, koliko daleko bi mogao da stignem ? (ok, ne znate te me, nije poznato koliko brzo programiram itd. al eto, neka procena...)
[ Spodletela @ 04.09.2003. 20:51 ] @
Treba da paziš ne jednu stvar;

AV heurestic engines su poceli da postaju stvarno "cudesne". Vec je TBAV
simulisao instrukcije u svome sandboxu (ali je propao i kupio ga norman.com),
tako da preproste variacije insertiranja garbage kode tu su propale. Trebaces
da izradis pravi mali AI ako hoces, da ovo cudo radi kako bi trebalo.

Precitaj prv msg! I drzi se ga, mislim da ce se izplatit...
[ Pera_Anarhista @ 04.09.2003. 21:24 ] @
caos
ne radi se o garbage codu, jer to bas i hocu da izbegnem, ja cu samo da menjam svoj program, bez smeca... nismo se razumeli... :(

cmp eax, ebx
jge label

je isto sto i

cmp ebx, eax
jbe label

sada, da li su ti heuristik engini toliko dobri da provale i tada o cemu se radi ?
[ Spodletela @ 05.09.2003. 07:43 ] @
Mislim da je najbolje da downloadaš Kaspersky AV i testiras svoj engine naprotiv njegove heuristike... mislim da je još uvjek najbolji.

I još nešto malo; heur. engines mali su avtomatizirani debuggeri, koje ne zanima baš gdje ti je kakav jump etc. Traže cudne akcije koje bi mogle da znace infekciju, npr. ako program trazi datoteku po disku, to nije problematicno... ako trazi exe datoteku, npr. onda ajdemo da ga pogledamo dalje. Ok, pronašao je datoteku, samo ju je startovao... (=end), ooo pa vidi ti njega otvorio ju je i poceo da promenjuje byte u PE headeru, osim toga nesto prtlja sa kopiranjem bytova iz svog processa u tu datoteku (vidi ti njega :) = blokiraj ili obavjesti usera). I tako dalje... TBAV je imao jedan nasty feature, pokazivao je flage, kao npr. encrypted, polymorphic,... i ako si bio malo uvježban iz njih si mogao da prepoznaš okužen fajl, i ako je bio virus potpuno nov.

Zato je entry point obfuscation tako zaj* stvar... tu ti enkripcija ne moze pomoci, mozda je najbolje da i sam tracaš host šta radi i stavis jump na kodu virusa negdje unutar programa, idealno bi bilo, da ga staviš za koji handler npr. u message loop, da se virus bez upletivanja user-a i ne bi startovao (WM_KEYDOWN, WM_MOUSEMOVE, ...). S time bi sjebao heuristiku, jer nikad ne bi bila u stanju da dođe avtomatski do tvog entry pointa, ali to stvara probleme za tebe, jer bi trebao da tracas program kad user radi sa njim i tek pošto ga zatvori inficirati... ali ova metoda sa dobrim poly./meta. enginom bila bi gadna...

Ali to nije u "stilu" tvog cilja, zapravo tvoj jedini cilj je, da izbjegneš signature based scannere (kojih baš i nema puno, ali dobro).
[ Sundance @ 05.09.2003. 16:17 ] @
Kad vec radis disasm engine, nece ti biti problem sa njim parsati compiler stub nekog programcica i patchati neki jmp/call whatever. Kao sto sam vec rekao, najbolje bi bilo ovo napraviti preko debug API-ja ali... :)

IMHO najbolji heuristicki engine ima NOD32. Ono sto se tice junkcode je tocno - AV melje kroz njega kao kroz tijesto, samo se gleda jeli kod radi nesto opasno i koliko je flagova "zacrvenio" pri izvodjenju. Ista operacija ali preko razlicith instrukcija - to bi ukljucivalo promjenu SVIH registara u slucaju da zelis iskljuciti detekciju virusa baziranu na nekom "konacnom" (trenutnom) sadrzaju registara (i naravno sve signature-based, ali tko jos njih pravi :)

Mozda bi bilo dobro napraviti analizu message loopova koje generiraju bcc32/msvc i ostalih nekoliko popularnijih kompajlera za RAD alatiche, mozda je to obicni niz cmp, eax imm32, jz __msg_processor, a mozda ima nes zanimljivo. Odredjivanje lokacije pozivanja defaultnog message handlera mozda takodjer pomogne (e nemoj sad bas NJEGA patchati :).

E kako bi stvarno bilo kewl da netko napravi engine koji ce morfirati odredisni program na nacin da ce izmjeniti efektivnu uporabu SVIH registara (napraviti novu logiku izvodjenja ali sa ISTIM rezultatima), i naravno, rebuildati sve offsete i RVA... Mozda misfall 3.0? :))))
[ Pera_Anarhista @ 05.09.2003. 22:30 ] @
caos

evo, proucavam malo kod uz pomoc disasemblera i ovog ogromnog intelovog prirucnika... malo me buni ovo:

Code:

:00401202 E879FFFFFF              call 00401180


Koliko sam ja skapirao, treba da bude 401202h + 5 - 79h = rezultat adresa, ali ovde se oduzima jos 4 Bajta ( 202h-180h = 82h, 82h - 5 = 7Dh, 7Dh - 4 = 79h ). Zasto je to tako ?
[ Sundance @ 06.09.2003. 12:31 ] @
call $+5 ce kao razliku za skok enkodirati 00000000h, jerbo cijela instrukcija ima 5 bajtova (to je najjednostavniji slucaj). FFFFFFFF79h = -87h. Ako pocinjes od 00401202h, tada ce nova VA biti 00401202h + 5 - 87h = 00401180h. A odakle tebi 79h? :-)
[ Pera_Anarhista @ 08.09.2003. 11:35 ] @
eh, sada sam ja stvarno glup, ali... kako ovo :
Citat:

FFFFFFFF79h = -87h


??? ja sam razumeo da 79h ostaje -79h ??
[ Rapaic Rajko @ 10.09.2003. 13:24 ] @
Citat:
Pera_Anarhista:
eh, sada sam ja stvarno glup, ali... kako ovo :
Citat:

FFFFFFFF79h = -87h


??? ja sam razumeo da 79h ostaje -79h ??


Heh, signed integeri...najlakse ces ih ukapirati ako zamislis brojac koji ide unapred i unazad. Primer:
Code:

  00000000h = 0h;
  FFFFFFFFh = -1h;   // unazad za 1
  FFFFFFFEh = -2h;   // jos malo unazad
  FFFFFF79h = -87h; // malo vise unazad
  00000001h = 1h;     // a sad unapred


Pravilo je jednostavno: ako je najvisi bit postavljen na 1, broj je negativan i cita se kao komplement.
Znaci, sledi ovo:
Code:

  7FFFFFFFh - najveci pozitivan broj sa ovom notacijom (signed 4-bytes integer)
  80000000h - najmanji negativan broj sa istom notacijom


Pozdrav

Rajko
[ Pera_Anarhista @ 18.10.2003. 18:45 ] @
Pozdrav
Cisto bih hteo svima da se zahvalim na pomoci.

Profesor je odustao od pravljenja metamorfnog virusa i sada pravim samo jedan mali & simpatican polimorfni virus. Model Disasemblera u c-u je vec bio napravljen, pa ako nekome treba mogu da posaljem kod.
Takodje, ako nekome treba ceo rad na nemackom, neka se javi, pa mogu okaciti ovde.
[ Pera_Anarhista @ 22.10.2003. 16:15 ] @
pozdrav
metmorf nije tako tesko napraviti, vise su mental driller i onaj zombie iskomplikovali stvar... jesu njihovi virus bolji nego moja ideja, jer ima vise random situacija, manji su itd., ali evo kako sam ja mislio da napravim metamorfa:
ceo svoj virus napisem onakav kakav jeste, bez icega (samo do mesta gde treba da dodje infekcija !)
onda napravim funkcije unutar virusa InsertMovReg32Reg32 i slicne, gde je na primer ecx prvi argument, a edx drugi. Onda imam arej gde su mi registri (recimo RadniRegister, TempRegister, RezultatRegister itd.). onda ceo svoj virus prepisem sa tim novim funkcijama (InsertMovReg32Reg32 sam pravi par random varijanti), ukljucujuci i te funkcije. Nema problema sto se tice labela i apija, jer ja tacno znam gde sta dolazi, a takodje mogu i da odredima na odredjenim mestima random raspored. Jedini manjak je sto virus dobija na velicini i nije fleksibilan (ili jeste ?), tj., ovo nije engine, ali zato mislim da je mnogo jednostavnije, mogucnosti za greske su manje, debug je mnogo laksi itd. nema se problema da virus raste u velicini jer se on uvek iznova pravi. Velicina virusa bi bila uvek oko 11-12 puta veca (gruba procena kada bi programirao bez optimizacije, jer onda za svaku komandu treba minimum 4 i vise bajtova za argumente + 5 bajtova call) nego virus bez metamorfa (i sam metamorf mora da se ubaci preko call Insert ... funkcija). Teoretski bi moglo umesto polimorfa uraditi random kompresiju, ali ne znam bas kako bih to uradio.

Glavna prednost ovog nacina je lakoca programiranja - jednom kada sve Insert... funkcije rade, moze se napraviti php skripta koja ce ceo virus prevesti i onda je sve vec odradjeno.
[ Sundance @ 07.11.2003. 15:45 ] @
Pa to dobivanje na velicini i jest glavni problem. Ako virus uvijek naraste za jedan red velicine, nakon par infekcija bi postao potpuno beskoristan. Ako pak imas tu jednu maticnu verziju koja svaki put iznova gradi kvazi-metamorfnu kopiju, virus se ne moze razmnozavati u nove generacije bez maticne kopije koju, ako je samo dodas, prestaje biti metamorfna. I ja se slazem da je laksne napraviti specificni meta-engine koji bi samo na nekim offsetima koji se svaki put izracunaju zamijeni registre ubaci junk-code i sl. Ali je puno izazovnije napraviti genericki model. Ili pseudo asembler kao sto je MD napravio. Bolesno.
[ Pera_Anarhista @ 07.11.2003. 16:09 ] @
pseudo assembler nije tezak, i jos jednom te ohrabrujem da i ti probas :) ozbiljno, jednom kada skapiras kako funckionise pisanje komandi i citanje (sto ionako moras da skapiras ako pravis polimorf), skapirao si i metamorf. posle je sve jednostavno pretrazivanje po mustrama i zamena.
[ Sundance @ 10.11.2003. 16:39 ] @
Pa mozda i nije tako tesko. Nemam sad vremena se sa tim igrat. Jednog dana kad polozim Elektroniku 1...