I file eseguibili possono avere solo due formati: COM ed EXE. Il file in formato COM è una
eredità del DOS 1.0, mentre il formato EXE è nato in seguito. La differenza principale è
che un file COM non può essere più lungo di 64K e mantiene stack, dati e codice insieme.
Un file EXE, invece non ha limitazioni sulla dimensione e mantiene separati stack, dati e codice.
L'estensione del nome del file non sempre corrisponde al suo formato, infatti, il DOS stabilisce che
si tratta di un file in formato EXE guardando i primi due byte del file, se questi corrispondono
ad MZ o ZM,
allora si tratta di un file EXE, altrimenti si tratta di un file COM.
I file COM ed EXE sono infettati in modo diverso: quindi un virus prima di infettare un file deve stabilirne il formato. I virus possono risolvere il problema in due modi: analizzando l'estensione o analizzando l'header (come il DOS). Il primo metodo può generare degli errori, perché, un file pur avendo estensione COM può avere formato EXE e viceversa. Ciò può portare ad una infezione sbagliata che non danneggia il virus, ma non da più la possibilità agli anti-virus di ripristinare il file originale.
I file virus si diffondono inserendosi nel corpo del file vittima. Ci sono tre possibilità: all'inizio del file (prepending), alla fine del file (appending) o nel mezzo.
Vi sono varie possibilità per inserire un virus nel mezzo di un file eseguibile, per esempio, può essere inserito nella stack area o in una porzione di codice non utilizzata o spostando un pezzo di codice da un'altra parte e inserendosi nel buco così creato.
Figura 4: Prepending: primo modo
Figura 5: Prepending: secondo modo
Figura 6: Prepending: terzo modo (overwriting)
Per inserire il virus all'inizio del file ci sono tre modi. Il primo (vedi figura 4) consiste nel creare uno spazio vuoto iniziale, ricopiando e risistemando il codice originale del file dopo questo spazio, quindi il virus si copia nello spazio libero. Il secondo (vedi figura 5) consiste nel avere l'immagine del virus in memoria e di accodare a questa l'immagine del file da infettare e salvare poi sul disco il tutto. Il terzo (vedi figura 6) constiste nel sovrascrivere col codice del virus l'inizio del file, chiaramente ciò distrugge il file originale.
Alcuni virus, che infettano i file usando il primo o il secondo metodo, scrivono anche un blocco di informazioni alla fine del file (per esempio, il virus ``Jerusalem'' [Hof96] con questo blocco distingue i file infetti da quelli non infetti). L'inoculazione del virus all'inizio del file è spesso usata dai virus che infettano i file eseguibili in formato COM. Il modo più comune usato dai virus per infettare i file è attaccarsi alla loro fine. Il virus modifica l'inizio del file in modo che venga eseguito prima il codice del virus e poi quello del programma ospite.
Figura 7: Inoculazione di un virus alla fine del file
Offset | Nome | Dim. | Commento |
00 | Signature | 2 byte | Sempre 4Dh5Ah |
*02 | Last Page Size | 1 word | Numero di byte nell'ultima pagina |
*04 | File Pages | 1 word | Numero di pagine da 512 byte |
06 | Reloc Items | 1 word | Numero di entrate nella tabella di rilocazione |
08 | Header Paragraphs | 1 word | Dim. dell'header in numero di paragrafi (16 byte) |
0A | MinAlloc | 1 word | Minimo spazio di memoria richiesto in paragrafi |
0C | MaxAlloc | 1 word | Massimo spazio di memoria richiesto in paragrafi |
*0E | PreReloc SS | 1 word | Valore Stack segment (SS) prima della rilocazione |
*10 | Initial SP | 1 word | Valore iniziale del registro SP |
12 | Negative checksum | 1 word | Sempre Ignorato |
*14 | PreReloc IP | 1 word | Valore iniziale del registro IP |
*16 | PreReloc CS | 1 word | Valore Code segment (CS) prima della rilocazione |
18 | Reloc Table Offset | 1 word | Posizione della tabella di riloc. dentro l'header |
1A | Overlay Number | 1 word | Ignorata se non è un overlay |
1C | Reserved | 2 word | Informazioni sul linker |
In un file COM (vedi figura 7), nella maggior parte dei casi, ciò è ottenuto modificando i primi tre (o più) byte del codice, inserendo una istruzione di JUMP (salto) al corpo del virus e copiando i byte originali prima di alterarli.
In un file EXE (vedi fugura 7), ciò è ottenuto alterando la parte formattata dell'header (vedi tabella 1). Si modifica l'indirizzo di inizio (CS:IP) in modo da farlo puntare all'inizio del virus, si modifica la lunghezza del modulo eseguibile (offset 02h e 04h) e si modifica anche il puntatore iniziale allo stack. Il valore originale di ogni entrata modificata viene conservato per dare la possibilità al virus di far eseguire poi il codice del programma portatore.