Kodeerija lahing: mina vs see VNC mees

В see blogi Päris mitu programmeerijajutte on avaldatud. Mulle meeldib oma vanu lollusi meenutada. Noh, siin on veel üks selline lugu.

Arvutite, eriti programmeerimise vastu hakkasin esimest korda huvi tundma umbes 11-aastaselt. Keskkooli alguses bоVeetsin suurema osa oma vabast ajast oma C64 kallal nokitsedes ja BASICut kirjutades, seejärel kääridega halba koodi välja lõikades. Ma ei tee nalja, käärid.

Pärast kooli (umbes 16-aastaselt) lähevad Briti lapsed tavaliselt kolledžisse, kus nad otsustavad enne ülikooli minekut õppida kolme-nelja ainet. Arvestades minu armastust koduse beeži kasti ja magnetofoni vastu, otsustasin, et arvutiteaduse õppimine kolledžis on õige valik.

Mulle meeldis kursus rohkem, kui ma ootasin; seal kohtasin esimest korda Pascalit ja Delphit.

Tundidevahelistel vahetundidel said õpilased töötada mis tahes vaba masinaga arvutiklassis. Kujutage ette: tohutu ruum, mis on mõeldud umbes sajale inimesele ja kus on masinatega täidetud lauaread, nagu need, kus kuvar seisab süsteemiüksusel. Fännid ümisevad pidevalt, hiirepallid sumisevad laudadel, ei peatu hetkekski. Õhus on imelikku lõhna, justkui vahetaks 50–100 hormonaalset teismelist perioodiliselt sadade Pentium III kiipide jahutamiseks.

Vaatamata terviseriskidele meeldis mulle vaba minuti leidmisel arvuti taga istuda.

Ruumis valves olnud adminn oli lühikest kasvu keskealine mees, kes valiti sellesse rolli tema rahuldamatu soovi tõttu saada kurjaks diktaatoriks. Ma arvan nii. Valve on alahinnatud; kutt armastas oma tööd väga. Ta sai ülesandeks hoida korda, et keegi kooli arvutit millekski sobimatuks ei kasutaks.

Siiani ütleb mu sisetunne, et administraatori preemia sõltus otseselt õpilaste arvust, kes ta käest kinni püüdis ja arvutiruumist välja saatis. Olen üsna kindel, et see mees maksis oma hüpoteegi varakult ära.

Ta istus arvutiruumi kaugemas nurgas nurgalaua taga. Ja võis julgelt eeldada, et tema viljakusmonitorid olid leidnud viisi, kuidas muljetavaldavalt lühikese tiinusperioodiga paljuneda, neid oli nii palju. Jääb vaid mõelda, kas tal on tõesti aega neid kõiki jälgida. Muidugi, ma naljatan... kas ma mainisin, et ta võttis oma tööd väga tõsiselt?

Sel ajal töötas arvutivõrgus Windows 2000. Peagi avastasin, et iga kord, kui süsteemi sisse logisin, käivitati skript, mis määras töölauale kaugjuurdepääsuks VNC serveri käivitamise administraatori kontolt. Kui see mees tahtis teie järele luurata, ühendas ta otse teie masinaga ja vaatas. See oli jube ja kui ma nüüd mõtlen, siis ilmselt ebaseaduslik.

Olles BASICu ja C64 peal hambad lõiganud, kirjutasin nüüd C-s ja isegi veidi C++-s. Tol ajal huvitas mind veel väga D-keel, mis parandas mõned C++ puudused, nagu ma seda siis nägin.

Käisin arvutituppa D-s midagi uut lugemas või Digital Mars D kompilaatoriga mängimas. Vahel, kui mind segas D suurest tulevikust mõtlemast, kirjutasin C-koodi, et teiste Win32 programmide akna kaudu häkkida. käepidemed.

Vanadel headel Win32 programmeerimise aegadel oli aknakäepideme leidmine lihtsaim viis teiste programmide häkkimiseks. Ilmselgelt oli kõigil Windowsi GUI programmidel aken, isegi kui seda ekraanile ei ilmunud. Kui kirjutate programmi teise protsessi käepideme (sisuliselt lingi sellele) toomiseks, saate sellele sõnumeid saata. See võimaldas mõningaid põhitoiminguid, nagu programmiakna peitmine/näitamine, aga ka tõeliselt lahedaid asju, nagu protsessi sundimine laadima oma mäluruumi suvalise DLL-i ja alustama koodi käivitamist. Pärast DLL-i süsti algas lõbus.

Esimese pooleteise kuuga see detektiiv mind eriti ei häirinud, minu masina VNC-serveriga ühendus see vaid korra või paar. Kuid üks konkreetne seanss võis temas huvi äratada. Kirjutasin C-koodi, et peita Minesweeperi aknad (neid sulgemata), et tunnis mängimise hõlbustamiseks oleks lihtsam, kui märkasin, et valge VNC ikoon süsteemisalves oli muutunud mustaks. See tähendas, et ta jälgis mind nüüd.

Jätkasin kodeerimist nagu tavaliselt, püüdes teda ignoreerida. Vahepeal hakkas masin aeglustuma, püüdes edastada maksimaalset kaadrisagedust ühele lugematutest monitoridest toanurgas. Windows lakkas peaaegu reageerimast, kui mu kannatus sai otsa, logisin välja ja lõpetasin päevaks.

Järgnevatel arvutiruumi külastustel tundis Colombo minu tegemiste vastu peaaegu iga kord suurt huvi. Pärast umbes neljandat korda otsustasin: ma pean sellega midagi ette võtma.

Möönan, et mõistlik, ratsionaalne inimene oleks võinud selle teema lihtsalt otse temale või ülemusele tõstatada. Siiski andsin alati kiusatusele järele ja rääkisin end kiiresti rääkima hoopis teistsuguse strateegia vastu.

- Ilma selle VNC serverita ei saa te midagi teha! — ütlesin endale mitu korda rahulikult ja otsustavalt.

VNC oli vaja tappa.

Hakkasin suurte õpilaste rühmadega arvutituppa minema ja istusin monitoridega nurgast võimalikult kaugel. See töötas mõnda aega ja andis mulle aega ideede testimiseks.

Minu esimene katse, arvan, et nõustute, oli üsna nõrk. Paremklõpsates süsteemisalves VNC ikoonil, nägin menüüd võlutähtedega EXIT. Kahjuks olid tähed kirjutatud halli kontuuriga tekstiga. Administraator on rühmapoliitika redaktori kaudu keelanud menüüelemendi "Välju". Üritasin protsessi tegumihaldurist kustutada, kuid loomulikult oli see mulle nähtamatu, kuna see töötas teise, privilegeeritud konto all. See ei õnnestunud.

VNC server töötab TCP pordil 5900, mäletasin. Minu järgmine plaan oli saata sellesse porti rikutud pakette, et see kokku kukkuda.

Veetsin vähemalt paar päeva protokolli kallal nokitsedes, saatsin porti 5900 erinevat tüüpi hästi struktureeritud jama ja lootsin, et see läheb katki. Lõpuks see ka ei õnnestunud.

Hakkasin juba mõtlema, et ega ma sellest asjast lahti ei saagi, kui järsku jõudis kohale: seal peab ju aken olema! Peame seda näitama. Võib-olla on sellel kena mahlane “Vaigista” nupp, mida saan suurepäraselt kasutada!

Käivitasin oma praeguseks peaaegu täiusliku C-koodi, et leida teise protsessi peaakna käepide – ja kindlasti leiti VNC. Tundsin inspiratsiooni, kui mu sõrmed kirjutasid WM_SHOWWINDOW. Proovige arvata, mida ma enda ees nägin?

Ei midagi!

Nüüd olin uudishimulik... sellel oli aken, aga see eiras mu sõnumeid. Kontrollisin oma koodi veel kord, et veenduda, et see töötab. Testisin seda mitmel muul protsessil ja see töötas suurepäraselt. Proovisin VNC aknasse muid sõnumeid saata ja ikka ei midagi.

Ja siis jõudis see mulle jälle kohale!

Tänu väga paksule raamat Charles Petzold Uurisin hoolikalt, kuidas Win32 protsessid süsteemi sees töötavad. Igal Win32 rakendusel on nii aken kui ka "sõnumijärjekord". Kasutaja interaktsiooni käivitatud sõnumid ja ka Windowsi enda saadetud sõnumid saabuvad järjekorda ja rakendus otsustab ise, kuidas neid töödelda.

Iseenesest pole eriti huvitav. Kui aga mõistsin, et piisavalt suur töötlemata sõnumijärjekord toimis Window Process Manageri jaoks heuristina, et sekkuda rippunud protsessi, hakkasin puhtast serotoniinist higistama.

Ilma sekunditki raiskamata pöördusin tagasi oma C-koodi juurde, valmistudes saatma VNC põhiaknasse uut sõnumit WM_SHOWWINDOW. Tsüklis. Igavene. Niisiis, palju sõnumeid. WM_SHOWWINDOW, mida nüüd teadsin, et VNC üritab täielikult ignoreerida... oma ohus.

Koostasin ja käivitasin 4KB oma elu kõige vabadust armastavamat koodi. Umbes kolme sekundi pärast teatas Windows sellest protsessist vncserver.ехе ei vasta ja tegi pakkumise, millest ma lihtsalt ei saanud keelduda:

Kas soovite selle protsessi lõpule viia?

PÕRGUS JAH!

Lubage mul tunnistada, et ülejäänud päeva olin endaga talumatult rahul.

Pärast mõnda tundi, mis veetsin oma uue supervõime seedimise, otsustasin, kuidas ma seda kasutan. Liiga lihtne oli lihtsalt seanss otse tema ees maha lüüa. Mul oli parem mõte – kaduda täielikult.

Pärast tuleristimine pistikupesade programmeerimisega Sain aru, et võin kirjutada koodi, mis teeb kahte asja. Esmalt hõivab see äsja vabastatud TCP-pordi 5900, mis oli varem hõivatud abitu VNC-serveri protsessiga. Seejärel loob see uue TCP-ühenduse määratud masina VNC-serveriga. Kood lihtsalt puhverserveerib kõik andmed kahe pesa vahel ja Columbo arvab, et ta loob ühenduse minuga, kuigi tegelikult loob ta ühenduse täiesti erineva VNC-serveriga.

Minu kood toimib salasillana minu ja mõne teise minu valitud vaese hinge vahel. See oli imeline.

Hakkasin kohe kirjutama oma võlts VNC silda. Columbo ühendas minuga mitu korda, kuid ma jätkasin tema ees programmeerimist. Jõudsin järeldusele, et tal polnud aimugi, mida ma teen, kuigi kirjutasin ilmselgeid asju, nagu pordi numbrid ja kommentaarid, nagu // Прощай, жуткий шпион VNC.

Paari päeva pärast ei saanud ma koodi õigesti tööle. Asja teeb hullemaks see, et töötasin peaaegu pidevalt süsteemisalves musta VNC ikooniga. Kui see oli ühendatud, ei saanud ma porti koodi testimiseks vabastada.

Kui ma oleksin siis teadnud netcat!

Lõpuks andsid närvid järele, olin ju kannatamatu 17-aastane poiss. Vaadates valge VNC-serveri ikooni uuesti mustaks muutumist, ehmusin, avasin sõnumijärjekorras oleva algkoodi ja jooksin selle tema silme ette. Ootasin isegi paar sekundit enne klõpsamist End Process, et veenduda, kas ta seda nägi.

Kui selle nupu vajutamine ei veennud mind täielikult, et see on seda väärt, siis tema, kes hüppas oma monitoride kindluse tagant, et mulle kiiresti läheneda ja mind ruumist välja viia, seda kindlasti tegi.

Selle tulemusena sain kahenädalase võrgustiku keelu. Õiglane karistus, mõtlesin. Umbes kolme nädala pärast kadus VNC-server alglaadimisskriptidest ega ilmunud kunagi mujale. Ma ei teadnud kunagi, kas minu juhtum mängis selles rolli või mitte, kuid see hävitas täielikult mu plaani saada vapustavalt rikkaks, müües oma VNC-püssi depressioonis üliõpilastele kolledži arvutisaalides üle kogu riigi.

Allikas: www.habr.com

Lisa kommentaar