Coder Battle: Me vs. That VNC Guy

В denne blog En hel del programmørfortællinger er blevet offentliggjort. Jeg kan godt lide at mindes mine gamle dumme ting. Nå, her er endnu en sådan historie.

Jeg blev først interesseret i computere, især programmering, da jeg var omkring 11 år gammel. I begyndelsen af ​​gymnasiet bоJeg brugte det meste af min fritid på at pille ved min C64 og skrive BASIC og derefter klippe den dårlige kode ud med en saks. Jeg laver ikke sjov, saks.

Efter skoletid (omkring de 16 år) går britiske børn normalt på college, hvor de vælger at læse tre eller fire fag, inden de går på universitetet. I betragtning af min kærlighed til den beige æske og båndoptager derhjemme, besluttede jeg, at det at studere "datalogi" på college var det rigtige valg.

Jeg nød kurset mere, end jeg havde forventet; der mødte jeg først Pascal og Delphi.

I pauserne mellem timerne kunne eleverne arbejde på enhver ledig maskine i computerrummet. Forestil dig: et stort rum, designet til omkring hundrede mennesker, med rækker af borde fyldt med maskiner, som dem, hvor skærmen står på systemenheden. Fansene nynner konstant, musebolde summer på bordene og stopper ikke et sekund. Der er en mærkelig lugt i luften, som om 50-100 hormonelle teenagere periodisk skifter for at afkøle hundredvis af Pentium III-chips.

På trods af sundhedsrisiciene kunne jeg godt lide at sidde ved computeren, når jeg havde et friminut.

Vagtadministratoren i lokalet var en lav, midaldrende mand, som blev valgt til denne rolle på grund af sit umættelige ønske om at blive en ond diktator. Det tror jeg. På vagt er en underdrivelse; fyren elskede virkelig sit job. Han fik til opgave at holde orden, så ingen brugte skolens computer til noget upassende.

Den dag i dag fortæller min intuition mig, at administratorens bonus direkte afhang af antallet af elever, han tog i hånden og eskorterede ud af computerrummet. Jeg er ret sikker på, at denne fyr betalte sit realkreditlån tidligt.

Han sad i det fjerneste hjørne af computerrummet ved et hjørnebord. Og det var sikkert at antage, at hans fertilitetsmonitorer havde fundet en måde at formere sig på med en imponerende kort drægtighedsperiode, der var så mange af dem. Man kunne kun spekulere på, om han virkelig havde tid til at holde styr på dem alle. Selvfølgelig, jeg laver sjov... har jeg nævnt, at han tog sit arbejde meget seriøst?

På det tidspunkt kørte computernetværket Windows 2000. Jeg opdagede hurtigt, at hver gang jeg loggede på systemet, blev der lanceret et script, der specificerede at starte VNC-serveren fra administratorkontoen for fjernadgang til skrivebordet. Hver gang denne fyr ville udspionere dig, ville han oprette forbindelse direkte til din maskine og se på. Det var uhyggeligt, og nu hvor jeg tænker over det, sandsynligvis ulovligt.

Efter at have skåret mine tænder på BASIC og C64, skrev jeg nu i C og endda lidt C++. På det tidspunkt var jeg stadig meget interesseret i D-sproget, som rettede nogle af manglerne ved C++, som jeg så det dengang.

Jeg plejede at gå ind i computerrummet for at læse noget nyt på D eller lege med Compileren Digital Mars D. Nogle gange, mens jeg blev distraheret fra at tænke på D's store fremtid, skrev jeg C-kode for at hacke andre Win32-programmer gennem deres vindue håndtag.

I de gode gamle dage med Win32-programmering var det at finde et vindueshåndtag den nemmeste metode til at hacke andre programmer. Det er klart, at alle GUI-programmer på Windows havde et vindue, selvom det ikke dukkede op på skærmen. Ved at skrive et program til at hente et håndtag til en anden proces (i det væsentlige et link til det), kan du sende beskeder til det. Dette gav mulighed for nogle grundlæggende operationer som at skjule/vise et programvindue, samt virkelig fede ting som at tvinge en proces til at indlæse en vilkårlig DLL i dens hukommelsesplads og begynde at udføre kode. Efter DLL-injektionen begyndte det sjove.

I den første halvanden måned generede denne detektiv mig ikke meget; den sluttede kun til VNC-serveren på min maskine en eller to gange. Men en bestemt session har sandsynligvis vakt hans interesse. Jeg skrev noget C-kode for at skjule minestrygervinduer (uden at lukke dem) for at gøre det nemmere at spille i klassen, da jeg bemærkede, at det hvide VNC-ikon i systembakken var blevet sort. Det betød, at han nu holdt øje med mig.

Jeg fortsatte med at kode som sædvanlig og prøvede at ignorere ham. I mellemtiden begyndte maskinen at sænke farten og forsøgte at sende den maksimale billedhastighed til en af ​​de utallige skærme i hjørnet af rummet. Windows holdt næsten op med at reagere, da min tålmodighed løb op, loggede jeg ud og blev færdig for dagen.

Ved efterfølgende besøg i computerrummet interesserede Colombo sig stort for, hvad jeg lavede næsten hver gang. Efter cirka fjerde gang besluttede jeg: Jeg er nødt til at gøre noget ved det her.

Jeg indrømmer, at en fornuftig, rationel person blot kunne have rejst dette spørgsmål direkte med ham eller sin chef. Jeg gav dog altid efter for fristelsen og overtalte mig hurtigt til at tage en helt anden strategi.

- Du kan ikke gøre noget uden denne VNC-server! — Jeg sagde roligt og bestemt til mig selv flere gange.

Det var nødvendigt at dræbe VNC.

Jeg begyndte at gå ind i computerrummet med store grupper af elever og sad så langt væk fra hjørnet med monitorerne som muligt. Dette virkede i et stykke tid og gav mig tid til at teste ideer.

Mit første forsøg, jeg tror, ​​du er enig i, var ret svagt. Ved at højreklikke på VNC-ikonet i systembakken, så jeg en menu med de magiske bogstaver EXIT. Desværre var bogstaverne skrevet med grå konturtekst. Administratoren har deaktiveret menupunktet "Afslut" gennem Group Policy Editor. Jeg forsøgte at dræbe processen fra Task Manager, men den var selvfølgelig usynlig for mig, fordi den kørte under en anden, mere privilegeret konto. Det lykkedes ikke.

VNC-serveren kører på TCP-port 5900, huskede jeg. Min næste plan var at sende korrupte pakker til denne port for at crashe den.

Jeg brugte mindst et par dage på at pille ved protokollen, sende forskellige former for velstruktureret lort til port 5900 og håbe, at den ville gå i stykker. I sidste ende virkede det heller ikke.

Jeg var allerede begyndt at tænke på, at jeg ikke ville være i stand til at slippe af med denne ting, da det pludselig gik op for mig: der må være et vindue der! Vi skal vise det frem. Måske vil den have en dejlig saftig "Mute"-knap, som jeg kan bruge!

Jeg kørte min nu næsten perfekte C-kode for at finde håndtaget til hovedvinduet i en anden proces - og ganske rigtigt blev VNC fundet. Jeg følte mig inspireret, da mine fingre skrev WM_SHOWWINDOW. Prøv at gætte, hvad jeg så foran mig?

Ikke noget!

Nu var jeg nysgerrig... den havde et vindue, men den ignorerede mine beskeder. Jeg dobbelttjekkede min kode for at sikre, at den virker. Testede det på flere andre processer, og det fungerede godt. Jeg prøvede at sende andre beskeder til VNC-vinduet, og stadig ingenting.

Og så gik det op for mig igen!

Takket være den meget tykke bogen Charles Petzold Jeg studerede omhyggeligt, hvordan Win32-processer fungerer inde i systemet. Hvert Win32-program har et vindue samt en "meddelelseskø". Beskeder udløst af brugerinteraktion, samt meddelelser sendt af Windows selv, ankommer i en kø, og applikationen bestemmer selv, hvordan de skal behandles.

Ikke særlig interessant i sig selv. Men da jeg indså, at en stor nok ubehandlet beskedkø fungerede som en heuristik til, at Window Process Manager kunne gribe ind i en hængt proces, begyndte jeg at svede ren serotonin.

Uden at spilde et sekund vendte jeg tilbage til min C-kode og forberedte mig på at sende endnu en besked til VNC-hovedvinduet WM_SHOWWINDOW. I en cyklus. Evig. Så mange beskeder. WM_SHOWWINDOW, som jeg nu vidste, at VNC ville forsøge at ignorere fuldstændigt... på dets fare.

Jeg kompilerede og kørte 4KB af mit livs mest frihedselskende kode. Efter cirka tre sekunder rapporterede Windows, at processen vncserver.ехе svarer ikke, og kom med et tilbud, som jeg simpelthen ikke kunne afslå:

Vil du fuldføre denne proces?

FOR HELVEDE JA!

Lad mig indrømme, at jeg resten af ​​dagen var ulidelig tilfreds med mig selv.

Efter et par timer med at fordøje min nye superkraft, besluttede jeg mig for, hvordan jeg ville bruge den. Det var for nemt bare at dræbe sessionen lige foran ham. Jeg havde en bedre idé - at forsvinde helt.

Efter ilddåb med fatningsprogrammering Jeg indså, at jeg kunne skrive kode, der ville gøre to ting. Den vil først optage den nyligt frigivne TCP-port 5900, som tidligere var optaget af den uvidende VNC-serverproces. Derefter vil den oprette en ny TCP-forbindelse til VNC-serveren på den angivne maskine. Koden vil simpelthen proxy alle data mellem de to sockets, og Columbo vil tro, at han opretter forbindelse til mig, mens han faktisk vil oprette forbindelse til en helt anden VNC-server.

Min kode vil fungere som en hemmelig bro mellem mig og en anden stakkel efter mit valg. Det var vidunderligt.

Jeg begyndte straks at skrive min falske VNC-bro. Columbo havde forbindelse til mig flere gange, men jeg fortsatte med at programmere foran ham. Jeg kom til den konklusion, at han ikke anede, hvad jeg lavede, selvom jeg skrev indlysende ting som portnumre og kommentarer som f.eks. // Прощай, жуткий шпион VNC.

Efter et par dage kunne jeg ikke få koden til at virke korrekt. For at gøre ondt værre arbejdede jeg næsten kontinuerligt med det sorte VNC-ikon i systembakken. Mens den var tilsluttet, kunne jeg ikke frigive porten for at teste min kode.

Hvis jeg havde vidst det dengang netcat!

Til sidst gav mine nerver efter, jeg var trods alt en utålmodig 17-årig fyr. Da jeg så det hvide VNC-serverikon blive sort igen, flippede jeg ud, åbnede den originale kode, der udfyldte beskedkøen, og kørte den foran hans øjne. Jeg ventede endda et par sekunder, før jeg klikkede End Process, bare for at sikre, at han så det.

Hvis det ikke helt overbeviste mig om, at det var det værd, at trykke på den knap, så sprang han bagved sin fæstning af skærme for hurtigt at nærme mig mig og føre mig ud af rummet.

Som et resultat blev jeg udelukket fra netværket i to uger. En rimelig straf, tænkte jeg. Efter cirka tre uger forsvandt VNC-serveren fra opstartsscripts og dukkede aldrig op andre steder. Jeg vidste aldrig, om min hændelse spillede nogen rolle i dette eller ej, men det ødelagde fuldstændig min plan om at blive fabelagtig rig ved at sælge min VNC-pistol til deprimerede studerende i computerhaller på universiteter over hele landet.

Kilde: www.habr.com

Tilføj en kommentar