Koduotojų mūšis: Aš prieš tą VNC vaikiną

В šį dienoraštį Paskelbta nemažai programuotojų pasakų. Man patinka prisiminti savo senus kvailus dalykus. Na, štai dar viena tokia istorija.

Pirmą kartą kompiuteriais, ypač programavimu, susidomėjau būdamas maždaug 11 metų. Vidurinės mokyklos pradžioje bоDidžiąją dalį laisvo laiko praleidau dirbdamas su savo C64 ir rašydamas BASIC, tada žirklėmis iškirpdavau blogą kodą. Aš nejuokauju, žirklės.

Po mokyklos (apie 16 metų) britų vaikai dažniausiai eina į koledžą, kur prieš stodami į universitetą pasirenka studijuoti tris ar keturis dalykus. Atsižvelgdamas į mano meilę smėlio spalvos dėžutei ir magnetofonui namuose, nusprendžiau, kad studijuoti „kompiuterijos mokslą“ kolegijoje yra teisingas pasirinkimas.

Kursas man patiko labiau nei tikėjausi; ten pirmą kartą sutikau Paskalį ir Delphi.

Per pertraukas tarp pamokų mokiniai galėjo dirbti bet kokiu laisvu kompiuteriu kompiuterių kabinete. Įsivaizduokite: didžiulis kambarys, skirtas maždaug šimtui žmonių, su stalų eilėmis, užpildytomis mašinomis, kaip tose, kuriose monitorius stovi ant sistemos bloko. Ventiliatoriai nuolat dūzgia, ant stalų zuja pelių kamuoliukai, nesustodami nė sekundei. Ore tvyro keistas kvapas, tarsi 50-100 hormoninių paauglių periodiškai keičiasi į šimtus Pentium III lustų.

Nepaisant pavojaus sveikatai, mėgau sėdėti prie kompiuterio, kai turėjau laisvą minutę.

Kambaryje budėjęs administratorius buvo žemo ūgio, vidutinio amžiaus vyriškis, kuris šiam vaidmeniui buvo pasirinktas dėl nepasotinamo noro tapti piktuoju diktatoriumi. Aš manau, kad taip. Budėjimas yra per menkas; vaikinas labai mėgo savo darbą. Jam buvo pavesta palaikyti tvarką, kad niekas nenaudotų mokyklos kompiuterio kam nors netinkamai.

Iki šiol mano intuicija byloja, kad administratoriaus premija tiesiogiai priklausė nuo mokinių skaičiaus, kurį jis pagavo už rankos ir išlydėjo iš kompiuterių kabineto. Esu tikras, kad šis vaikinas anksti sumokėjo savo hipoteką.

Jis sėdėjo atokiame kompiuterių kambario kampe prie kampinio stalo. Ir buvo galima daryti prielaidą, kad jo vaisingumo monitoriai rado būdą, kaip daugintis per įspūdingai trumpą nėštumo laikotarpį, jų buvo labai daug. Galima tik stebėtis, ar jis tikrai turėjo laiko juos visus sekti. Aišku, juokauju... ar jau minėjau, kad jis į savo darbą žiūrėjo labai rimtai?

Tuo metu kompiuterių tinkle veikė Windows 2000. Netrukus sužinojau, kad kiekvieną kartą prisijungus prie sistemos buvo paleistas scenarijus, nurodantis paleisti VNC serverį iš administratoriaus paskyros, kad būtų galima nuotoliniu būdu pasiekti darbalaukį. Kai šis vaikinas norėdavo tave šnipinėti, jis prisijungdavo tiesiai prie tavo mašinos ir žiūrėdavo. Tai buvo baisu, o dabar, kai pagalvoju, tikriausiai neteisėta.

Iškirpęs dantis ant BASIC ir C64, dabar rašiau C ir net šiek tiek C++. Tuo metu dar labai domėjausi D kalba, kuri ištaisė kai kuriuos C++ trūkumus, kaip tada mačiau.

Aš eidavau į kompiuterių kambarį, kad perskaitytų ką nors naujo D arba pažaisčiau su „Digital Mars D“ kompiliatoriumi. Kartais, kai buvau atitrauktas nuo mąstymo apie puikią D ateitį, parašiau C kodą, kad nulaužčiau kitas Win32 programas per jų langą. rankenos.

Senais gerais Win32 programavimo laikais lango rankenos radimas buvo lengviausias būdas nulaužti kitas programas. Akivaizdu, kad visos „Windows“ GUI programos turėjo langą, net jei jis nepasirodė ekrane. Rašydami programą, skirtą gauti kito proceso rankenėlę (iš esmės nuorodą į jį), galite siųsti jam pranešimus. Tai leido atlikti kai kurias pagrindines operacijas, pvz., paslėpti / rodyti programos langą, taip pat labai šaunius dalykus, pavyzdžiui, priversti procesą įkelti savavališką DLL į savo atminties vietą ir pradėti vykdyti kodą. Po DLL injekcijos prasidėjo linksmybės.

Per pirmąjį pusantro mėnesio šis detektyvas man nelabai trukdė, tik vieną ar du kartus jis prisijungė prie VNC serverio mano kompiuteryje. Tačiau vienas konkretus seansas galėjo sukelti jo susidomėjimą. Rašiau kažkokį C kodą, kad paslėptum Minesweeper langus (jų neuždarydamas), kad būtų lengviau žaisti klasėje, kai pastebėjau, kad sistemos dėkle balta VNC piktograma pasidarė juoda. Tai reiškė, kad jis dabar mane stebi.

Aš tęsiau kodavimą kaip įprasta, bandydamas nekreipti į jį dėmesio. Tuo tarpu aparatas pradėjo lėtėti, bandydamas perduoti didžiausią kadrų dažnį vienam iš nesuskaičiuojamų monitorių kambario kampe. Windows beveik nustojo reaguoti, kai baigėsi mano kantrybė, atsijungiau ir baigiau dieną.

Vėlesnių apsilankymų kompiuterių salėje metu Colombo beveik kiekvieną kartą labai domėjosi tuo, ką darau. Maždaug po ketvirto karto nusprendžiau: turiu ką nors padaryti.

Pripažįstu, kad protingas, racionalus žmogus galėjo tiesiog iškelti šią problemą tiesiogiai jam ar savo viršininkui. Tačiau visada pasidaviau pagundai ir greitai prisikalbinau priimti visiškai kitokią strategiją.

- Be šio VNC serverio nieko nepadarysi! — kelis kartus ramiai ir ryžtingai pasakiau sau.

Reikėjo nužudyti VNC.

Pradėjau eiti į kompiuterių kabinetą su didelėmis studentų grupėmis ir sėdėti kuo toliau nuo kampo su monitoriais. Tai kurį laiką veikė ir suteikė man laiko išbandyti idėjas.

Mano pirmasis bandymas, manau, sutiksite, buvo gana silpnas. Dešiniuoju pelės mygtuku spustelėjus VNC piktogramą sistemos dėkle, pamačiau meniu su stebuklingomis raidėmis EXIT. Deja, laiškai buvo parašyti pilko kontūro tekstu. Administratorius išjungė meniu elementą „Išeiti“ per grupės strategijos rengyklę. Bandžiau užmušti procesą iš užduočių tvarkyklės, bet, žinoma, jis man buvo nematomas, nes jis vyko naudojant kitą, labiau privilegijuotą paskyrą. Nepavyko.

Prisiminiau, kad VNC serveris veikia TCP 5900 prievadu. Kitas mano planas buvo siųsti sugadintus paketus į šį prievadą, kad jis sugadintų.

Bent kelias dienas praleidau tvarkydamas protokolą, siųsdamas įvairių formų geros struktūros šūdą į 5900 prievadą ir tikėdamasis, kad jis suges. Galiausiai tai irgi nepasiteisino.

Jau pradėjau galvoti, kad neatsikratysiu šito daikto, kai staiga supratau: ten turi būti langas! Turime jį parodyti. Galbūt jame bus gražus sultingas mygtukas „Nutildyti“, kurį galėsiu puikiai panaudoti!

Paleidau savo dabar beveik tobulą C kodą, kad surasčiau pagrindinio kito proceso lango rankenėlę – ir tikrai, VNC buvo rastas. Pajutau įkvėpimą, kai spausdinau pirštais WM_SHOWWINDOW. Pabandyk atspėti, ką mačiau priešais save?

Nieko!

Dabar man buvo įdomu... jame buvo langas, bet jis ignoravo mano pranešimus. Dar kartą patikrinau savo kodą, kad įsitikinčiau, ar jis veikia. Išbandė jį keliuose kituose procesuose ir veikė puikiai. Bandžiau siųsti kitus pranešimus į VNC langą, bet nieko.

Ir tada tai vėl man pasirodė!

Ačiū labai stora knyga Charlesas Petzoldas Atidžiai ištyriau, kaip sistemoje veikia Win32 procesai. Kiekviena Win32 programa turi langą ir „pranešimų eilę“. Žinutės, suaktyvintos dėl vartotojo sąveikos, taip pat pačios Windows siunčiamos žinutės patenka į eilę, o pati programa nusprendžia, kaip juos apdoroti.

Savaime nelabai įdomu. Tačiau kai supratau, kad pakankamai didelė neapdorotų pranešimų eilė veikė kaip „Window Process Manager“ euristika, leidžianti įsikišti į nutrūkusį procesą, ėmiau prakaituoti gryną serotoniną.

Negaišdamas nė sekundės grįžau prie savo C kodo, ruošdamasis išsiųsti kitą žinutę į pagrindinį VNC langą WM_SHOWWINDOW. Cikle. Amžinas. Taigi, daug žinučių. WM_SHOWWINDOW, kurį dabar žinojau, kad VNC bandys visiškai ignoruoti... savo pavojuje.

Sukūriau ir paleidau 4 KB labiausiai laisvę mėgstantį kodą savo gyvenime. Po maždaug trijų sekundžių „Windows“ pranešė, kad šis procesas vncserver.ехе neatsako ir pateikė pasiūlymą, kurio aš tiesiog negalėjau atsisakyti:

Ar norite užbaigti šį procesą?

TAIP!

Leiskite prisipažinti, kad likusią dienos dalį buvau nepakeliamai patenkinta savimi.

Po kelių valandų, praleistų virškindamas savo naują supergalią, nusprendžiau, kaip ją panaudosiu. Buvo per lengva tiesiog nužudyti sesiją priešais jį. Turėjau geresnę mintį – visiškai išnykti.

Po ugnies krikštas su lizdų programavimu Supratau, kad galiu parašyti kodą, kuris padarytų du dalykus. Pirmiausia jis užims naujai atlaisvintą TCP 5900 prievadą, kurį anksčiau užėmė beprasmis VNC serverio procesas. Tada jis sukurs naują TCP ryšį su nurodytos mašinos VNC serveriu. Kodas tiesiog perduos visus duomenis tarp dviejų lizdų, ir Columbo manys, kad jungiasi prie manęs, nors iš tikrųjų jungsis prie visiškai kito VNC serverio.

Mano kodas veiks kaip slaptas tiltas tarp manęs ir kitos mano pasirinktos vargšos sielos. Tai buvo nuostabu.

Iš karto pradėjau rašyti savo netikrą VNC tiltą. Columbo kelis kartus prisijungė prie manęs, bet aš toliau programavau prieš jį. Aš padariau išvadą, kad jis neįsivaizdavo, ką aš darau, nors rašiau akivaizdžius dalykus, pvz., prievadų numerius ir komentarus, pvz. // Прощай, жуткий шпион VNC.

Po poros dienų nepavyko tinkamai veikti kodui. Dar blogiau, beveik nuolat dirbau su juoda VNC piktograma sistemos dėkle. Kol jis buvo prijungtas, negalėjau atlaisvinti prievado, kad galėčiau išbandyti savo kodą.

Jei tada būčiau žinojęs netcat!

Galų gale mano nervai pasidavė, juk buvau nekantrus 17-metis vaikinas. Stebėdamas, kaip balta VNC serverio piktograma vėl pasidarė juoda, išsigandau, atidariau originalų kodą, kuris užpildė pranešimų eilę, ir paleidau jį jam prieš akis. Net palaukiau kelias sekundes, kol spustelėjau End Process, kad įsitikintų, jog jis tai matė.

Jei to mygtuko paspaudimas manęs iki galo neįtikino, kad verta, tai jis, iššokęs iš savo monitorių tvirtovės, greitai prisiartino prie manęs ir išvedė mane iš kambario, tikrai padarė.

Dėl to dvi savaites buvau uždrausta prisijungti prie tinklo. Teisinga bausmė, pagalvojau. Po maždaug trijų savaičių VNC serveris dingo iš įkrovos scenarijų ir niekur kitur nepasirodė. Niekada nežinojau, ar mano įvykis turėjo kokį nors vaidmenį, ar ne, bet jis visiškai sužlugdė mano planą pasakiškai praturtėti pardavus savo VNC ginklą depresija sergantiems studentams koledžų kompiuterių salėse visoje šalyje.

Šaltinis: www.habr.com

Добавить комментарий