============================================================================== =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- --------------------[ previous ]---[ index ]---[ next ]--------------------- ---------------------[ B00T SECT0R E B00T SECT0R ViRUSES ]-------------------- -----------------------------------[ b0z0 ]----------------------------------- boot sector e boot sector viruses scritto da b0z0/iKX, 10/6/99 1) intro Questo breve testo ha come scopo quello di far capire tecnicamente cosa succede una volta acceso il vostro pc, quando dopo i vari test del bios viene caricato il sistema operativo. La prima parte si soffermera' sul funzionamento generico del bios alla fine dei check iniziali e del funzionamento e della struttura del boot, dando cosi' nozioni sufficenti a chiunque a scrivere un boot loader personalizzato. Nella seconda parte verranno discussi aspetti che riguardano invece piu' direttamente i boot virus che, per quanto siano ormai leggermente superati con l'avvento dei sistemi operativi piu' recenti, sono alquanto interessanti e forse per certi versi piu' istruttivi di altri tipi di virus. 2) il bootstrap Una volta fatti i vari test del mega, il bios carichera' il sistema operativo tentando di leggere dal disco rigido il primo settore (traccia 0, testina 0, settore 1) mettendolo all'indirizzo di memoria 0:7c00h. In caso questo non fosse possibile (se il hd non fosse presente) il bios andra' a leggersi il primo settore del floppy e cerchera' di metterlo sempre nella stessa zona di memoria (e' chiaro che da bios si puo' anche cambiare la sequenza di ricerca della periferica da usare per prima). Letto un settore il bios controlla che l'ultima word del settore sia uguale a 0aa55h. Se questo valore corrisponde allora il bios considera il boot sector valido (in caso non lo fosse probabilmente c'e' un disco non bootabile o qualcosa del genere) e quindi passa l'esecuzione all'indirizzo 0:7c00h, ovvero al boot sector appena caricato (quindi cs<-0 e ip<-7c00h). da qui in avanti tutto e' in mano al codice del settore (del floppy o del disco) caricato. Al momento del passaggio del bios dell'esecuzione al boot sector i registri possono contenere qualsiasi cosa, tranne DL che contiene il numero del drive dal quale e' stato eseguito il boot (0 hd, 1 floppy a). ottima cosa da fare dunque (cosa che troverete in qualsiasi boot) e' settare lo stack in modo tale che non vada a cancellare il vostro codice. In genere, dato che lo stack cresce in giu', si setta ss:sp a 0:7c00h e cosi' non ci sono prob di sovrascriversi. C'e' da notare che fino a questo punto non e' stato caricato ancora nessun sistema operativo, quindi non disporrete di chiamate all'int 21h del dos o roba del genere, ma bensi' soltanto degli interrupt che vi offre il bios, quindi quelli fino al 1fh piu' alcuni altri (vedetevi una interrupt list), facendo diventare leggermente piu' difficile qualsiasi operazione vorreste fare. Oltre agli interrupt che vi offre il bios potete disporre delle sue strutture, che si trovano al segmento 40h. 2a) struttura del master boot record Il primo settore del disco rigido viene chiamato master boot record (mbr da qui in avanti) e contiene informazioni alquanto importanti. All'offset 01beh del settore infatti c'e' la tabella delle partizioni (pt da qui in avanti), che contiene le informazione della partizionatura del disco. Per come strutturata la pt contiene al massimo 4 partizioni, ognuna delle quali e' descritta da 10h bytes. In questi sedici bytes possiamo trovare dove la partizione inizi e dove finisca, che sistema operativo e' installato (beh, un numeretto che dovrebbe indicarlo) e se questa partizione e' attiva (x + info sulla struttura esatta delle entry della pt prendetevi una qualunque reference tecnica). Il resto del mbr e' codice che, in base a qualcosa (un'interazione con l'utente per esempio se avete un loader tipo il lilo, o semplicemente la scelta della prima partizione attiva se avete un mbr tipico del doz) scegliera' la partizione dalla quale andare a leggere il primo settore per poi caricarlo ed eseguirlo. In genere il codice del mbr si copiera' da qualche altra parte in memoria e poi carichera' il boot sector della partizione scelta di nuovo sul solito 0:7c00h. Anche i parametri passati nei registri sono di norma gli stessi (dl settato al disco dal quale e' stato eseguito il boot) e quindi potete subito notare come l'operare sul mbr o su un boot di una partizione sia poi abbastanza simile per certi versi. 2b) struttura del boot generico Il boot di una partizione contiene invece di solito il codice vero e proprio per lanciare il sistema operativo. Nell'esempio del dos qui troverete il codice che carichera' i file di sistema (i due .sys insomma) che poi vanno ad offrire determinati servizi. Su questo settore possono essere anche presenti dati riguardanti il file system presente sulla partizione. In caso di un s.o. che usa la fat qui troverete ad esempio, dal terzo byte fino al trentunesimo, le informazioni su dove inizi la fat (file allocation table, la struttura dati che raccoglie informazioni su che settori siano utilizzati o meno insomma), quanto sia lunga etc. Essendoci dal terzo byte fino al trentunesimo dati da conservare, dato che il codice viene dato all'inizio del settore una volta caricato, i primi due bytes sono sempre un jump short oltre i suddetti dati. 2c) struttura del boot floppy La struttura del boot sector, del primo settore dunque, del floppy e' praticamente la stessa della struttura del boot di una partizione. E' chiaro che i dati riguardanti il file system sono differenti per le diverse capacita' dei due. 2d) accenni pratici Da quanto scritto sopra con un po' di buona volonta' e documentazione piu' tecnica credo che chiunque possa essere adesso in grado di personalizzare il proprio disco in base alle esigenze. Per facilitare un po' i concetti ed il lavoro faro' qualche esempio pratico. NB: il codice presentato non e' stato testato e potrebbe neanche compilare, non ho voglia di mettermi a testarlo. E' presentato come esempio sul quale il lettore si metta a capire e a lavorare, non come codice da utilizzare cosi' com'e'. Beh, una cosa stupidissima adesso. Un piccolo loader che verra' messo al posto del mbr che vi chiedera' una password, ed in caso di successo carichera' normalmente il mbr originale. In caso contrario aspettera' finche' non verra' immessa la password giusta. Supponiamo che la mbr originale sia stata salvata sul settore 0,0,2. E' interessante infatti che la prima traccia intera, tranne il primo settore dove c'e' appunto il mbr, sia inutilizzata, e quindi puo' venire utilizzata da voi. org 7c00h ; dato che andra' messo la su ; per il compilatore start: cli xor ax,ax ; mettiamo ss:sp a 0:7c00h mov ss,ax ; per non cancellarci mov sp,7c00h mov es,ax ; ci servira' dopo sti push cs pop ds mov si,offset pass ; punto si alla chiave testa: mov ah,10h ; leggi un tasto da kbd in al ed int 16h ; eventualmente aspettane uno cmp al,byte ptr [si] ; controlla la lettera je prossimo mov si,offset pass ; ricomincia da capo se lettera jmp testa ; errata prossimo: ; vai alla prossima lettera inc si cmp byte ptr [si],00h ; finita la pass? jne testa mov ax,201h ; leggi un settore mov bx,7c00h ; a es:bx, cioe' a 0:7c00h mov dx,80h ; dx e cx contengono il settore mov cx,2h ; da leggere, cioe' 0,0,2 da hd mov ds:[7c00h-2],13cdh ; qui mettiamo un cd13h, cioe' un jmp start-2 ; istruzione "int 13h" all'indir. ; 0:7c00h-2 e saltiamo li. in questo modo verra' eseguita l'istruzione ; (che per come abbiamo impostato i parametri sopra leggera la mbr ; originale) e poi il codice continuera' su 0:7c00h, ovvero dove sara' ; letta la mbr originale. e' solo un trucco abbastanza stupido per non ; usare buffer aggiuntivi senza fare casini pass db 'sad36',0 ; stringa finita da 0 org 7dfeh mark db 055h,0aah ; senza questi il bios non vi caga end start Beh, l'esempio piu' o meno dovrebbe andare, non sono state usate strane cose, ma solo applicate le cose dette prima. Noterete che utilizziamo solo l'int 16h (per servizi della tastiera) e l'int 13h (x il disco) che sono forniti dal bios. Volendo mostrare una stringa non potremmo utilizzare la 09h del int 21h come sotto dos ad esempio, ma dovremmo utilizzare le chiamate dell'int 10h (i servizi video del bios). Una volta compilato per installarvi questo semplicemente potete utilizzare un qualcosa come il diskeditor o qualcosa come questo appeso prima del codice del boot sector (quindi prima dell'org 7c00h) dovrebbe andare: org 100h ; verra' un com mov ax,201h ; leggi un settore mov bx,offset buffo ; metti su es:bx, cioe' cs:buffo mov dx,80h ; leggi il mbr originale mov cx,1h int 13h mov ax,301h ; scrivi un settore mov bx,offset buffo ; dal buffer con il mbr letto mov dx,80h ; salva la mbr su 0,0,2 mov cx,2 int 13h mov ax,301h ; scrivi un settore mov bx,7c00h ; dove, se seguite le istruzioni ; c'e' il mbr modificato mov dx,80h ; al posto del mbr mov cx,1 int 13h int 20h ; fine buffo db 512h dup(?) Comunque basta che capiate l'idea... il codice sopra legge la mbr originale nel buffer e poi lo riscrive sul hd al 0,0,2. Dopo scrive, leggendo da cs:7c00h (dove si suppone ci sia il resto del codice che e' quello sopra) il nuovo mbr. Occhio che il codice sopra puo' (probabilmente non lo e') non essere esente da problemi, essendo stato scritto velocemente e senza alcun ricontrollo, ma il disco cmq e' vostro. Notate anche che da quanto abbiamo fatto sopra non ricopiamo la tabella delle partizioni dalla mbr originale e quindi, in caso poi una volta installato qualcosa come l'esempio sopra, andiate a bootare con un floppy normale comunque il disco risultera' non contenere alcuna partizione e quindi non potrete accedere alle strutture logiche sul disco. Questo puo' essere un bene o un male, dipende da quello che volete fare. Cmq per rendere cmq visibili le partizioni da un boot diverso dal vostro modificato basta copiare la tabella delle partizioni sul vostro nuovo settore, niente di piu' facile. Una cosa simile succederebbe se sovrascriveste un boot di un partizione o di un floppy senza lasciare i dati del filesystem (detto sopra). Un tale floppy funzionerebbe solo se bootato da se stesso, mentre risulterebbe illeggibile in caso contrario. Dovete anche notare che certe parti del disco, tipo i dati della fat nel boot sector, possono essere necessari piu' spesso e non solo alla prima lettura e quindi dovreste modificare il programma di cui sopra in modo tale che renda sempre disponibili almeno i dati strettamente necessari. Con l'esempio del nuovo mbr di sopra infatti se per caso un qualche programma (tipo il fdisk ad es) vorrebbe andare a leggere la pt non troverebbe nulla essendoci in realta' in vostro codice. 2e) conclusioni prima parte Non c'e' piu' molto da dire per applicazioni alquanto facili che partano da boot, infatti e' abbastanza facile farne con queste piccole nozioni. In genere i problemi che possono nascere nella scrittura di certi programmini sono la limitatezza dei servizi che avete a disposizione dato che non e' stato caricato ancora il sistema operativo. Non potete farci molto, dovete usare quello che c'e' con un po' di astuzia. Un altro problema e' quello della limitatezza dello spazio. Un settore e' in genere lungo 512 bytes e in tale spazio non potete mettere molto codice. Nessuno vi vieta di usare piu' settori comunque, basta che poi andiate a leggerveli da soli con il primo, che e' l'unico che gia' viene caricato dal bios all'avvio. 3) boot virus Qui vedremo un po' quali sono le differenze tra i classici virus residenti per file e un boot virus. Si suppone il lettore abbia un minimo di dimestichezza con altri tipi di virus e che abbia capito come funzioni il processo di boot. 3a) residenza Come andare residenti. Al momento del boot, come gia' detto parecchie volte, non avete ancora il sistema operativo e quindi non potete usare chiamate all'int 21h per andare in memoria ne' manipolare i mcb ne' niente del genere. Un metodo classico e' quello di diminuire la memoria disponibile al sistema vista dal bios (e quindi da tutto quello che verra' caricato dopo) dello spazio necessario e mettere li' il virus. Il numero di kb di memoria disponibili (di solito 640kb) si trova all'indirizzo 40h:13h, cioe' tra i vari dati del bios. Diminuite questo numero di quanto necessario e quindi per trovarne l'indirizzo fisico dove copiare il virus vi basta moltiplicare i kb restanti per 64. Quindi, es: sub ax,ax mov ds,ax mov ax,word ptr [413h] ; cioe' 0:413h o 40h:13h sub ax,3 ; ci servono 3kb mov word ptr [413h],ax ; metti nuova mem disponibile mov cl,6 ; * 64 per avere il segmento shl ax,cl ; dopo questo mem disponibile e' ; in ax:0 Alternativamente, per quanto sia piu' rischioso, potete utilizzare per il vostro virus spazio in mem che crediate sia inutilizzato, tipo parte della ivt. o potete stare in un tal spazio finche' non parte il dos e poi andare residenti con i soliti metodi tramite dos. vedete voi. 3b) hooking di chiamate Una volta residenti in memoria si presuppone vogliate in qualche modo ricevere comando a determinati eventi. Per la riproduzione di boot virus chiaramente vorrete hookare chiamate a scritture/letture su dischetti o dischi che andrete ad infettare. L'interrupt che gran parte dei programmi usano per questo lavoro e' l'int 13h, che quindi andrete a hookare nei soliti modi (ovviamente manipolando direttamente la ivt dato che non avete la get/set interrupt vector dell'int 21h). xor ax,ax mov ds,ax ; sulla ivt mov si,13h*4 ; int13h nella ivt mov ds:[si],es ; segmento del virus (supp. es) mov ds:[si+2],bx ; e offset del handler (supp. bx) Ovviamente il segmento e l'offset del handler devono riferirsi a quello che sta residente in memoria e non al codice a 0:7c00h che e' stato caricato e che verra' probabilmente cancellato. E' anche ovvio che prima di settare il vostro handler salverete quello vecchio per passargli il comando quando avrete finito. Una volta hookate, qui andrete a controllare se l'utente legge o scrive su possibili vittime e farete il lavoro necessario. Guardatevi una lista degli interrupt per vedere cosa potrebbe interessarvi, di solito le letture o scritture (ah=02 o 03) sul boot sector del floppy (intercettare tutte le letture su un floppy per provare ad infettarlo farebbe leggermente troppo casino, dato che per ogni file vengono eseguite molte letture. Siete cmq sicuri che il boot del floppy venga letto perlomeno alla prima lettura da floppy dato che il dos deve leggersi i dati relativi alla fat). Ricordatevi ovviamente che con dispositivi lenti specie il floppy seekare troppo di qua e di la (per andare a leggervi il boot per vedere se e' infetto) puo' insospettire. 3c) infezione L'infezione del disco rigido e del floppy e' semplice. Una volta constatato che questo non e' ancora infetto (con un marker o che altro) salvate il boot (o mbr, in base a quello che volete fare) da qualche parte (vedi prossima sezione), copiate (se ritenete necessario, dipende dalla vostra idea di come fare il tutto) i dati che vanno tenuti (tipo la pt o i dati del boot sector) vicino al vostro virus e poi scrivete il nuovo boot sector al suo posto. 3d) salvataggio e ripristino boot/mbr originale Una domanda ovvia e' dove potete salvare il boot/mbr originale ed eventualmente pezzi del vostro virus in caso questo non stia in un solo settore. Quando infettate dischi rigidi questo problema non si pone, dato che abbiamo detto in precedenza che come minimo avete tutta la prima traccia libera, tranne il primo settore, e quindi di spazio ce ne dovrebbe essere in abbondanza. Quando vi trovate su floppy non disponete di tale spazio. Le tecniche da utilizzare in questo caso sono varie e ne esistono anche molte altre: - scrivere il virus alla fine della root directory (la struttura che contiene la struttura delle dir e del file presenti). Essendo questa disposta ad ospitare un gran numero di file, che in genere non ci sono, ha spesso spazio inutilizzato alla fine. - scrivere il virus in un settore qualsiasi del disco a vostro piacimento e segnare quei settori come danneggiati nella fat. In tal caso il s.o. semplicemente non scrivera' su quel settore. - scrivere il virus sulla fat secondaria (se c'e') che non viene quasi mai utilizzata (potete dire al floppy che ce n'e' una sola cambiando i dati nei famosi primi bytes del boot) tranne che da prog diagniostici o roba simile. - scrivere il virus da qualche parte del floppy che si spera sia vuota (tipo l'ultima traccia) eventualmente dopo aver checkato la fat. - formattare una traccia extra e mettercelo li' al sicuro (vedi qualche doc a riguardo) Certe tecniche vi offrono maggior sicurezza che i dati non vengano sovvrascritti da altre cose a costo di codice aggiuntivo necessario, la scelta e' vostra. Per quanto riguarda il ripristino del settore originale il discorso e' simile a quello esposto prima sopra nella parte generica. Quando avete finito di caricare il virus come volevate, rileggete su 0:7c00h (occhio a mantenere il registro dl) il settore originale e gli passate il controllo. 3e) stealth Fare lo stealth (di un certo livello) su boot sector virus e' abbastanza facile. Infatti nel vostro int 13h handler semplicemente se vedrete che qualcuno va a leggere o a scrivere un settore infetto lo ridizionerete (basta che nel vostro handler dell'int 13h modifichiate i registri cx e dx che contengono le info sul settore dal leggere prima di passare alla chiamata originale) in cambio il settore originale salvato da qualche parte. 3f) problemi con la scrittura al mbr Un problema tipico con schede madri non troppo vecchie e' la protezione in scrittura che avete gia' a disposizione nel bios. Per quanto molti produttori sventolino questa come una cosa evoluta in verita' non fa altro che darvi una finestra in caso qualcuno tenti di scrivere sul mbr usando l'int13h. Per saltare questa protezione ci sono due modi: -) scrivere su disco con le porte invece dell'int13h. per i dischi ide ad esempio vedetevi come fare su qualche tech ref vedendo le porte 1fxh. Puo' essere fatto molto elegantemente in poco spazio, ma e' incompatibile con dischi scsi o simili. -) disabilitare la protezione del bios. Va fatto ancora con le porte ma cambia da bios a bios (ami, award...) e quindi consuma spazio, ma funziona. (vedetevi il ralph brown per le desc tecniche). 4) informazioni Materiale piu' strettamente tecnico di corredo potete trovarlo in una ibm technical reference, in una dos technical reference e ovviamente nelle ralph brown interrupt list. Per sorgenti di esempio, approfondimenti e trucchi vari vi rimando alle varie zines di vx in circolazione. Cmq per eventuali domande o richieste di materiale vario potete contattarmi a cl0wn@geocities.com o su irc. 5) quello che doveva venire all'inizio Come da standard pIGpEN, ma messo in fondo cosi' verra' possibilmente saltato da piu' persone: dedicato a: monica b. greets: pigpen, smaster, darkman, ikx ppl musica: placebo/placebo, placebo/wyin consumo: qualche boccata d'aria L'italiano del testo di sopra fa pena, l'importante probabilmente e' il contenuto. Cmq ho la scusa che non parlo spesso italiano, come del resto neanche altre lingue. b0z0 --------------------[ previous ]---[ index ]---[ next ]--------------------- =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ==============================================================================