La bataille des codeurs : moi contre ce gars avec VNC

Dans ce blog Il y a eu de nombreuses anecdotes de programmeurs. J'aime me souvenir de mes vieilles bêtises. Eh bien, voici une autre histoire de ce genre.

Je me suis intéressé aux ordinateurs, en particulier à la programmation, pour la première fois lorsque j'avais environ 11 ans. Au début du collège,deje passais la plupart de mon temps libre à jouer avec mon C64 et à programmer en BASIC, puis je coupais le mauvais code avec des ciseaux. Je ne rigole pas, avec des ciseaux..

Après l'école (vers 16 ans), les enfants britanniques vont généralement au collège, où ils choisissent trois ou quatre matières à étudier avant d'entrer à l'université. Étant donné mon amour pour la boîte beige et le magnétophone chez moi, j'ai décidé que l'étude de l'« informatique » au collège était un bon choix.

Le cours m'a plu plus que je ne l'avais espéré ; c'est là que j'ai découvert Pascal et Delphi pour la première fois.

Pendant les pauses entre les cours, les étudiants pouvaient travailler sur n'importe quelle machine libre dans la salle informatique. Imaginez : une immense pièce pour environ cent personnes, avec des rangées de tables équipées de machines, comme celles où le moniteur est sur l'unité centrale. Le bourdonnement constant des ventilateurs, les boules de souris qui roulent sans s'arrêter. L'air a une odeur étrange, comme si 50 à 100 adolescents exhalant leurs hormones se succédaient régulièrement pour refroidir des centaines de puces Pentium III.

Malgré les risques pour la santé, j'aimais m'asseoir devant un ordinateur chaque fois que j'avais une minute de libre.

Un administrateur était de service, un homme de taille moyenne d'âge moyen, choisi pour ce rôle en raison de son ardent désir de devenir un dictateur méchant. Je suppose. 'De service' est un faible mot, le gars aimait vraiment son travail. Il avait pour mission de s'assurer que personne n'utilisait l'ordinateur d'études à des fins inappropriées.

Et encore aujourd'hui, mon intuition me dit que la prime de l'administrateur dépendait directement du nombre d'étudiants qu'il prenait en flagrant délit et expulsait de la salle informatique. Je suis presque sûr que ce gars a remboursé son emprunt immobilier par anticipation.

Il était assis dans un coin éloigné de la salle informatique à une table d'angle. On pouvait supposer avec certitude que ses moniteurs prolifiques avaient trouvé un moyen de se reproduire avec une période de grossesse étonnamment courte — il y en avait tellement. Il ne restait qu'à se demander s'il parvenait réellement à surveiller chacun d'eux. Bien sûr, je rigole… ai-je mentionné qu'il prenait son travail très au sérieux ?

À l'époque, le réseau informatique fonctionnait sous Windows 2000. J'ai rapidement découvert qu'à chaque connexion, un script était lancé, contenant le démarrage du serveur VNC avec un compte admin pour accéder à distance au bureau. Chaque fois que ce gars voulait vous surveiller, il se connectait directement à votre machine et vous observait. C'était effrayant, et en y pensant maintenant, probablement illégal.

Ayant aiguisé mes compétences sur BASIC et C64, j'écrivais maintenant en C et même un peu en C++. À l'époque, je m'étais également passionné pour le langage D, qui corrigeait certains défauts de C++, du moins c'est ainsi que je le voyais alors.

J'allais généralement dans la salle informatique pour lire quelque chose de nouveau sur D ou expérimenter avec le compilateur Digital Mars D. Parfois, en me détourchant de mes pensées sur le grand avenir de D, j'écrivais du code en C pour pirater d'autres programmes Win32 à travers les descripteurs de leurs fenêtres.

Dans le bon vieux temps de la programmation Win32, la recherche du descripteur de fenêtre était le moyen le plus simple de pirater d'autres programmes. Il était évident que tous les programmes avec une interface graphique sous Windows avaient une fenêtre, même si elle n'était pas affichée à l'écran. En écrivant un programme pour extraire le descripteur d'un autre processus (essentiellement un lien vers celui-ci), vous pouviez lui envoyer des messages. Cela vous permettait d'effectuer certaines opérations de base, comme cacher/afficher la fenêtre d'un programme, ainsi que des choses vraiment intéressantes, comme forcer le processus à charger une DLL arbitraire dans son espace de mémoire et à commencer à exécuter du code. Après l'injection de la DLL, les choses devenaient vraiment passionnantes.

Pendant les premières semaines et demie, ce détective ne m'a pas particulièrement dérangé, il s'est connecté au serveur VNC sur ma machine une ou deux fois seulement. Mais une session en particulier a probablement éveillé son intérêt. J'écrivais un code en C pour cacher les fenêtres de Minesweeper (sans les fermer), afin de rendre le jeu plus facile en classe, et j'ai alors remarqué que l'icône blanche de VNC dans la barre d'état système était devenue noire. Cela signifiait qu'il me surveillait désormais.

Je continuais à coder comme d'habitude, essayant de ne pas prêter attention à lui. Pendant ce temps, la machine commençait à ralentir sérieusement, tentant de transmettre un maximum de fréquence d'images sur l'un des innombrables moniteurs dans le coin de la pièce. Windows a presque cessé de répondre, et lorsque ma patience a craqué, je me suis déconnecté et j'ai terminé pour la journée.

Lors de mes visites suivantes dans la salle informatique, Columbo semblait s'intéresser activement à ce que je faisais presque à chaque fois. Environ après la quatrième fois, j'ai décidé qu'il fallait faire quelque chose.

Je reconnais qu'une personne raisonnable et rationnelle aurait pu poser la question directement à lui ou à son supérieur. Cependant, j'ai toujours cédé à la tentation et je me suis rapidement convaincu d'adopter une stratégie complètement différente.

— Tu ne peux rien faire sans ce serveur VNC ! — me suis-je dit calmement et fermement plusieurs fois.

Il fallait tuer VNC.

J'ai commencé à entrer dans la salle informatique avec de grands groupes d'étudiants et à m'asseoir le plus loin possible du coin avec les moniteurs. Cela a fonctionné un moment et m'a donné un peu de temps pour réfléchir à des idées.

Ma première tentative, je pense que vous serez d'accord, était assez faible. En faisant un clic droit sur l'icône VNC dans la barre d'état système, j'ai vu un menu avec les lettres magiques E-X-I-T. Malheureusement, les lettres étaient écrites en texte contour gris. L'administrateur avait désactivé l'option 'Sortie' via l'éditeur de stratégie de groupe. J'ai essayé de terminer le processus dans le Gestionnaire des tâches, mais bien sûr, il était invisible pour moi, puisqu'il fonctionnait sous un autre compte ayant plus de privilèges. Rien n'a fonctionné.

Le serveur VNC tourne sur le port TCP 5900, me suis-je souvenu. Mon prochain plan était d'envoyer des paquets corrompus à ce port afin de le faire planter.

Pendant plusieurs jours, j'ai décortiqué le protocole, envoyant au port 5900 diverses formes de données mal structurées, espérant qu'il craque. En fin de compte, cela n'a pas fonctionné non plus.

J'avais déjà commencé à penser que je ne pourrais jamais me débarrasser de cette chose quand tout à coup, j'ai eu une illumination : il doit y avoir une fenêtre ! Il faut que je l'affiche. Peut-être qu'il y aura un bon gros bouton 'Éteindre' que je pourrai utiliser !

J'ai lancé mon code C pratiquement parfait pour trouver le descripteur de la fenêtre principale d'un autre processus - et j'ai effectivement trouvé VNC. Je me suis senti exalté lorsque mes doigts ont tapé WM_SHOWWINDOW. Devinez ce que j'ai vu ?

Rien !

Maintenant, je me demandais... il avait une fenêtre, mais elle ignorait mes messages. J'ai vérifié deux fois mon code pour m'assurer qu'il fonctionnait. Je l'ai testé sur plusieurs autres processus, et ça marchait parfaitement. J'ai essayé d'envoyer d'autres messages à la fenêtre VNC, mais rien.

Et là, j'ai eu une autre idée !

Grâce au très épais au livre Charles Petzold, j'ai étudié comment les processus Win32 fonctionnent à l'intérieur du système. Chaque application Win32 a une fenêtre, ainsi qu'une 'file d'attente de messages'. Les messages issus de l'interaction utilisateur, ainsi que ceux envoyés par Windows, sont mis en file d'attente, et l'application elle-même décide comment les traiter.

Pas très intéressant en soi. Mais quand j'ai compris qu'une file d'attente de messages suffisamment grande non traitée agit comme une heuristique pour intervenir dans un processus figé par le gestionnaire de processus Windows, j'étais en pleine euphorie.

Sans perdre une seconde, je suis retourné à mon code C, prêt à envoyer un autre message à la fenêtre principale de VNC WM_SHOWWINDOW. Dans une boucle. Éternelle. Ainsi, de nombreux messages WM_SHOWWINDOW, que je savais désormais que VNC allait essayer d'ignorer complètement... à ses risques et périls.

J'ai compilé et exécuté 4 Ko de mon code le plus libre d'esprit. Environ trois secondes plus tard, Windows a signalé que le processus vncserver.exe ne répondait pas, et a formulé une offre à laquelle je ne pouvais tout simplement pas résister :

Voulez-vous terminer ce processus ?

Merde, OUI !

Permettez-moi de confesser que le reste de la journée, j'étais insupportablement satisfait de moi-même.

Après plusieurs heures passées à digérer mon nouveau superpouvoir, j'ai décidé comment je vais l'utiliser. Le simplement tuer la session juste devant ses yeux était trop facile. J'avais une meilleure idée : disparaître complètement.

Après baptême de combat avec la programmation de sockets J'ai réalisé que je pouvais écrire un code qui ferait deux choses. D'abord, il occuperait le port TCP 5900 récemment libéré, auparavant occupé par un processus serveur VNC ignorant. Ensuite, il établirait une nouvelle connexion TCP avec le serveur VNC de la machine désignée. Le code se contenterait de faire passer toutes les données entre les deux sockets, et Colombo penserait qu'il se connecte à moi, alors qu'en réalité, il se connecterait à un serveur VNC tout à fait différent.

Mon code agirait comme un pont secret entre moi et une autre âme perdue de mon choix. C'était magnifique.

J'ai immédiatement commencé à écrire mon faux pont VNC. Colombo s'est connecté à moi plusieurs fois, mais je continuais à programmer sous ses yeux. J'en suis venu à la conclusion qu'il n'avait aucune idée de mes actions, même si j'écrivais des choses évidentes, comme des numéros de port et des commentaires tels que // Прощай, жуткий шпион VNC.

Après quelques jours, je n'ai pas pu faire fonctionner le code correctement. Pire encore, je travaillais pratiquement en continu avec l'icône noire de VNC dans la barre d'état système. Tant qu'il était connecté, je ne pouvais pas libérer le port pour tester mon code.

Si seulement j'avais su à l'époque netcat!

Finalement, les nerfs n'ont pas tenu, après tout, j'étais un jeune de 17 ans impatient. En voyant encore une fois l'icône blanche du serveur VNC devenir noire, je me suis énervé, j'ai ouvert le code original qui remplissait la file d'attente des messages et je l'ai lancé sous ses yeux. J'ai même attendu quelques secondes avant d'appuyer sur End Process, juste pour m'assurer qu'il l'avait vu.

Si appuyer sur ce bouton ne m'a pas encore complètement convaincu que ça en valait la peine, son saut depuis sa forte position devant les moniteurs pour s'approcher rapidement de moi et me mettre à la porte de la chambre en valait certainement la peine.

En fin de compte, j'ai été interdit d'accès au réseau pendant deux semaines. C'était une punition juste, ai-je pensé. Environ trois semaines plus tard, le serveur VNC a disparu des scripts de démarrage et n'est plus apparu nulle part. Je n'ai jamais su si mon incident avait joué un rôle là-dedans ou non, mais cela a complètement détruit mon plan de s'enrichir rapidement en vendant ma machine VNC à des étudiants opprimés dans des salles informatiques d'universités à travers le pays.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster