Comment j’ai sauvé mes partiels à l’aide d’un virus

L’année dernière j’ai dû prendre une décision afin de pouvoir sauver mon sommeil et ainsi me permettre de regagner en efficacité dans mes études.

J’étais à l’époque en première année de prépa intégrée d’une école d’ingénieur lyonnaise et je vivais sur le campus comme la plupart des étudiants. On m’avait attribué un colocataire plutôt sympa mais, avec un défaut qui rendait la cohabitation désagréable : il passait ses nuits à jouer en ligne sur son ordinateur et comme nous partagions la même pièce, mon sommeil en prenait un coup.

Lorsque je lui demandais d’arrêter il s’exécutait mais bon il recommençait tous les soirs et c’était compliqué de lui rappeler à chaque fois.

Alors que les partiels approchaient, que j’avais besoin de mon sommeil plus que jamais et devant mon incapacité à le convaincre de changer ses habitudes j’ai pris la décision de le forcer à changer.

Il fallait que malgré lui il ne puisse plus jouer pendant la nuit sans que cela n’amène de dégât matériel/financier et sans qu’il puisse me soupçonner, voir de soupçonner qui que ce soit.
J’ai donc réfléchi à plusieurs options pouvant m’amener discrètement à mes fins et qui était rapide à mettre en œuvre.

Afin qu’il ne puisse plus jouer en ligne il suffisait que je lui coupe internet et pour qu’il ne puisse pas non plus regarder des séries/films il fallait que je lui coupe le son à l’aide d’un programme qui tournerait en arrière plan sur sa machine.

Il ne fallait pas non plus que je l’empêche d’utiliser son ordinateur pour qu’il puisse quand même jouer et travailler dessus. C’est pourquoi il était impératif que le blocage de sa connexion internet et de sa sortie audio soit effectif uniquement à partir d’une certaine heure, en semaine et sur le campus.

Je savais qu’il utilisait Windows 8 ou Windows 8.1 (n’étant pas très familier avec Windows je n’arrive pas trop à faire la différence). J’ai donc installé Windows 8.1 sur une machine virtuelle en espérant que mon programme fonctionnerait de la même façon sur les deux versions.

Conception

Je me suis donné une semaine pour concevoir ce programme.

J’ai décidé de le programmer en Java, cela peut sembler étrange de développer un « virus » en Java mais n’ayant aucune expérience dans le domaine et ayant peu de temps j’ai décidé de le créer dans un langage que je maîtrise bien et qui se comporte globalement de la même façon d’une machine à l’autre.

J’ai aussi utilisé NirCmd un utilitaire assez complet utilisable en ligne de commande qui permet d’effectuer des actions assez variées qui n’existe (peut être) pas en commande Windows (mettre le volume en muet, lancer une application en arrière plan… etc).

On peut globalement résumer le comportement du programme par l’arbre de décision suivant :

Arbre de décision créé avec Dia.

Évidemment lorsque j’ai conçu ce programme je n’ai pas pu penser à tous les cas de figure qui pouvait se produire, j’en étais conscient mais je n’avais pas beaucoup de temps.

Pour que le programme puisse vérifier si l’ordinateur est connecté à internet il va compter le nombre de carte réseau activé avec le script Windows suivant. S’il y en a au moins une on considère que l’ordinateur est connecté.

set /a nb=0
FOR /F "tokens=2,3* " %%A in ('netsh interface show interface ^| find "Connect"') do (
set /a nb=nb+1
)
echo %nb%

Afin de pouvoir détecter que l’ordinateur est utilisé sur le campus le programme va tenter de joindre une adresse IP d’un serveur du réseau du campus qui est toujours allumé.

Pour vérifier l’heure et le jour de la semaine le programme peut procéder de deux manières différentes : si l’ordinateur est connecté à internet il va effectuer une requête à un serveur afin de pouvoir récupérer la date et l’heure, en cas d’échec de la requête ou s’il ne l’est pas il va prendre l’heure et la date qu’indique le système.

Pour couper internet le programme exécutera le script suivant avec les privilèges administrateurs qui consistera à désactiver toutes les connexions réseaux.

FOR /F "tokens=2,3* " %%A in ('netsh interface show interface ^| find "Connect"') do (netsh interface set interface "%%C" admin=DISABLE)

Pour couper le son je me contentais de mettre le son en muet avec la commande suivante utilisant NirCmd :

nircmd.exe mutesysvolume 1

Afin de m’assurer qu’il ne réactive pas manuellement ses cartes réseaux et sa sortie audio, les testes seront ré-effectuer toutes les 5 secondes (ce qui n’est évidemment pas du tout optimisé).

Je n’ai pas vraiment eu le temps de tester le programme de manière approfondie avant de le déployer ce qui a engendré quelques imprévus.

Déploiement

J’avais un accès physique à sa machine et je savais qu’il n’utilisait pas de mot de passe ce qui m’a grandement facilité la tâche.
Il suffisait que je me retrouve seul avec son ordinateur pendant quelques minutes pour pouvoir l’installer sur sa machine.

Afin de rendre le déploiement du programme plus rapide j’ai donc créé un petit script Windows qui exécuté en administrateur depuis ma clé USB s’occuperait de cacher le programme dans le dossier %appdata% et d’automatiser son exécution à chaque démarrage de la machine.

Le script d’installation ressemblait à ça :

cd /d %~dp0
xcopy . %appdata%\vir\ /s /i
schtasks /Create /TN nomdelatache /F /XML nomdelatache.xml

Avec nomdelatache.xml un fichier qui décrit la tâche planifiée qui exécutera le programme à chaque démarrage.

J’ai donc profité d’une de ses absences pour déployer ce programme qui allait pouvoir enfin sauver mon sommeil. Le déploiement se fit (à ma grande surprise) sans incident.

Rapport de fonctionnement et imprévus

Le premier soir où le programme lui coupa l’internet il y a eu un imprévu : le blocage arriva à 22h soit 1h avant l’heure programmé, cela arriva d’une manière étrange, toutes les 5 secondes le blocage s’activait puis se désactivait 5 secondes après. Et cela se répéta jusqu’à qu’il en est marre et qu’il éteigne son ordinateur (soit 5-6 minutes après). Ce comportement anormal est explicable par le fait que le serveur sur lequel je me basais pour récupérer la date et l’heure n’était pas sur le bon fuseau horaire. Une erreur assez bête que j’aurai pu détecter si j’avais effectué de vrais tests avant de déployer.

Il justifia le comportement de son ordinateur (après avoir fait plusieurs scans de virus sans résultat) par un faux contact au niveau de sa carte réseau dû à la poussière et à la surchauffe.

Les antivirus ne risquait pas de détecter mon programme comme virus car il ne figure évidemment pas dans leurs bases de données.

Un autre imprévu fut remarqué pendant le mois de mai : les jours fériés.

En effet le programme était conçu pour couper internet à 23h la veille des jours où on avait cours, mais lorsqu’un jour férié tombe sur un jour de cours le programme ne le prend pas en compte. Ce qui mène à des situations de frustrations extrême de sa part de ne pas pouvoir jouer alors qu’il n’a pas cours le lendemain.
Il était environ 22h30 j’étais sur mon ordinateur et je le voyais rager de toutes ses forces sur son ordinateur, c’était à la fois drôle à voir et culpabilisant. J’ai dû l’arrêter quand il a voulu le démonter, il risquait de ne plus savoir comment le remonter ou pire de l’abîmer.

Conclusion

Au final tout cela paya et me permit de rattraper mon retard de sommeil, de réussir mes partiels et parallèlement m’appris plein de choses sur Windows.

Il s’habitua rapidement à ne plus pouvoir jouer en semaine après 22h, chose curieuse il s’arrêtait par lui-même inconsciemment avant que le blocage commence au bout de quelques semaines, comme si le comportement de son ordinateur avait suffit à le conditionner à se coucher plus tôt.

J’ai fini par le prévenir et il l’a relativement bien pris. Il m’a bien sûr donné son autorisation pour écrire cet article. C’est d’ailleurs grâce à lui que j’ai pu récupérer le programme que j’avais perdu. J’ai pu ainsi vous fournir un maximum de détails techniques au cours de cet article, notamment concernant les commandes Windows que j’avais, en grande partie totalement oublié.