Per rilevare la presenza di un virus in un sistema, bisogna trovare il codice del virus in memoria (se c'è) e cambiarlo in modo che il virus non possa più accedere ai file e/o settori mentre lo si cerca. È necessario scegliere la mask del virus, e definire le eventuali varianti di tale mask. La mask è quella parte del virus che si occupa di gestire gli interrupt agganciati dal virus. Per stabilire l'indirizzo della mask è necessario analizzare l'algoritmo del virus.
La mask del virus viene messa in memoria ad un certo indirizzo SEGMENTO:OFFSET. Per la maggior parte dei virus il valore dell'OFFSET è costante e non dipende dalla grandezza della memoria o dalla memoria libera. Viene cambiato solo il valore del SEGMENTO. Per trovare l'indirizzo della mask del virus è necessario controllare tutti gli indirizzi SEGMENTO:OFFSET mantenendo costante l'OFFSET e provando con tutti i valori di SEGMENTO ammisibili.
Per esempio, la parte residente del virus ``Twin.351'' [Kas95] si presenta cosı:
; INT 21 -> CS:0161 ;=========================================================== SEGMENTO:0161 3D 10 FF CMP AX, 0FF10h SEGMENTO:0164 74 18 JE Virus_ID SEGMENTO:0166 80 FC 4B CMP AH, 4Bh SEGMENTO:0169 74 16 JE Infect_!!! SEGMENTO:016B 80 FC 4E CMP AH, 4Eh SEGMENTO:016E 75 09 JNE Cont_Int_21 SEGMENTO:0170 81 FB 07 0A CMP BX, 0A07h SEGMENTO:0174 74 03 JE Cont_Int_21 ........ .... ... ...........
Per questo virus può essere usata come mask la parte di codice tra gli indirizzi 0161h - 016Dh (3D 10 FF 74 18 80 FC 4B 74 16 80 FC 4E). Il valore dell'OFFSET è fissato a 0161h.
Il miglior modo di fissare il valore di SEGMENTO dipende dall'algoritmo usato dal virus. I metodi più utilizzati sono i seguenti:
Questo metodo è utilizzato quando la parte residente del virus viene piazzata in un indirizzo fissato in memoria (per esempio quando il virus sposta la sua parte residente nella interrupt table o nelle aree lasciate libere del DOS, come fanno i virus ``Small'' e ``Tiny'') [Hof96] . In questo caso il valore del SEGMENTO è costante.
Questo metodo funziona particolarmente bene quando si cercano le porzioni residenti dei Boot virus. La maggior parte dei Boot virus decrementano la quantità della memoria convenzionale visibile dal DOS (il valore della word all'indirizzo [0040h:0013h]) e scrivono la loro porzione TSR in questa parte di memoria che si sono ritagliata. Quando si utilizza il metodo CUT il valore del SEGMENTO varia tra l'indirizzo del segmento della fine della memoria DOS all'inizio del segmento della memoria video (A000h). L'indirizzo di inizio della zona cuttata è calcolato a partire dal valore contenuto all'indirizzo [0040h:0013h].
L'utilizzo di questo metodo è possibile nella maggior parte delle infezioni dovute a file virus perché questi tipi di virus si creano un nuovo blocco di memoria quando si installano in memoria come TSR. Per cercare la mask del virus è necessario controllare tutti i blocchi di memoria dal primo fino all'ultimo, e confrontare la mask ed i contenuti di memoria ad un fissato OFFSET in ogni blocco. In questo caso il valore del SEGMENTO viene sostituito dal valore del segmento del blocco di memoria (che si sta analizzando). L'indirizzo del primo blocco di memoria è caricato dalla area di sistema del DOS chiamata List_of_List (INT 21h, AH=52h) [Bro96], mentre i prossimi blocchi vengono caricati a partire dagli header dei vari blocchi di memoria (Memory Control Block).
In questo metodo (vedi figura 11) il valore del SEGMENTO viene settato al valore dell'indirizzo di segmento del programma che aggancia la INT 13h e la INT 21h. Durante il tracciamento degli interrupt vengono analizzati gli indirizzi di segmento della catena degli handler attaccati a quella interruzione (cioè l'indirizzo dove un programma TSR prende il controllo dal TSR precedente).
Figura 11: Tracciamento Interrupt
Tutti gli indirizzi segm_i:offs_i sono la base e la mask del virus è cercata all'indirizzo con offset OFFSET da questi indirizzi base, cioè il valore di SEGMENTO:OFFSET è cambiato in segm_i:offs_i+OFFSET. Alcuni virus sono in grado di accorgersi di questo tracciamento e di conseguenza mandano in crash il sistema.
Questo metodo si utilizza quando i precedenti metodi non trovano un virus e il virus si trova nell'area di memoria il cui indirizzo è più piccolo dell'indirizzo del programma corrente (il programma antivirus in questo caso).
Quando si utilizza questo metodo (vedi figura 12) il valore del SEGMENTO varia da 0000h fino al valore del segmento del programma antivirus che sta lavorando (e cioè fino al valore del registro CS).
Il valore del SEGMENTO varia tra 0000h fino a A000h. Questo metodo viene utilizzato quando non si può utilizzare il metodo SCAN.
Ci sono virus che utilizzano degli algoritmi di infezione della RAM talmente complicati da far fallire i metodi standard visti in precedenza (per esempio un virus che cifra la sua parte TSR). In questi casi c'è bisogno di utilizzare delle routine apposite per curare questi virus.
Dopo aver trovato la posizione del codice del virus dobbiamo fare dei patch al codice del virus in modo che non possa più accedere ai file e/o settori mentre l'antivirus sta cercando un file e sta ripristinando i file/settori infettati. Tutto ciò perché se il virus infetta i file non appena vengono aperti, tutti i file mentre vengono scanditi diventano infettati. Per esempio:
Il codice del virus Il codice disattivato ------------------- --------------------- . . . . . . . . . . . . . . . . . . . . . . 80 FC 3D CMP AH, 3Dh 80 FC 3D CMP AH, 3Dh 74 xx JE Infect_File 90 NOP E9 xx xx JMP Continue 90 NOP . . . . . . . . . . . . E9 xx xx JMP Continue . . . . . . . . . . . . . . . . . . . . . . .
Durante la disattivazione di un virus TSR c'è bisogno di tener conto che il virus potrebbe utilizzare algoritmi speciali contro la correzione del codice virale in memoria (come fa il virus ``Yankee'' [Hof96] ). In tale caso c'è bisogno di disattivare anche tale algoritmo di ``protezione''.