Bătălia codificatorului: eu împotriva tipului ăla VNC

В acest blog Au fost publicate destule povești despre programatori. Îmi place să-mi amintesc vechile mele prostii. Ei bine, iată o altă astfel de poveste.

M-am interesat prima dată de calculatoare, în special de programare, când aveam vreo 11 ani. La începutul liceului bоMi-am petrecut cea mai mare parte a timpului liber lucrând cu C64-ul meu și scriind BASIC, apoi decupând codul prost cu foarfecele. Nu glumesc, foarfece.

După școală (în jurul vârstei de 16 ani), copiii britanici merg de obicei la facultate, unde aleg să studieze trei sau patru materii înainte de a merge la universitate. Având în vedere dragostea mea pentru caseta bej și magnetofonul de acasă, am decis că studiul „informatică” la facultate era alegerea potrivită.

Mi-a plăcut cursul mai mult decât mă așteptam; acolo i-am întâlnit prima dată pe Pascal și Delphi.

În pauzele dintre cursuri, elevii puteau lucra la orice aparat liber din sala de calculatoare. Imaginați-vă: o cameră imensă, concepută pentru aproximativ o sută de oameni, cu șiruri de mese pline cu mașini, precum cele în care se află monitorul pe unitatea de sistem. Fanii fredonează în permanență, bile de șoarece bâzâie pe mese, fără să se oprească nicio secundă. În aer se simte un miros ciudat, de parcă 50-100 de adolescenți hormonali se schimbă periodic pentru a răci sute de cipuri Pentium III.

În ciuda riscurilor pentru sănătate, îmi plăcea să stau la computer când aveam un minut liber.

Administratorul de serviciu din sală era un bărbat scund, de vârstă mijlocie, care a fost ales pentru acest rol din cauza dorinței sale nesățioase de a deveni un dictator rău. Presupun că da. La datorie este un eufemism; tipul și-a iubit cu adevărat meseria. El a fost însărcinat cu menținerea ordinii, astfel încât nimeni să nu folosească computerul școlii pentru ceva nepotrivit.

Până astăzi, intuiția mea îmi spune că bonusul administratorului depindea direct de numărul de studenți pe care i-a prins de mână și i-a însoțit din sala de calculatoare. Sunt destul de sigur că tipul ăsta și-a plătit ipoteca mai devreme.

Stătea în colțul îndepărtat al sălii de calculatoare, la o masă din colț. Și era sigur să presupunem că monitoarele lui de fertilitate au găsit o modalitate de a se reproduce cu o perioadă de gestație impresionant de scurtă, erau atât de mulți dintre ei. Nu se putea decât să se întrebe dacă chiar a avut timp să le urmărească pe toate. Bineînțeles că glumesc... am menționat că și-a luat munca foarte în serios?

La acel moment, rețeaua de calculatoare rula Windows 2000. Am descoperit curând că de fiecare dată când mă autentificam în sistem, era lansat un script care specifica pornirea serverului VNC din contul de administrator pentru acces de la distanță la desktop. Ori de câte ori acest tip dorea să te spioneze, se conectează direct la aparatul tău și urmărea. A fost înfiorător, iar acum că mă gândesc, probabil ilegal.

După ce mi-am tăiat dinții pe BASIC și C64, am scris acum în C și chiar puțin C++. La acel moment, eram încă foarte interesat de limbajul D, care a corectat unele dintre deficiențele C++, așa cum l-am văzut atunci.

Obișnuiam să intru în sala de calculatoare să citesc ceva nou pe D sau să mă joc cu compilatorul Digital Mars D. Uneori, în timp ce eram distras de la a mă gândi la marele viitor al lui D, scriam cod C pentru a sparge alte programe Win32 prin fereastra lor. mânere.

În vremurile bune ale programării Win32, găsirea unui mâner de fereastră era cea mai ușoară metodă de a pirata alte programe. Evident, toate programele GUI de pe Windows aveau o fereastră, chiar dacă nu apărea pe ecran. Scriind un program pentru a prelua un handle către un alt proces (în esență un link către acesta), ai putea trimite mesaje către acesta. Acest lucru a permis unele operațiuni de bază, cum ar fi ascunderea/afișarea unei ferestre de program, precum și lucruri foarte interesante, cum ar fi forțarea unui proces să încarce un DLL arbitrar în spațiul său de memorie și să înceapă să execute cod. După injectarea DLL, a început distracția.

În prima lună și jumătate, acest detectiv nu m-a deranjat prea mult; s-a conectat la serverul VNC de pe mașina mea doar o dată sau de două ori. Dar o anumită sesiune i-a stârnit interesul. Scriam niște cod C pentru a ascunde ferestrele Minesweeper (fără să le închid) pentru a fi mai ușor de jucat în clasă, când am observat că pictograma VNC albă din bara de sistem se înnegrise. Asta însemna că acum mă urmărea.

Am continuat să codific ca de obicei, încercând să-l ignor. Între timp, aparatul a început să încetinească, încercând să transmită rata maximă de cadre la unul dintre nenumăratele monitoare din colțul camerei. Windows aproape că a încetat să mai răspundă, când mi-a epuizat răbdarea, m-am deconectat și am terminat ziua.

În vizitele ulterioare la sala de calculatoare, Colombo a fost foarte interesat de ceea ce făceam aproape de fiecare dată. După aproximativ a patra oară, m-am hotărât: trebuie să fac ceva în privința asta.

Recunosc că o persoană rezonabilă, rațională ar fi putut pur și simplu să ridice această problemă direct cu el sau cu șeful său. Cu toate acestea, întotdeauna am cedat tentației și m-am convins rapid să adopt o strategie complet diferită.

- Nu poți face nimic fără acest server VNC! — Mi-am spus calm și hotărât de mai multe ori.

A fost necesar să-l ucizi pe VNC.

Am început să intru în sala de calculatoare cu grupuri mari de studenți și să stau cât mai departe de colțul cu monitoarele. Acest lucru a funcționat o perioadă și mi-a dat timp să testez idei.

Prima mea încercare, cred că veți fi de acord, a fost destul de slabă. Făcând clic dreapta pe pictograma VNC din bara de sistem, am văzut un meniu cu literele magice EXIT. Din păcate, scrisorile au fost scrise în text cu contur gri. Administratorul a dezactivat elementul de meniu „Ieșire” prin Editorul de politici de grup. Am încercat să opresc procesul din Task Manager, dar, desigur, era invizibil pentru mine, deoarece rula sub un cont diferit, mai privilegiat. Nu a mers.

Serverul VNC rulează pe portul TCP 5900, mi-am amintit. Următorul meu plan a fost să trimit pachete corupte în acest port pentru a-l bloca.

Mi-am petrecut cel puțin câteva zile manipulând protocolul, trimițând diverse forme de prostie bine structurată în portul 5900 și sperând că se va rupe. Până la urmă, nici asta nu a mers.

Începeam deja să mă gândesc că nu voi putea scăpa de chestia asta, când mi-a venit deodată în minte: trebuie să fie o fereastră acolo! Trebuie să-l afișăm. Poate că va avea un buton suculent „Mute” pe care îl pot folosi foarte bine!

Mi-am rulat codul C acum aproape perfect pentru a găsi mânerul către fereastra principală a unui alt proces - și, destul de sigur, a fost găsit VNC. M-am simțit inspirat când mi-au tastat degetele WM_SHOWWINDOW. Încerci să ghicesc ce am văzut în fața mea?

Nimic!

Acum eram curios... avea o fereastră, dar îmi ignora mesajele. Mi-am verificat codul pentru a mă asigura că funcționează. L-am testat pe mai multe alte procese și a funcționat grozav. Am încercat să trimit alte mesaje în fereastra VNC și tot nimic.

Și apoi mi-a dat din nou seama!

Datorită foarte gros cartea Charles Petzold Am studiat cu atenție cum funcționează procesele Win32 în interiorul sistemului. Fiecare aplicație Win32 are o fereastră, precum și o „coadă de mesaje”. Mesajele declanșate de interacțiunea utilizatorului, precum și mesajele trimise de Windows însuși, ajung într-o coadă, iar aplicația însăși decide cum să le proceseze.

Nu foarte interesant în sine. Dar când mi-am dat seama că o coadă de mesaje neprocesată suficient de mare a acționat ca o euristică pentru ca Window Process Manager să intervină într-un proces suspendat, am început să transpir serotonină pură.

Fără să pierd o secundă, am revenit la codul meu C, pregătindu-mă să trimit un alt mesaj către fereastra principală VNC WM_SHOWWINDOW. Într-un ciclu. Etern. Deci, multe mesaje. WM_SHOWWINDOW, pe care acum știam că VNC va încerca să o ignore complet... pe riscul său.

Am compilat și rulat 4KB din cel mai iubitor de liber cod din viața mea. După aproximativ trei secunde, Windows a raportat că procesul vncserver.ехе nu răspunde și am făcut o ofertă pe care pur și simplu nu am putut-o refuza:

Doriți să finalizați acest proces?

DA!

Permiteți-mi să recunosc că pentru restul zilei am fost insuportabil de mulțumit de mine.

După câteva ore petrecute digerând noua mea superputere, am decis cum o voi folosi. A fost prea ușor să omorâți sesiunea chiar în fața lui. Am avut o idee mai bună - să dispar complet.

După botez de foc cu programare priza Mi-am dat seama că pot scrie cod care ar face două lucruri. Acesta va ocupa mai întâi portul TCP 5900 nou eliberat, ocupat anterior de procesul serverului VNC necunoscut. Apoi va crea o nouă conexiune TCP la serverul VNC al mașinii specificate. Codul va trimite pur și simplu toate datele dintre cele două prize, iar Columbo va crede că se conectează la mine, când de fapt se va conecta la un server VNC complet diferit.

Codul meu va acționa ca o punte secretă între mine și un alt biet suflet pe care l-am ales. A fost minunat.

Am început imediat să scriu falsul meu pod VNC. Columbo m-a conectat de mai multe ori, dar am continuat să programez în fața lui. Am ajuns la concluzia că habar nu avea ce făceam, deși am scris lucruri evidente, cum ar fi numere de port și comentarii de genul // Прощай, жуткий шпион VNC.

După câteva zile nu am reușit să fac ca codul să funcționeze corect. Pentru a înrăutăți lucrurile, lucram aproape continuu cu pictograma neagră VNC din bara de sistem. În timp ce era conectat, nu am putut elibera portul pentru a-mi testa codul.

Dacă aș fi știut atunci netcat!

În cele din urmă, nervii mi-au cedat; la urma urmei, eram un tip nerăbdător de 17 ani. Privind pictograma albă a serverului VNC devenind din nou neagră, m-am speriat, am deschis codul original care a populat coada de mesaje și l-am pus în fața ochilor lui. Am așteptat chiar și câteva secunde înainte să dau clic End Process, doar pentru a fi sigur că a văzut-o.

Dacă apăsarea butonului acela nu m-a convins pe deplin că merită, atunci el săritul din spatele cetății sale de monitoare pentru a se apropia rapid de mine și a mă scoate din cameră cu siguranță a făcut-o.

Drept urmare, am fost exclus din rețea timp de două săptămâni. O pedeapsă corectă, m-am gândit. După aproximativ trei săptămâni, serverul VNC a dispărut din scripturile de pornire și nu a apărut niciodată în altă parte. Nu am știut niciodată dacă incidentul meu a jucat vreun rol în asta sau nu, dar mi-a distrus complet planul de a deveni fabulos de bogat vânzându-mi pistolul VNC studenților deprimați din sălile de calculatoare a colegiilor din toată țara.

Sursa: www.habr.com

Adauga un comentariu