Coder Battle: Ik versus die VNC-man

В deze blog Er zijn nogal wat programmeursverhalen gepubliceerd. Ik haal graag herinneringen op aan mijn oude stomme dingen. Nou, hier is nog zo'n verhaal.

Ik raakte voor het eerst geïnteresseerd in computers, vooral programmeren, toen ik ongeveer 11 jaar oud was. Aan het begin van de middelbare school bоIk besteedde het grootste deel van mijn vrije tijd aan het sleutelen aan mijn C64 en het schrijven van BASIC, en knipte vervolgens de slechte code uit met een schaar. Ik maak geen grapje, schaar.

Na school (rond de leeftijd van 16 jaar) gaan Britse kinderen meestal naar de universiteit, waar ze ervoor kiezen drie of vier vakken te studeren voordat ze naar de universiteit gaan. Gezien mijn liefde voor de beige doos en bandrecorder thuis, besloot ik dat een studie computerwetenschappen op de universiteit de juiste keuze was.

Ik heb meer van de cursus genoten dan ik had verwacht; daar ontmoette ik Pascal en Delphi voor het eerst.

Tijdens de pauzes tussen de lessen door konden de leerlingen op elke vrije machine in het computerlokaal werken. Stel je voor: een enorme ruimte, ontworpen voor ongeveer honderd mensen, met rijen tafels gevuld met machines, zoals die waar de monitor op de systeemunit staat. De fans neuriën voortdurend, muisballen zoemen op de tafels en stoppen geen seconde. Er hangt een vreemde geur in de lucht, alsof 50-100 hormonale tieners periodiek veranderen om honderden Pentium III-chips te koelen.

Ondanks de gezondheidsrisico’s zat ik graag achter de computer als ik een minuutje vrij had.

De dienstdoende beheerder in de kamer was een kleine man van middelbare leeftijd die voor deze rol werd gekozen vanwege zijn onverzadigbare verlangen om een ​​kwaadaardige dictator te worden. Ik denk het. Van dienst is een understatement; de man hield echt van zijn werk. Hij kreeg de taak de orde te bewaren, zodat niemand de schoolcomputer voor iets ongepasts gebruikte.

Tot op de dag van vandaag zegt mijn intuïtie me dat de bonus van de beheerder rechtstreeks afhing van het aantal studenten dat hij bij de hand pakte en uit de computerruimte begeleidde. Ik ben er vrij zeker van dat deze man zijn hypotheek vervroegd heeft afbetaald.

Hij zat in de verste hoek van de computerkamer aan een hoektafel. En het was veilig om aan te nemen dat zijn vruchtbaarheidsmeters een manier hadden gevonden om zich voort te planten met een indrukwekkend korte draagtijd, het waren er zo veel. Je kon je alleen maar afvragen of hij werkelijk tijd had om ze allemaal bij te houden. Natuurlijk maak ik een grapje... had ik al gezegd dat hij zijn werk heel serieus nam?

Op dat moment draaide het computernetwerk Windows 2000. Ik ontdekte al snel dat elke keer dat ik inlogde op het systeem, er een script werd gelanceerd dat specificeerde dat de VNC-server moest worden gestart vanaf het beheerdersaccount voor externe toegang tot het bureaublad. Wanneer deze man je wilde bespioneren, maakte hij rechtstreeks verbinding met je machine en keek mee. Het was griezelig, en nu ik erover nadenk, waarschijnlijk illegaal.

Nadat ik mijn tanden had gezet in BASIC en C64, schreef ik nu in C en zelfs een beetje C++. Destijds was ik nog steeds erg geïnteresseerd in de D-taal, die enkele tekortkomingen van C++ corrigeerde, zoals ik die toen zag.

Ik ging vaak naar de computerkamer om iets nieuws te lezen over D of om te spelen met de Digital Mars D-compiler. Soms, terwijl ik afgeleid was van het nadenken over de grote toekomst van D, schreef ik C-code om andere Win32-programma's door hun venster te hacken. handvatten.

In de goede oude tijd van Win32-programmeren was het vinden van een vensterhandgreep de gemakkelijkste methode om andere programma's te hacken. Het is duidelijk dat alle GUI-programma's op Windows een venster hadden, ook al verscheen dit niet op het scherm. Door een programma te schrijven dat een ingang naar een ander proces ophaalt (in wezen een link ernaar), kun je er berichten naartoe sturen. Dit maakte enkele basisbewerkingen mogelijk, zoals het verbergen/tonen van een programmavenster, maar ook hele coole dingen, zoals het dwingen van een proces om een ​​willekeurige DLL in zijn geheugenruimte te laden en te beginnen met het uitvoeren van code. Na de DLL-injectie begon het plezier.

In de eerste anderhalve maand had ik niet veel last van deze detective; hij maakte slechts één of twee keer verbinding met de VNC-server op mijn machine. Maar een bepaalde sessie kan zijn interesse hebben gewekt. Ik was wat C-code aan het schrijven om Mijnenveger-vensters te verbergen (zonder ze te sluiten) om het spelen in de klas gemakkelijker te maken, toen ik merkte dat het witte VNC-pictogram in het systeemvak zwart was geworden. Dit betekende dat hij nu naar mij keek.

Ik ging zoals gewoonlijk door met coderen en probeerde hem te negeren. Ondertussen begon de machine te vertragen en probeerde de maximale framesnelheid naar een van de talloze monitoren in de hoek van de kamer te verzenden. Windows reageerde bijna niet meer, toen mijn geduld op was, logde ik uit en was klaar voor vandaag.

Bij daaropvolgende bezoeken aan de computerruimte was Colombo bijna elke keer zeer geïnteresseerd in wat ik deed. Na ongeveer de vierde keer besloot ik: hier moet ik iets aan doen.

Ik geef toe dat een redelijk, rationeel persoon deze kwestie eenvoudigweg rechtstreeks bij hem of zijn baas had kunnen aankaarten. Ik gaf echter altijd toe aan de verleiding en wist mezelf al snel over te halen een heel andere strategie te volgen.

- Je kunt niets doen zonder deze VNC-server! — zei ik verschillende keren kalm en resoluut tegen mezelf.

Het was noodzakelijk om VNC te doden.

Ik begon met grote groepen studenten de computerruimte in te gaan en zo ver mogelijk uit de hoek te zitten met de monitoren. Dit werkte een tijdje en gaf me wat tijd om ideeën te testen.

Mijn eerste poging, daar ben je het mee eens, was behoorlijk zwak. Toen ik met de rechtermuisknop op het VNC-pictogram in het systeemvak klikte, zag ik een menu met de magische letters EXIT. Helaas waren de brieven geschreven in grijze omtrektekst. De beheerder heeft het menu-item "Afsluiten" uitgeschakeld via de Groepsbeleid-editor. Ik probeerde het proces vanuit Taakbeheer te beëindigen, maar het was natuurlijk onzichtbaar voor mij omdat het onder een ander, meer bevoorrecht account draaide. Het lukte niet.

De VNC-server draait op TCP-poort 5900, herinnerde ik me. Mijn volgende plan was om beschadigde pakketten naar deze poort te sturen om deze te laten crashen.

Ik heb minstens een paar dagen besteed aan het sleutelen aan het protocol, waarbij ik verschillende vormen van goed gestructureerde onzin naar poort 5900 stuurde in de hoop dat het kapot zou gaan. Uiteindelijk werkte dat ook niet.

Ik begon al te denken dat ik dit ding niet kwijt zou kunnen raken, toen het plotseling tot me doordrong: daar moet een raam zijn! We moeten het weergeven. Misschien heeft het een mooie, sappige “Mute”-knop die ik goed kan gebruiken!

Ik heb mijn nu bijna perfecte C-code uitgevoerd om de ingang naar het hoofdvenster van een ander proces te vinden - en inderdaad, VNC werd gevonden. Ik voelde me geïnspireerd toen mijn vingers typten WM_SHOWWINDOW. Probeer te raden wat ik voor me zag?

Niks!

Nu was ik nieuwsgierig... het had een venster, maar het negeerde mijn berichten. Ik heb mijn code dubbel gecontroleerd om er zeker van te zijn dat deze werkt. Ik heb het op verschillende andere processen getest en het werkte prima. Ik probeerde andere berichten naar het VNC-venster te sturen, maar nog steeds niets.

En toen drong het weer tot mij door!

Dankzij het zeer dikke het boek Charles Petzold Ik heb zorgvuldig bestudeerd hoe Win32-processen binnen het systeem werken. Elke Win32-applicatie heeft zowel een venster als een "berichtenwachtrij". Berichten die worden geactiveerd door gebruikersinteractie, evenals berichten die door Windows zelf worden verzonden, komen in een wachtrij terecht en de toepassing beslist zelf hoe ze worden verwerkt.

Op zich niet zo interessant. Maar toen ik besefte dat een wachtrij met onverwerkte berichten die groot genoeg was, fungeerde als heuristiek voor Window Process Manager om in te grijpen in een vastgelopen proces, begon ik pure serotonine te zweten.

Zonder een seconde te verspillen, keerde ik terug naar mijn C-code en bereidde ik me voor om nog een bericht naar het hoofdvenster van VNC te sturen WM_SHOWWINDOW. In een cyclus. Eeuwig. Veel berichten dus. WM_SHOWWINDOW, waarvan ik nu wist dat VNC het volledig zou proberen te negeren... op eigen risico.

Ik heb 4 KB van de meest vrijheidslievende code van mijn leven gecompileerd en uitgevoerd. Na ongeveer drie seconden meldde Windows dat het proces vncserver.ехе antwoordt niet en deed een aanbod dat ik simpelweg niet kon weigeren:

Wilt u dit proces voltooien?

JAZEKER!

Laat ik toegeven dat ik de rest van de dag ondraaglijk tevreden was met mezelf.

Nadat ik een paar uur mijn nieuwe superkracht had verteerd, besloot ik hoe ik die zou gebruiken. Het was te gemakkelijk om de sessie zomaar vlak voor zijn ogen te beëindigen. Ik had een beter idee: volledig verdwijnen.

Na Vuurdoop met socketprogrammering Ik besefte dat ik code kon schrijven die twee dingen zou doen. Het zal eerst de nieuw vrijgekomen TCP-poort 5900 bezetten, voorheen bezet door het onwetende VNC-serverproces. Vervolgens wordt er een nieuwe TCP-verbinding tot stand gebracht met de VNC-server van de opgegeven machine. De code zal eenvoudigweg alle gegevens tussen de twee sockets proxyen, en Columbo zal denken dat hij verbinding met mij maakt, terwijl hij in feite verbinding zal maken met een compleet andere VNC-server.

Mijn code zal fungeren als een geheime brug tussen mij en een andere arme ziel van mijn keuze. Het was geweldig.

Ik begon meteen met het schrijven van mijn nep-VNC-bridge. Columbo maakte verschillende keren verbinding met mij, maar ik bleef voor hem programmeren. Ik kwam tot de conclusie dat hij geen idee had wat ik deed, ook al schreef ik voor de hand liggende dingen zoals poortnummers en opmerkingen als // Прощай, жуткий шпион VNC.

Na een paar dagen kreeg ik de code niet correct werkend. Tot overmaat van ramp werkte ik bijna continu met het zwarte VNC-pictogram in het systeemvak. Terwijl deze was aangesloten, kon ik de poort niet vrijgeven om mijn code te testen.

Als ik het toen had geweten netcat!

Uiteindelijk bezweken mijn zenuwen; ik was tenslotte een ongeduldige zeventienjarige jongen. Toen ik zag hoe het witte VNC-serverpictogram weer zwart werd, raakte ik in paniek, opende de originele code die de berichtenwachtrij bevolkte en liet deze voor zijn ogen lopen. Ik wachtte zelfs een paar seconden voordat ik klikte End Process, gewoon om er zeker van te zijn dat hij het zag.

Als het indrukken van die knop mij er niet volledig van overtuigde dat het de moeite waard was, dan deed hij dat, die achter zijn fort van monitoren vandaan sprong om me snel te benaderen en me de kamer uit te loodsen, dat zeker wel.

Als gevolg hiervan werd ik voor twee weken van het netwerk verbannen. Een terechte straf, dacht ik. Na ongeveer drie weken verdween de VNC-server uit de opstartscripts en verscheen nergens anders. Ik heb nooit geweten of mijn incident hierin een rol speelde of niet, maar het verpestte volledig mijn plan om fabelachtig rijk te worden door mijn VNC-pistool te verkopen aan depressieve studenten in computerzalen van universiteiten in het hele land.

Bron: www.habr.com

Voeg een reactie