Im Es wurden viele Programmierer-Geschichten veröffentlicht. Ich erinnere mich gerne an meine alten Dummheiten. Nun, hier ist eine weitere solche Geschichte.
Ich interessierte mich zum ersten Mal für Computer, insbesondere für Programmierung, als ich etwa 11 Jahre alt war. Zu Beginn der Mittelschule.oVerbrachte ich die meiste Freizeit mit meinem C64 und schrieb in Basic, und dann schnitt ich mit einer Schere schlechten Code aus. .
Nach der Schule (im Alter von etwa 16 Jahren) gehen britische Kinder normalerweise aufs College, wo sie drei oder vier Fächer wählen, bevor sie zur Universität gehen. Angesichts meiner Liebe zur beigen Kiste und dem Kassettenrekorder zu Hause beschloss ich, dass das Studium der "Informatik" am College die richtige Wahl war.
Der Kurs gefiel mir besser, als ich erwartet hatte; dort lernte ich zum ersten Mal Pascal und Delphi kennen.
In den Pausen zwischen den Unterrichtsstunden konnten die Studenten an jedem freien Computer im Computerraum arbeiten. Stellen Sie sich vor: ein riesiger Raum, der für etwa hundert Personen ausgelegt ist, mit Reihen von Tischen, die mit Maschinen ausgestattet sind – ähnlich jenen, bei denen der Monitor auf dem Systemblock steht. Ein ständiges Summen der Lüfter, Mäuse mit Kugeln, die über die Tische rollen, ohne sich eine Sekunde lang zu stoppen. In der Luft ein merkwürdiger Geruch, als würden 50-100 hormonproduzierende Teenager intermittierend die Kühlung von Hunderten von Pentium-III-Chips übernehmen.
Trotz der gesundheitlichen Risiken gefiel es mir, am Computer zu sitzen, wann immer ich eine freie Minute hatte.
Im Raum war ein Admin, ein kleiner Mann mittleren Alters, der für diese Rolle gewählt worden war, weil er unbedingt ein böser Diktator werden wollte. Nehmen wir an. "Das Warten" ist schwach ausgedrückt; der Typ liebte seine Arbeit wirklich. Er wurde beauftragt, darauf zu achten, dass niemand den Ausbildungscomputer für ungeeignete Zwecke verwendete.
Und bis heute hat mein Bauchgefühl mir gesagt, dass die Prämie des Admins direkt von der Anzahl der Studenten abhing, die er beim unerlaubten Gebrauch erhaschte und aus dem Computerraum hinausbegleitete. Ich bin mir ziemlich sicher, dass dieser Typ seine Hypothek vorzeitig abbezahlt hat.
Er saß in der hinteren Ecke des Computerraums an einem Eckschreibtisch. Man konnte mit Zuversicht annehmen, dass seine fruchtbaren Monitore einen Weg gefunden hatten, sich mit einer beeindruckend kurzen Tragzeit zu vermehren – zu viele waren es. Es blieb nur zu spekulieren, ob er es tatsächlich schaffte, sie alle im Blick zu behalten. Natürlich mache ich Scherze… habe ich erwähnt, dass er seine Arbeit sehr ernst nahm?
Zu dieser Zeit lief das Computernetzwerk unter Windows 2000. Bald stellte ich fest, dass bei jedem Systemstart ein Skript ausgeführt wurde, in dem der Start des VNC-Servers mit einem Admin-Konto für den Remote-Zugriff auf den Desktop festgelegt war. Jedes Mal, wenn dieser Typ uns im Auge behalten wollte, stellte er eine Verbindung zu deinem Rechner her und beobachtete. Es war gruselig, und wenn man jetzt darüber nachdenkt, höchstwahrscheinlich illegal.
Nachdem ich an Basic und C64 gefeilt hatte, schrieb ich nun in C und sogar ein wenig in C++. Damals war ich auch sehr begeistert von der Sprache D, die einige Mängel von C++ korrigierte, zumindest glaubte ich das damals.
Ich ging normalerweise in den Computerraum, um etwas Neues über D zu lesen oder mit dem Compiler von Digital Mars D zu spielen. Manchmal, abgelenkt von meinen Gedanken über die große Zukunft von D, schrieb ich Code in C, um andere Win32-Programme über die Deskriptoren ihrer Fenster zu hacken.
In den guten alten Zeiten des Programmierens in Win32 war die Suche nach dem Fenstdeskriptor die einfachste Methode, um andere Programme zu hacken. Offensichtlich hatte jede grafische Anwendung in Windows ein Fenster, selbst wenn es nicht auf dem Bildschirm angezeigt wurde. Wenn du ein Programm schriebst, um den Deskriptor eines anderen Prozesses (im Wesentlichen einen Verweis auf ihn) zu extrahieren, konntest du ihm Nachrichten senden. Das erlaubte grundlegende Operationen wie das Verstecken oder Anzeigen eines Programmfensters, aber auch richtig coole Dinge, wie den Prozess zu zwingen, eine beliebige DLL in seinen Speicherraum zu laden und den Code auszuführen. Nach der DLL-Injektion begann das eigentliche Interesse.
In den ersten anderthalb Monaten machte mir dieser Detektiv nicht viel zu schaffen; er schloss sich nur ein oder zwei Mal an den VNC-Server auf meinem Computer an. Aber eine bestimmte Sitzung weckte wahrscheinlich sein Interesse. Ich schrieb irgendeinen Code in C, um die Fenster von Minesweeper auszublenden (ohne sie zu schließen), um es einfacher zu machen, im Unterricht zu spielen, und bemerkte dabei, dass das weiße VNC-Symbol im Systemtray schwarz geworden war. Das bedeutete, dass er mich jetzt beobachtete.
Ich fuhr fort, wie gewohnt zu programmieren, und versuchte, ihn nicht zu beachten. In der Zwischenzeit begann der Computer, merklich langsamer zu werden, während er versuchte, die maximale Bildrate auf einen der unzähligen Monitore in der Zimmerecke zu übertragen. Windows hörte fast auf zu reagieren, als meine Geduld erschöpft war; ich meldete mich ab und beendete den Tag.
Bei den nächsten Besuchen im Computerraum zeigte Colombo fast jedes Mal lebhaftes Interesse an dem, was ich tat. Nach dem vierten Mal beschloss ich, dass ich etwas unternehmen musste.
Ich gebe zu, dass ein vernünftiger, rationaler Mensch dieses Anliegen direkt mit ihm oder seinem Vorgesetzten hätte ansprechen können. Doch ich gab immer der Versuchung nach und überredete mich schnell, eine ganz andere Strategie zu wählen.
— Ohne diesen VNC-Server kannst du nichts tun! — sagte ich mir ruhig und entschlossen mehrmals.
Es musste eine Möglichkeit gefunden werden, den VNC-Server zu töten.
Ich begann, mit großen Gruppen von Studenten in den Computerraum zu gehen und setzte mich so weit wie möglich von der Ecke mit den Monitoren entfernt. Eine Zeit lang funktionierte das und gab mir etwas Zeit, um Ideen zu prüfen.
Mein erster Versuch, ich denke, werden Sie zustimmen, war ziemlich schwach. Als ich mit der rechten Maustaste auf das VNC-Symbol im Systemtray klickte, erschien ein Menü mit den magischen Buchstaben E-X-I-T. Leider waren die Buchstaben in grauem Umrisstext geschrieben. Der Administrator hatte den Menüpunkt „Ausgang“ über den Gruppenrichtlinien-Editor deaktiviert. Ich versuchte, den Prozess über den Task-Manager zu beenden, aber natürlich war er für mich unsichtbar, da er unter einem anderen, privilegierteren Konto lief. Nichts funktionierte.
Der VNC-Server läuft auf Port TCP 5900, fiel mir ein. Mein nächster Plan bestand darin, beschädigte Pakete an diesen Port zu senden, um ihn zum Absturz zu bringen.
Mindestens ein paar Tage habe ich das Protokoll analysiert und verschiedene Formen von korrekt strukturiertem Mist an den Port 5900 gesendet, in der Hoffnung, dass er abstürzt. Letztendlich hat das auch nicht funktioniert.
Ich begann schon zu denken, dass ich dieses Ding nicht loswerden könnte, als mir plötzlich einfiel: Da muss doch ein Fenster sein! Ich muss es darstellen. Vielleicht gibt es dort einen schönen, saftigen 'Ausschalten'-Button, den ich hervorragend verwenden kann!
Ich habe meinen fast perfekten C-Code zum Suchen des Deskriptors des Hauptfensters eines anderen Prozesses gestartet – und tatsächlich VNC gefunden. Ich fühlte mich beflügelt, als meine Finger die Tasten für WM_SHOWWINDOWdrückten. Rate mal, was ich vor mir sah?
Nichts!
Jetzt wurde ich neugierig... Er hatte ein Fenster, aber es ignorierte meine Nachrichten. Ich überprüfte meinen Code zweimal, um sicherzustellen, dass er funktionierte. Ich testete es an mehreren anderen Prozessen und es funktionierte einwandfrei. Ich versuchte, an das VNC-Fenster andere Nachrichten zu senden, und trotzdem passierte nichts.
Und da hatte ich wieder eine Eingebung!
Dank der sehr dicken Charles Petzolds studierte ich gründlich, wie Win32-Prozesse innerhalb des Systems funktionieren. Jede Win32-Anwendung hat ein Fenster sowie eine 'Nachrichtenschlange'. Nachrichten, die durch Interaktionen mit dem Benutzer ausgelöst werden, sowie Nachrichten, die von Windows selbst gesendet werden, gelangen in die Warteschlange, und die Anwendung entscheidet, wie sie damit umgeht.
An sich nicht besonders interessant. Aber als ich begriff, dass eine ausreichend große unbehandelte Nachrichtenschlange eine Heuristik für das Eingreifen in einen abgestürzten Prozess durch den Window Process Manager darstellt, war ich voller Serotonin.
Ohne eine Sekunde zu verlieren, kehrte ich zu meinem C-Code zurück, bereit, dem Hauptfenster von VNC eine weitere Nachricht zu senden WM_SHOWWINDOW. In einer Schleife. Ewigen. Also viele Nachrichten, WM_SHOWWINDOWvon denen ich jetzt wusste, dass VNC sie vollständig ignorieren versuchen würde... auf eigene Gefahr.
Ich kompilierte und startete 4 KB des freisinnigsten Codes meines Lebens. Etwa drei Sekunden später meldete Windows, dass der Prozess vncserver.exe nicht antwortet, und machte einen Vorschlag, dem ich einfach nicht widerstehen konnte:
Möchten Sie diesen Prozess beenden?
Verdammtes, JA!
Lass mich gestehen, dass ich den Rest des Tages unerträglich zufrieden mit mir selbst war.
Nach mehreren Stunden des Nachdenkens über meine neue Superkraft beschloss ich, wie ich sie einsetzen würde. Einfach die Sitzung direkt vor seinen Augen zu beenden, wäre zu einfach gewesen. Ich hatte eine bessere Idee – einfach ganz zu verschwinden.
Nach Ich erkannte, dass ich einen Code schreiben konnte, der zwei Dinge tun würde. Zunächst würde er den kürzlich freigegebenen TCP-Port 5900 belegen, der zuvor von dem unwissenden VNC-Serverprozess verwendet wurde. Dann würde er eine neue TCP-Verbindung zum VNC-Server des angegebenen Computers herstellen. Der Code würde einfach alle Daten zwischen den beiden Sockets weiterleiten, und Columbo würde denken, dass er sich mit mir verbindet, während er sich tatsächlich mit einem völlig anderen VNC-Server verbindet.
Mein Code würde als geheimer Brücke zwischen mir und irgendeiner anderen bedauernswerten Seele nach meiner Wahl fungieren. Das war großartig.
Ich begann sofort, meine gefälschte VNC-Brücke zu schreiben. Columbo hat sich mehrmals mit mir verbunden, aber ich programmierte weiter vor seinen Augen. Ich kam zu dem Schluss, dass er keine Ahnung von meinen Aktivitäten hatte, obwohl ich offensichtliche Dinge wie Portnummern und Kommentare wie // Прощай, жуткий шпион VNC.
Nach ein paar Tagen konnte ich den Code einfach nicht richtig zum Laufen bringen. Was noch schlimmer war, ich arbeitete fast ständig mit dem schwarzen VNC-Symbol im Systemtray. Solange es verbunden war, konnte ich den Port nicht freigeben, um meinen Code zu überprüfen.
Hätte ich damals gewusst über netcat!
Schließlich hielten meine Nerven nicht mehr aus, ich war schließlich ein ungeduldiger 17-Jähriger. Während ich zusah, wie das weiße VNC-Server-Symbol schwarz wurde, wurde ich wütend, öffnete den ursprünglichen Code, der die Nachrichtenwarteschlange füllte, und ließ ihn vor seinen Augen laufen. Ich wartete sogar ein paar Sekunden, bevor ich auf End Process, klickte, nur um sicherzustellen, dass er es sah.
Wenn das Drücken dieser Taste mich noch nicht vollkommen überzeugt hatte, dass es sich gelohnt hat, dann war sein Sprung von seiner Monitorstärke, um schnell zu mir zu kommen und mich aus dem Raum zu begleiten, definitiv die Mühe wert.
Letztendlich wurde mir für zwei Wochen der Zugang zum Netzwerk verboten. Eine gerechte Strafe, dachte ich. Etwa drei Wochen später verschwand der VNC-Server aus den Boot-Skripten und tauchte nirgends mehr auf. Ich erfuhr nie, ob mein Vorfall dabei eine Rolle spielte oder nicht, aber er zerstörte völlig meinen Plan, mich durch den Verkauf meiner VNC-Waffe an unterdrückte Studenten in den Computerzentren der Hochschulen im ganzen Land zu bereichern.
Quelle: habr.com
