În au fost publicate multe povești despre programatori. Îmi place să îmi amintesc de vechile mele prostii. Ei bine, iată o altă astfel de poveste.
M-am interesat pentru prima dată de computere, în special de programare, când aveam aproximativ 11 ani. La începutul liceului,marecea mai mare parte a timpului liber m-am jucat cu C64-ul meu și am scris în BASIC, apoi taie codul prost cu foarfeca. .
După școală (la vârsta de aproximativ 16 ani), copiii britanici merg de obicei la colegiu, unde aleg să studieze trei-patru materii înainte de a merge la universitate. Având în vedere dragostea mea pentru cutia bej și caseta de acasă, am decis că a studia 'informatică' la colegiu era alegerea corectă.
Cursul mi-a plăcut mai mult decât mă așteptam; acolo am descoperit pentru prima dată Pascal și Delphi.
În pauzele dintre cursuri, studenții puteau lucra la orice mașină liberă din sala de computere. Imaginează-ți: o cameră uriașă, destinată undeva la o sută de persoane, cu rânduri de mese pline de mașini – genul acela în care monitorul stă pe unitatea centrală. Un zumzet constant al ventilatoarelor, bilele de mouse care trosnesc pe mese neîncetat. Aerul avea un miros ciudat, ca și cum 50-100 de adolescenți care emană hormoni se schimbau 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.
În cameră era un administrator de serviciu, un bărbat scund de vârstă medie, ales pentru acest rol din cauza dorinței sale neînfrânate de a deveni un dictator rău. Asta cred. A fost o euforie slăbită să spun așa, tipul chiar iubea munca sa. I s-a încredințat responsabilitatea de a menține ordinea, astfel încât nimeni să nu folosească computerul pentru ceva nepotrivit.
Și până în ziua de azi, intuiția îmi spune că premiul administratorului depindea direct de numărul de studenți pe care îi prindea și îi expulza din sala de computere. Sunt aproape sigur că tipul ăsta și-a plătit anticipat ipoteca.
El se afla în colțul din spate al sălii de computere, la o masă unghiulară. Și se putea spune cu certitudine că monitoarele sale fertile au găsit o modalitate de a se reproduce cu un timp de gestație impresionant de scurt — atât de multe erau. Rămânea doar să ne întrebăm dacă reușea să le supravegheze pe toate. Desigur, glumesc... Am menționat că el lua munca foarte în serios?
Pe atunci, rețeaua de computere funcționa sub Windows 2000. Curând am descoperit că, de fiecare dată când mă conectam, se lansa un script care pornise serverul VNC din contul de admin pentru acces de la distanță la desktop. De fiecare dată când acel tip voia să te supravegheze, se conecta direct la mașina ta și observa. Era înfricoșător, iar dacă mă gândesc acum, probabil că era ilegal.
După ce m-am familiarizat cu BASIC și C64, acum scriam în C și chiar puțin în C++. Atunci, mă fascinase foarte mult și limbajul D, care rezolva unele deficiențe ale C++, așa cum mi se părea atunci.
De obicei, intram în sala de computere pentru a citi ceva nou despre D sau pentru a experimenta cu compilatorul Digital Mars D. Uneori, distrăgându-mă de gânduri despre viitorul măreț al lui D, scriam cod în C pentru a hack-ui alte aplicații Win32 prin descriptorii feronțelor lor.
În vremurile bune ale programării pe Win32, căutarea descriptorului de fereastră era cea mai simplă metodă de a hack-ui alte programe. Este evident că toate programele cu interfață grafică din Windows aveau o fereastră, chiar dacă nu era vizibilă pe ecran. Scriind un program pentru a extrage descriptorul unui alt proces (practic, un link către acesta), puteai să-i trimiti mesaje. Acest lucru permitea efectuarea unor operațiuni de bază, cum ar fi ascunderea/afişarea feronțelor programului, dar și lucruri cu adevărat interesante, cum ar fi forțarea procesului să încarce o DLL arbitrară în spațiul său de memorie și să înceapă executarea codului. După injectarea DLL, începea partea cea mai interesantă.
În primele o 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 sesiune anume a trezit probabil interesul lui. Scriam un cod în C pentru a ascunde feroneriile jocului Minesweeper (fără a le închide), ca să-mi fie mai ușor să joc în clasă, și atunci am observat că iconița albă VNC din tava sistemului a devenit neagră. Asta însemna că acum mă observa.
Am continuat să codific ca de obicei, încercând să nu-i acord atenție. Între timp, mașina a început să se încetinească considerabil, încercând să transmită frecvența maximă de cadre pe unul dintre numeroasele monitoare din colțul camerei. Windows aproape că a încetat să mai răspundă, iar când mi-a pierdut răbdarea, am ieșit din sistem și am terminat pentru astăzi.
În timpul vizitelor următoare în sala de calculatoare, Columbo a manifestat aproape de fiecare dată un interes viu pentru ce făceam. Aproximativ după a patra oară, am decis că trebuie să fac ceva în legătură cu asta.
Accept că o persoană rațională și înțeleaptă ar fi putut pur și simplu să abordeze această problemă direct cu el sau cu superiorul său. Totuși, am cedat mereu tentației și m-am convins rapid să aleg o strategie complet diferită.
— Nu vei putea face nimic fără acest server VNC! — mi-am spus cu calm și fermitate de mai multe ori.
Trebuia să elimin VNC.
Am început să intru în sala de calculatoare cu grupuri mari de studenți și să mă așez cât mai departe de colțul cu monitoarele. O vreme a funcționat și mi-a oferit puțin timp să verific ideile.
Prima mea încercare, cred că vei fi de acord, a fost destul de slabă. Dând clic dreapta pe iconița VNC din tava sistemului, am văzut un meniu cu literele magice E-X-I-T. Din păcate, literele erau scrise cu un font gri conturat. Administratorul dezactivase opțiunea „Ieșire” prin editorul de politici de grup. Am încercat să termin procesul din Task Manager, dar, desigur, acesta era invizibil pentru mine, deoarece rula sub un cont mai privilegiat. Nu am reușit nimic.
Serverul VNC rulează pe portul TCP 5900, mi-am amintit. Planul meu următor era să trimit pachete corupte pe acest port pentru a-l bloca.
Cel puțin câteva zile am analizat protocolul, trimițând spre portul 5900 diferite forme de dărâmare structurată corect, sperând că va ceda. În cele din urmă, nici asta nu a funcționat.
Începusem deja să cred că nu voi scăpa de această chestie, când dintr-o data mi-a venit în minte: trebuie să existe o fereastră! Trebuie să o afișez. Poate că va avea un buton verde „Oprire”, pe care aș putea să-l folosesc într-un mod interesant!
Am rulat codul meu aproape perfect în C pentru a căuta descriptorul ferestrei principale a unui alt proces - și într-adevăr am găsit VNC. M-am simțit învigorat când degetele mele au tastat WM_SHOWWINDOW. Îți poți imagina ce am văzut în fața mea?
Nimic!
Acum am început să fiu curios... avea fereastră, dar ignora mesajele mele. Am verificat de două ori codul meu pentru a mă asigura că funcționează. L-am testat pe alte procese și a funcționat perfect. Am încercat să trimit alte mesaje la fereastra VNC și tot nimic.
Și atunci mi-a venit din nou o idee!
Datorită unei cărți foarte groase de Charles Petzold, am studiat îndeaproape cum funcționează procesele Win32 în interiorul sistemului. Fiecare aplicație Win32 are o fereastră și o „coadă de mesaje”. Mesajele cauzate de interacțiunea utilizatorului, precum și mesajele trimise de Windows însuși, ajung în coadă, iar aplicația decide cum să le proceseze.
Nu prea interesant de sine stătător. Dar când am realizat că o coadă de mesaje neprocesate suficient de mare servește drept heuristica pentru intervenția în procesul blocat din partea Window Process Manager, m-am umplut de serotonină.
Fără să pierd nicio secundă, m-am întors la codul meu în C, pregătindu-mă să trimit o altă mesaje la fereastra principală VNC WM_SHOWWINDOW. Într-un ciclu. Etern. Așa că, multe mesaje WM_SHOWWINDOW, pe care acum știam că VNC va încerca să le ignore complet… pe riscul său.
Am compilat și am rulat 4 KB din cel mai liber cod pe care l-am scris vreodată. Aproximativ trei secunde mai târziu, Windows a raportat că procesul vncserver.exe nu răspunde, și mi-a făcut o propunere pe care pur și simplu nu o puteam refuza:
Doriți să încheiați acest proces?
Sărmana de DA!
Permiteți-mi să mărturisesc că restul zilei am fost insuportabil de mulțumit de mine.
După câteva ore petrecute meditând la noua mea superputere, am decis cum o voi folosi. Pur și simplu să închei sesiunea chiar în fața lui ar fi fost prea simplu. Aveam o idee mai bună — să dispar complet.
După Am realizat că pot scrie un cod care va face două lucruri. Mai întâi, va ocupa un port TCP 5900 recent eliberat, anterior utilizat de un proces ignorant al serverului VNC. Apoi, va crea o nouă conexiune TCP cu serverul VNC al mașinii specificate. Codul va face pur și simplu un proxy pentru toate datele între cele două socket-uri, iar Columbo va crede că se conectează la mine, în timp ce, de fapt, se va conecta la un server VNC complet diferit.
Codul meu va acționa ca un pod secret între mine și o altă sărăcie, la alegerea mea. A fost minunat.
Am început imediat să scriu podul meu fals VNC. Columbo s-a conectat la mine de mai multe ori, dar eu continuăm să programez sub ochii lui. Am ajuns la concluzia că nu avea nicio idee despre acțiunile mele, chiar dacă scriam lucruri evidente, cum ar fi numerele porturilor și comentarii precum // Прощай, жуткий шпион VNC.
După câteva zile, nu am reușit să fac codul să funcționeze corect. Ce e și mai rău, am lucrat practic continuu cu pictograma neagră VNC din bara de sistem. Atâta timp cât era conectat, nu puteam elibera portul pentru a-mi verifica codul.
Dacă aș fi știut atunci despre netcat!
În cele din urmă, nervii nu au mai rezistat, oricum eram un băiat impulsiv de 17 ani. Observând din nou cum pictograma albă a serverului VNC devine neagră, m-am enervat, am deschis codul inițial care umplea coada de mesaje și l-am rulat sub ochii lui. Am așteptat chiar câteva secunde înainte să apas End Process, doar pentru a mă asigura că el a văzut.
Dacă apăsarea acestui buton nu m-a convins complet că a meritat, atunci saltul lui din cauza rigidității monitoarelor pentru a se apropia repede de mine și a mă escorta din cameră, cu siguranță a meritat.
În cele din urmă, mi s-a interzis accesul la rețea timp de două săptămâni. O pedeapsă justă, mi-am zis. Aproximativ trei săptămâni mai târziu, serverul VNC a dispărut din scripturile de boot și nu a mai apărut nicăieri. Nu am aflat niciodată dacă incidentul meu a avut vreo relevanță în acest sens sau nu, dar mi-a distrus complet planul de îmbogățire rapidă prin vânzarea armei mele VNC studenților chinuiți din sălile de calculatoare ale colegiilor din întreaga țară.
Sursa: habr.com
