Copy Link
Add to Bookmark
Report
Vana Imago 2 31
Techno Knight presenta.... *************************************** COME CREARE UN VIRUS PER WINDOWS 9x Le domande + domandate *************************************** di Techno Knight Suppongo (diciamo pure _SPERO_) che tra voi ci sia molta gente che sta cominciando a programmare virus, e probabilmente non capir
come fare a creare un virus per Windows 9x. Bene, cio male, Windows 95 stato pensato proprio per essere ininfettabile, ma zio Bill ha fatto i conti senza l'intelligenza dei coderz. Vediamo quali sono le domande + comuni per chi si avvicina alla programmazione virale.... 1) E' possibile fare l'appending ai PE ? Il formato dei PE (gli eseguibili di windows) fatto in modo da essere + difficile da infettare che i normali .EXE del DOS. Tuttavia cmq abbastanza semplice, e non intendo + parlarne, dato che ho gi
scritto un articolo che lo spiega nello scorso numero di Vana Imago 2) Perch il mio virus da un errore di pagina non valida ? Sotto windows esistono differenti livelli di protezione per le zone di memoria, ve ne accorgerete quando tenterete di eseguire del self-modifying code e inesorabilmente verrete umiliati dal solito errore di pagina non valida. Quando scriviamo un prog per windows in .data dovremmo mettere tutte le variabili inizializzate, e in questo modo potremmo scriverci sopra, ma purtroppo per un virus questo non possibile, perch quando infetteremo un file, non avremmo + il nostro bel .data con le variabili, quindi non mettere mai dei veri dati in .data (a meno che non sia robba che serva solo al capostipite). Rimane per il fatto che non possiamo scrivere in .CODE. A questo si rimedia chiamando l'API VirtualProtect, di Kernel32.dll. La sintassi : CALL VirtualProtect,OFFSET di Inizio,Lunghezza,modo,puntatore OFFSET di Inizio indica l'inizio della zona della quale si vuole cambiare la protezione, lunghezza indica per quanti bytes da OFFSET di Inizio si estende la zona di memoria, modo indica il modo di protezione (nel nostro caso 4) e puntatore punta ad una zona di memoria dove saranno salvati i dati contenuti (baahhh) Quindi : Start : CALL bohbah bohbah: POP EBP SUB EBP,OFFSET bohbah LEA EAX,[EBP+OFFSET Start] MOV ECX,OFFSET Fine-OFFSET Start CALL VirtualProtect,EAX,ECX,4,0 ecc.ecc.ecc.. Fine: 3) Che cazz questo delta offset ??? La domanda + frequente che mi fanno i miei amici che stanno cominciando. Semplicemente pensa questo, se hai scritto ad esempio : MOV EAX,OFFSET dopll Al momento dell assemblaggio OFFSET dopll verr
sostituito con l'indirizzo di dopll. Finch esegui il capostipite, allora nessun problema, perch l'indirizzo corrisponde effettivamente, ma gi
dopo la prima infezione l'OFFSET di dopll sar
diverso, quindi in realt
in EAX sar
spostato sempre quel valore, che per non corrisponde + all'indirizzo di dopll!!! Noi per sappiamo che quel valore corrisponde all'indirizzo di dopll rispetto all'inizio del virus (infatti nel capostipite l'inizio del virus 0 quindi l'indirizzo corrisponde), quindi non dobbiamo fare altro che trovare l'indirizzo di inizio del virus e sommarlo all'OFFSET originale di dopll. L'indirizzo di inizio del virus viene appunto chiamato Delta Offset. Ecco come trovarlo : CALL ProceduraFittizia ProceduraFittizia: POP EBP SUB EBP,OFFSET ProceduraFittizia Quando il CALL chiama la procedura fittizia l'indirizzo di ProceduraFittizia viene messo nello stack, quindi non resta che cacciarlo fuori e sottrarre l'indirizzo che aveva la label nel capostipite. E' ovvio che alla prima infezione EBP sar
uguale a 0, quindi tutti gli offset corrisponderanno. Ecco, EBP da ora in avanti sar
il nostro delta offset. Quindi mai scrivere : MOV EAX,OFFSET eee Ma invece : LEA EAX,[EBP+OFFSET eee] (Se non conosci l'asm magari ti starai domandando come mai con POP EBP otteniamo l'offset dell'etichetta. In pratica quando la CPU esegue un CALL salva nello stack l'offset dell'istruzione immediatamente seguente al CALL, in modo che il RET sapr
dove ritornare. In questo caso salver
quindi l'offset dell'istruzione POP EBP, che corrisponde a quello della label...) 4) Come faccio a chiamare le API di Windows in un virus ? E adesso veniamo al problema + spinoso...le API Un normale programma per windows di solito ha una import table, che al momento dell'esecuzione viene riempita con gli indirizzi delle API chiamate dal programma. Un virus non pu avere una import table, perch dopo la prima infezione cmq si ritroverebbe con la import table non sua, ma della vittima. Come fare ? Una soluzione sarebbe utilizzare la import table del file "ospite" (che quindi contiene gi
gli indirizzi delle API, perch in esecuzione), e sperare che il file ospite importi due API : GetModuleHandleA e GetProcAddress, la prima serve a sapere l'indirizzo in memoria di un modulo, la seconda l'indirizzo delle funzioni. Quindi bisognerebbe scannare la import table alla ricerca degli indirizzi di queste due funzioni, ma potrebbe sempre accadere che il programma non importi queste due API, quindi saremmo al punto di prima, ed ecco la seconda soluzione : avere memorizzati nel virus gli indirizzi del kernel e delle varie API che ci interessano. Attenzione, perch questi indirizzi cambiano tra Windows 95, Windows 98 e la prima versione beta di Windows 95. Allora, della beta di win95 non ce ne fotte un cazzo, quindi non ci resta che trovare il kernel sotto Windows95 e Windows98, quindi prendete hacker view, aprite kernel32.dll e cercate la stringa (lo dico in esadecimale :) : 9C FC 50 53. Segnatevi l'indirizzo dove comincia questa stringa. Adesso con il w32dasm disassemblate kernel32.dll e nella lista delle export cercate tutte le API che vi interessano, e segnatevi l'indirizzo di ognuna (cominciano con BFF...). Adesso per chiamare un API pushate l'indirizzo dell'api e poi saltate all'indirizzo del kernel, trovato prima. Come ho detto gli indirizzi del kernel e delle api cambiano tra win95 e win 98. Quindi il vostro virus dovr
per prima cosa controllare entrambi gli indirizzi possibili del kernel, e determinare se sta girando sotto win95 o sotto win98, e in base a questo utilizzare indirizzi differenti per le API. Se non vi va di trovare tutti gli indirizzi delle API in entrambi i kernel (che pallllleeee!!!) potreste copiarli pari pari dal mio virus "SaBoTaGiO", che usa appunto questo pallosissimo metodo, per c' un piccolo problema : non ho ancora distribuito il sorgente del virus, e non intendo farlo :)) quindi potete solo provare a disassemblarlo, ma a questo punto tanto vale che andate a disassemblare kernel32.dll .... 5) Come si fa ad eseguire il codice originale del file infettato ? Semplice, se avete appendato per bene basta fare la somma del vecchio entrypoint del file + l'Image Base (cio dove il file viene caricato in memoria), e saltare all'indirizzo ottenuto. Se non sapete dove stanno l'entrypoint e l'image base vi rimando al mio articolo sui PE sul numero 1 di VI. Techno Knight (techno83@freemail.it)