Virușii au devenit o parte integrantă a vieții noastre de calculator (și nu numai). Pentru a scrie acest articol mi-a determinat ce, în opinia mea, nu există suficiente informații pe web, prezentând cel mai mult pe deplin toate procesul de scriere a unui virus. Cel mai recent, am nevoie pentru a scrie un program samorasprostranyayuschuyusyu simplu, care nu ar produce nici o acțiune nocivă a sistemului, dar în același timp, s-ar fi folosit mecanisme de propagare virale. Voi spune că, în același timp, există informații pe Internet pe această temă. Și chiar există surse de astfel de programe. Dar în tot ceea ce este necesar să înțelegeți îndelung și persistent, dacă doriți să faceți ceva singur. Deci, în ceva mai mult sau mai puțin înțeles, vreau să împărtășesc cu tine - cititori - informații.
Acest articol va discuta despre procesul de scriere a unui virus simplu care infectează fișierele executabile ale formatului EX (Portable Executable) EXE. De asemenea, scrieți un program de medic care caută directorul specificat și toate subdirectoarele pentru fișierele infectate cu virusul nostru.
Dacă nu sunteți de acord cu acest lucru, vă rugăm să opriți să citiți acest articol și să îl eliminați din toate materialele disponibile.
Pe scurt despre formatul PE
Deci, dacă te uiți într-un executabil tipic, vom vedea următoarea structură într-o formă simplificată:
Fișierul PE la început (MZ-header) conține un program pentru sistemul de operare DOS. Acest program este numit stub și este necesar pentru compatibilitatea cu sistemul de operare vechi. Dacă vom rula PE-fișier în cadrul sistemului de operare DOS, sau OS / 2, afișează un șir de text consola care informează utilizatorul că programul nu este compatibil cu această versiune a sistemului de operare. Un programator poate conecta orice program DOS, de orice dimensiune, la conectare. După ce acest program DOS merge structură, care se numește IMAGE_NT_HEADERS (PE-header). Această structură este descrisă după cum urmează:
Primul element al IMAGE_NT_HEADERS este semnătura fișierului PE. Pentru fișierele PE trebuie să aibă valoarea "PE \ 0 \ 0". Apoi vine o structură numită antet de fișier și definită ca IMAGE_FILE_HEADER. Antetul fișierului conține cele mai comune proprietăți pentru un fișier PE dat. După antetul fișierului există un antet opțional - IMAGE_OPTIONAL_HEADER32. Acesta conține parametrii specifici ai acestui fișier PE. După antetul opțional, începe tabelul secțiunilor (tabelul de obiecte). Conține informații despre fiecare secțiune. După tabelul secțiunilor, datele inițiale ale secțiunilor sunt valabile. La sfârșitul fișierului PE, puteți scrie orice informație și de aici funcționarea programului nu se va schimba (dacă nu există controale de control de cont sau ceva de genul asta).
Modalitati de a infecta PE
Până acum nu am spus nimic despre cum vom infecta dosarul, deoarece există mai multe dintre ele:
- Implementarea antetului PE
- Extinderea ultimei secțiuni
- Adăugarea unei secțiuni noi
Pentru virusul nostru de formare, cea mai simplă metodă de extindere a ultimei secțiuni este potrivită. Trebuie să spun că marile dezavantaje ale ultimelor două metode este că dimensiunea fișierului țintă crește considerabil în timpul infecției, deoarece Adăugăm codul de virus la sfârșitul fișierului. Deși spune, că a doua metodă poate fi pervertită, astfel încât să fie în măsură să scrie într-o suprapunere goală la sfârșitul ultimei secțiuni, astfel încât dimensiunea fișierului poate schimba ușor sau nu sa schimbat deloc. La prima metodă nu se schimba dimensiunea fișierului, dar dezavantajul acestei metode - nu este întotdeauna posibil de a găsi un EXE, astfel că titlul său era suficient spațiu pentru codul nostru a virusului. Trebuie fie să infectăm un număr foarte mic de programe, fie să limităm sever capacitățile virusului nostru, deoarece acest lucru reduce dimensiunea codului său. Metoda de a adăuga o secțiune nouă este un pic mai complicată, deci nu o vom lua în considerare. Voi spune doar că fișierul cu orice secțiune nouă va arăta mai suspect.
Pentru ca noi să scriem virusul nostru, este suficient să știm că dacă infectăm un fișier, trebuie
modifica unele valori (ceea ce - citiți mai jos) în PE-antet, modificați descriptorul ultimei secțiuni, adăugați codul virusului nostru la sfârșitul ultimei secțiuni, și de a schimba punctul de intrare al programului, astfel încât să se controleze atunci când este rulat trecut la primul virus nostru, și numai atunci - programul în sine. Următoarea ilustrație de culoare roșie indică părțile din dosar care urmează să fie modificat în timpul infecției:
Calculați deplasarea deltei
Pentru ca virusul nostru să funcționeze, acesta trebuie scris într-un cod independent de bază. În acest sens, există încă un concept - delta-offset.
Există multe metode de căutare a bazei de date kernel32, dintre care unul utilizează SEH (Excepție Structurată)
Manipularea).
Deci, am definit deplasarea deltei. Aici este codul de căutare pentru baza de date kernel32:
Acum, luați în considerare câteva dintre câmpurile de antet PE de care avem nevoie:
Și când căutăm funcția de care avem nevoie, nu vom compara numele, ci valorile hash ale numelor (după ce am calculat această valoare pentru fiecare funcție de care avem nevoie). Ie să spunem că am găsit un nume în tabelul de nume kernel32. Calculăm valoarea hash a acestui nume și comparăm această valoare cu hash-ul HashTable din tabelul nostru. Dacă coincid, atunci au găsit-o. Dacă nu, căutați
în continuare:
Dar cum putem calcula în prealabil valoarea hash-ului unui anumit nume? Pentru aceasta, am scris un mic program în Visual C ++ cu un insert de asamblare, un link la care pot fi găsite la sfârșitul articolului (cu codul sursă).
Structura generală a codului virusului
Toate cele de mai sus au fost doar un preludiu pentru scrierea virusului nostru. Acum începe distracția. Vom scrie virusul pe MASM. De ce prefer acest pachet? Îmi place foarte mult.
Să scriem un fișier common.asm, care va include părți separate ale codului:
Privind la acest cod, puteți pune cel puțin două întrebări:
- de ce avem nevoie de macro-ul szText?
- de ce conectați biblioteca kernel32.lib și apelați funcția ExitProcess înainte de eticheta inițială?
Distribuiți acest articol cu prietenii dvs.: