==============================================================================
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
--------------------[ 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 ]---------------------
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
==============================================================================