Bataille de codeurs : moi contre ce type VNC

В ce blog De nombreuses histoires de programmeurs ont été publiées. J'aime me remémorer mes vieilles bêtises. Eh bien, voici une autre histoire similaire.

J’ai commencé à m’intéresser aux ordinateurs, en particulier à la programmation, vers l’âge de 11 ans. Au début du lycée bоJ'ai passé la plupart de mon temps libre à bricoler mon C64 et à écrire du BASIC, puis à découper le mauvais code avec des ciseaux. Je ne plaisante pas, les ciseaux.

Après l'école (vers l'âge de 16 ans), les enfants britanniques vont généralement à l'université, où ils choisissent d'étudier trois ou quatre matières avant d'aller à l'université. Étant donné mon amour pour la boîte beige et le magnétophone à la maison, j’ai décidé qu’étudier l’informatique à l’université était le bon choix.

J'ai apprécié le cours plus que prévu ; c'est là que j'ai rencontré 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 salle, conçue pour une centaine de personnes, avec des rangées de tables remplies de machines, comme celles où se trouve le moniteur sur l'unité centrale. Les fans bourdonnent constamment, les balles de souris bourdonnent sur les tables sans s'arrêter une seconde. Il y a une odeur étrange dans l'air, comme si 50 à 100 adolescents hormonaux changeaient périodiquement pour refroidir des centaines de puces Pentium III.

Malgré les risques pour la santé, j'aimais m'asseoir devant l'ordinateur quand j'avais une minute libre.

L'administrateur était de service dans la pièce, un petit homme d'âge moyen qui a été choisi pour ce rôle en raison de son désir insatiable de devenir un dictateur maléfique. Je suppose. Être en service est un euphémisme ; le gars aimait vraiment son travail. Il était chargé de maintenir l'ordre afin que personne n'utilise l'ordinateur de l'école à des fins inappropriées.

À ce jour, mon intuition me dit que la prime de l’administrateur dépendait directement du nombre d’étudiants qu’il prenait par la main et escortait hors de la salle informatique. Je suis presque sûr que ce type a remboursé son hypothèque plus tôt.

Il était assis dans le coin le plus éloigné de la salle informatique, à une table d'angle. Et il était raisonnable de supposer que ses moniteurs de fertilité avaient trouvé un moyen de se reproduire avec une période de gestation incroyablement courte, tant ils étaient nombreux. On ne pouvait que se demander s’il avait vraiment le temps de tous les suivre. Bien sûr, je plaisante... ai-je mentionné qu'il prenait son travail très au sérieux ?

À cette époque, le réseau informatique fonctionnait sous Windows 2000. J'ai vite découvert qu'à chaque fois que je me connectais au système, un script était lancé qui spécifiait le démarrage du serveur VNC à partir du compte administrateur pour un accès à distance au bureau. Chaque fois que ce type voulait vous espionner, il se connectait directement à votre machine et regardait. C'était effrayant, et maintenant que j'y pense, probablement illégal.

Ayant fait mes armes en BASIC et en C64, j'écris désormais en C et même un peu en C++. A cette époque, j'étais encore très intéressé par le langage D, qui corrigeait certains défauts du C++, tel que je le voyais alors.

J'avais l'habitude d'aller dans la salle informatique pour lire quelque chose de nouveau sur D ou jouer avec le compilateur Digital Mars D. Parfois, alors que j'étais distrait de penser au grand avenir de D, j'écrivais du code C pour pirater d'autres programmes Win32 à travers leur fenêtre. poignées.

Au bon vieux temps de la programmation Win32, trouver un handle de fenêtre était la méthode la plus simple pour pirater d’autres programmes. Évidemment, tous les programmes GUI sous Windows avaient une fenêtre, même si elle n'apparaissait pas à l'écran. En écrivant un programme pour récupérer un handle vers un autre processus (essentiellement un lien vers celui-ci), vous pouvez lui envoyer des messages. Cela permettait d'effectuer certaines opérations de base comme masquer/afficher une fenêtre de programme, ainsi que des choses vraiment intéressantes comme forcer un processus à charger une DLL arbitraire dans son espace mémoire et commencer à exécuter du code. Après l'injection de la DLL, le plaisir a commencé.

Au cours du premier mois et demi, ce détective ne m'a pas beaucoup dérangé : il ne s'est connecté qu'une ou deux fois au serveur VNC de ma machine. Mais une séance en particulier a peut-être éveillé son intérêt. J'étais en train d'écrire du code C pour masquer les fenêtres du démineur (sans les fermer) afin de faciliter le jeu en classe, lorsque j'ai remarqué que l'icône VNC blanche dans la barre d'état système était devenue noire. Cela signifiait qu'il me surveillait maintenant.

J'ai continué à coder comme d'habitude, en essayant de l'ignorer. Pendant ce temps, la machine commençait à ralentir, essayant de transmettre la fréquence d'images maximale à l'un des innombrables moniteurs dans le coin de la pièce. Windows a presque cessé de répondre, lorsque ma patience s'est épuisée, je me suis déconnecté et j'ai terminé la journée.

Lors de mes visites ultérieures à la salle informatique, Colombo s'intéressait presque à chaque fois à ce que je faisais. Après environ la quatrième fois, j'ai décidé : je dois faire quelque chose à ce sujet.

J'admets qu'une personne raisonnable et rationnelle aurait pu simplement soulever cette question directement avec elle ou avec son patron. Cependant, j’ai toujours cédé à la tentation et je me suis rapidement convaincu d’adopter une stratégie complètement différente.

- Vous ne pouvez rien faire sans ce serveur VNC ! — Je me suis dit à plusieurs reprises avec calme et détermination.

Il fallait tuer VNC.

J'ai commencé à entrer dans la salle informatique avec de grands groupes d'étudiants et à m'asseoir aussi loin que possible du coin avec les moniteurs. Cela a fonctionné pendant un certain temps et m'a donné le temps de tester des idées.

Ma première tentative, je pense que vous en conviendrez, était assez faible. En cliquant avec le bouton droit sur l'icône VNC dans la barre d'état système, j'ai vu un menu avec les lettres magiques EXIT. Malheureusement, les lettres étaient écrites avec un texte à contour gris. L'administrateur a désactivé l'élément de menu "Quitter" via l'éditeur de stratégie de groupe. J'ai essayé de supprimer le processus à partir du Gestionnaire des tâches, mais bien sûr, il était invisible pour moi car il s'exécutait sous un compte différent, plus privilégié. Cela n'a pas fonctionné.

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

J'ai passé au moins quelques jours à bricoler le protocole, en envoyant diverses formes de conneries bien structurées au port 5900 en espérant qu'il se briserait. Finalement, cela n’a pas fonctionné non plus.

Je commençais déjà à penser que je n’arriverais pas à me débarrasser de cette chose, quand soudain je me suis rendu compte : il devait y avoir une fenêtre là-bas ! Nous devons l'afficher. Peut-être qu’il aura un joli bouton « Muet » juteux que je pourrai utiliser à bon escient !

J'ai exécuté mon code C maintenant presque parfait pour trouver le handle de la fenêtre principale d'un autre processus - et bien sûr, VNC a été trouvé. Je me suis senti inspiré lorsque mes doigts tapaient WM_SHOWWINDOW. Essayez de deviner ce que j'ai vu devant moi ?

Ce N'est Rien!

Maintenant, j'étais curieux... il avait une fenêtre, mais il ignorait mes messages. J'ai vérifié mon code pour m'assurer qu'il fonctionne. Je l'ai testé sur plusieurs autres processus et cela a très bien fonctionné. J'ai essayé d'envoyer d'autres messages à la fenêtre VNC, et toujours rien.

Et puis ça m’est revenu à l’esprit !

Grâce au très épais un livre Charles Petzold J'ai soigneusement étudié le fonctionnement des processus Win32 à l'intérieur du système. Chaque application Win32 possède une fenêtre ainsi qu'une "file d'attente des messages". Les messages déclenchés par l'interaction de l'utilisateur, ainsi que les messages envoyés par Windows lui-même, arrivent dans une file d'attente et l'application décide elle-même comment les traiter.

Pas très intéressant en soi. Mais lorsque j'ai réalisé qu'une file d'attente de messages non traités suffisamment grande agissait comme une heuristique permettant à Window Process Manager d'intervenir dans un processus bloqué, j'ai commencé à transpirer de sérotonine pure.

Sans perdre une seconde, je suis revenu à mon code C, me préparant à envoyer un autre message à la fenêtre principale de VNC. WM_SHOWWINDOW. Dans un cycle. Éternel. Donc beaucoup de messages. WM_SHOWWINDOW, que je savais maintenant que VNC essaierait d'ignorer complètement... à ses risques et périls.

J'ai compilé et exécuté 4 Ko du code le plus épris de liberté de ma vie. Après environ trois secondes, Windows a signalé que le processus vncserver.ехе ne répond pas, et m'a fait une offre que je ne pouvais tout simplement pas refuser :

Voulez-vous terminer ce processus?

OUI BIEN SÛR!

Laissez-moi admettre que pendant le reste de la journée, j'étais insupportablement content de moi.

Après quelques heures passées à digérer mon nouveau super pouvoir, j’ai décidé comment je l’utiliserais. C'était trop facile de tuer la séance juste devant lui. J'ai eu une meilleure idée : disparaître complètement.

Après baptême du feu avec programmation de socket J'ai réalisé que je pouvais écrire du code qui ferait deux choses. Il occupera d’abord le port TCP 5900 nouvellement libéré, précédemment occupé par le processus serveur VNC désemparé. Ensuite, il créera une nouvelle connexion TCP au serveur VNC de la machine spécifiée. Le code transmettra simplement toutes les données entre les deux sockets, et Columbo pensera qu'il se connecte à moi, alors qu'en fait il se connectera à un serveur VNC complètement différent.

Mon code agira comme un pont secret entre moi et une autre pauvre âme de mon choix. C'était merveilleux.

J'ai immédiatement commencé à écrire mon faux pont VNC. Columbo s'est connecté à moi plusieurs fois, mais j'ai continué à programmer devant lui. J'en suis arrivé à la conclusion qu'il n'avait aucune idée de ce que je faisais, même si j'avais écrit des choses évidentes comme des numéros de port et des commentaires comme // Прощай, жуткий шпион VNC.

Après quelques jours, je n'ai pas réussi à faire fonctionner le code correctement. Pour aggraver les choses, je travaillais presque continuellement avec l'icône noire VNC dans la barre d'état système. Alors qu'il était connecté, je n'ai pas pu libérer le port pour tester mon code.

Si j'avais su alors netcat!

Finalement, mes nerfs ont cédé ; après tout, j'étais un jeune de 17 ans impatient. En regardant l'icône blanche du serveur VNC redevenir noire, j'ai paniqué, j'ai ouvert le code original qui remplissait la file d'attente des messages et je l'ai exécuté devant ses yeux. J'ai même attendu quelques secondes avant de cliquer End Process, juste pour être sûr qu'il l'a vu.

Si appuyer sur ce bouton ne m'a pas complètement convaincu que cela en valait la peine, alors le fait qu'il ait sauté de derrière sa forteresse de moniteurs pour s'approcher rapidement de moi et me faire sortir de la pièce l'a certainement fait.

En conséquence, j'ai été banni du réseau pendant deux semaines. Une juste punition, pensais-je. Après environ trois semaines, le serveur VNC a disparu des scripts de démarrage et n'est jamais apparu ailleurs. Je n'ai jamais su si mon incident avait joué un rôle dans tout cela ou non, mais il a complètement ruiné mon projet de devenir fabuleusement riche en vendant mon pistolet VNC à des étudiants déprimés dans les salles informatiques des universités à travers le pays.

Source: habr.com

Ajouter un commentaire