Kooderite lahing: mina vs see poiss VNC-ga

Uues selles blogis on avaldatud palju programmeerijate lugusid. Mulle meeldib meenutada oma vanu lollusi. Noh, siin on veel üks selline lugu.

Hakkasin arvutitest, eriti programmeerimisest huvituma umbes 11-aastaselt. Keskkooli alguses veetsinilotkaoma vaba aega enamasti C64 juures, kus kirjutasin Basicus, ja seejärel lõikasin halbade koodide tasse välja kääridega. Ma ei naljuta, kääridega..

Pärast kooli (umbes 16-aastaselt) lähevad Briti lapsed tavaliselt kolledžisse, kus valivad õppimiseks kolm-neli ainet enne ülikooli astumist. Arvestades, et armastasin kodus beezharjaga karpi ja diktofonit, otsustasin, et arvutiteaduse õppimine kolledžis on õige valik.

Kursus meeldis mulle rohkem, kui ootasin; seal kohtusin esmakordselt Pascaliga ja Delphiga.

Tundide vahel said õpilased töötada iga vabalt oleva masina juures arvutisaalis. Kujutage ette: suur tuba, mis mahutab kuskil sada inimest, laudadega, mille peal on masinad - nagu need, kus monitor on süsteemiplokil. Kogu aeg mühahh, hiiremurdud tatsuvad laudades, mitte hetkekski ei peatu. Õhus on imelik lõhn, otsekui 50-100 noorukit, kes eralduvad hormoonidest, vahetavad pidevalt vahel ja jahutavad sadu Pentium III kiipe.

Hoolimata terviseriskidest meeldis mulle arvuti taga istuda, kui mulle vaba minut anti.

Toas oli admin, kes oli keskealine madala kasvuga mees, keda valiti sellesse rolli sooviga muutuda pahaks diktaatoriks. Noh, see on pehmelt öeldud, poiss armastas oma tööd tõeliselt. Talle anti ülesanne hoida korda, et keegi ei kasutaks õpikute masinat millegi sobimatuna.

Ja siiani ütleb mu intuitsioon, et admini tasu sõltus otseselt üliõpilaste hulgast, keda ta käidi käest kinni ja eksitusest välja saatis. Olen praktiliselt kindel, et see poiss maksis oma hüpoteegi enne tähtaega tagasi.

Ta istus arvutisaali kauges nurgas nurgalauas. Ja võis kindlalt oletada, et tema viljakad monitorid on leidnud viisi, kuidas paljuneda muljetavaldavalt lühikese rasedusperioodiga — neid oli nii palju. Jäi vaid oletada, kas ta tõeliselt suudab neid kõiki jälgida. Loomulikult naljan, kas ma mainisin, et ta võttis oma töö väga tõsiselt?

Sel ajal töötas arvutivõrk Windows 2000 juhtimise all. Peagi avastasin, et iga süsteemi sisenemise ajal käivitub skript, mis käivitab VNC serveri administraatori kontolt, et võimaldada kaugjuurdepääsu töölauale. Iga kord, kui see tüüp soovis teid jälgida, täiesti discreetly ühendas ta otse teie arvutiga ja jälgis. See oli kohutav, ja kui nüüd mõelda, siis tõenäoliselt ka ebaseaduslik.

Hakkasin kirjutama C-s ja isegi natuke C++-s, pärast seda, kui olin oma hambad Baisikule ja C64-le teritanud. Sel ajal olin ma väga huvitatud D-keelest, mis parandas mõningaid C++ puudusi, nagu ma tol ajal arvasin.

Käisin tavaliselt arvutisaalis, et lugeda midagi uut D-st või eksperimenteerida Digital Mars D kompilaatoriga. Mõnikord, kui mõtted D suurest tulevikust kõrvale jäid, kirjutasin C-s koodi teiste Win32 programmide häkkimiseks nende akende deskriptorite kaudu.

Vanadel headel aegadel Win32 programmeerimisel oli akna deskriptorite leidmine kõige lihtsam meetod teiste programmide häkkimiseks. On ilmne, et kõigil Windowsi graafilise liidese programmides oli aken, isegi kui see ei olnud ekraanil nähtav. Kirjutades programmi, et ekstrakteerida teise protsessi deskriptorit (essentsiaalselt viidet sellele), sai saata sellele sõnumeid. See võimaldas teostada mõningaid põhitoiminguid, nagu programmi akna peitmine/kuvamine, aga ka tõeliselt ägedaid asju, näiteks sundida protsess laadima juhuslikku DLL-i oma mälu alasse ja alustama koodi täitmist. DLL-i süstimise järel algas tõeliselt huvitav osa.

Esimene poolteist kuud ei seganud see detektiiv mind eriti, ta ühines minu masina VNC-serveriga ainult ühe või kahe korra. Kuid üks konkreetne seanss tõenäoliselt äratas temas huvi. Kirjutasin mingit koodi C keeles, et peita Minesweeperi aknaid (need suletud ei olnud), et oleks klassis kergem mängida, ja siis märkasin, et VNC valge ikoon süsteemisalves muutus mustaks. See tähendas, et ta jälgis mind nüüd.

Jätkasin koodi kirjutamist nagu alati, püüdes teda ignoreerida. Sel ajal hakkas masin tõeliselt pidurdama, üritades edastada maksimaalset väljundifrekventsi ühe tuhandest monitorist, mis toas nurgas seisis. Windows peaaegu ei reageerinud, ja kui mu kannatus lõpuks katkesi, logisin välja ja lõpetasin selleks päevaks.

Järgmiste külastuste ajal arvutisaalis näitas Kolombo peaaegu iga kord elavat huvi selle vastu, mida ma tegin. Umbes neljanda korra järel otsustasin, et midagi on vaja ette võtta.

Võin tunnistada, et mõistlik ja ratsionaalne inimene oleks võinud selle probleemi otse tema või tema ülemusega üles tuua. Siiski jäin ma alati kiusatusele alla ja veensin end kiiresti, et valin täiesti teise strateegia.

— Sa ei saa midagi teha ilma selle VNC-serverita! — ütlesin ma endale rahulikult ja kindlalt mitu korda.

VNC tuli hävitada.

Hakkasin arvutisaali sisenema suurte tudengigruppide abil ja istusin nii kaugele nurga juurest monitoridest nagu võimalik. Mõni aeg see töötas ja andis mulle natuke aega ideede kontrollimiseks.

Minu esimene katse, ma arvan, et nõustute, oli üsna nõrk. Klõpsates hiire parema nupuga VNC ikoonil süsteemisalves, nägin menüüd, kus olid maagilised tähed E-X-I-T. Kahjuks olid tähed kirjutatud hallis kontuurtekstis. Administraator oli eemaldanud menüüpunkti 'Välja' rühmapoliitika redaktoriga. Proovisin protsessi Task Managerist lõpetada, kuid loomulikult oli see minu jaoks nähtamatu, kuna töötas teise, privileeerituma konto all. Midagi ei õnnestunud.

Mäletasin, et VNC-server töötab TCP 5900 sadamal. Minu järgmine plaan oli saata sellele sadamale rikutud pakette, et see kokku jooksma panna.

Mõned päevad olen protokolli läbi töötanud, saates porti 5900 erinevaid õigesti struktureeritud sõnumeid ja lootnud, et see puruneb. Lõpuks ei töötanud see ka.

Hakkasin juba mõtlema, et ei saa sellest asjast lahti, kui äkki tuli mulle mõte: seal peab olema aken! Pean selle avama. Võib-olla seal on kena nupp "Käivita", millele leian suurepärase kasutuse!

Käivitasingi oma peaaegu täiusliku C-koodi, et leida teise protsessi peamise akna descriptor - ja tõepoolest leidsin VNC. Tundsin end uhkelt, kui sõrmed trükkisid WM_SHOWWINDOW. Proovige arvata, mida ma enda ees nägin?

Midagi!

Nüüd hakkas mind huvitama... seal oli aken, aga see ignoreeris mu sõnumeid. Kontrollisin oma koodi kaks korda, et veenduda selle toimimises. Testisin seda mitmete teiste protsesside peal ja see töötas suurepäraselt. Proovisin saata VNC aknasse teisi sõnumeid, kuid ikka ei midagi.

Ja siis tuli mul jälle mõte!

Tänu väga paksule raamatust Charles Petzoldile olen õppinud, kuidas Win32 protsessid süsteemis töötavad. Igal Win32 rakendusel on aken ja "sõnumijärjekord". Kasutaja interaktsiooniga seotud sõnumid, samuti Windowsi enda saadetud sõnumid, jõuavad järjekorda, ja ise rakendus otsustab, kuidas neid töödelda.

See iseenesest ei ole liiga huvitav. Kuid kui sain aru, et piisavalt suur töötlemata sõnumijärg annab heuristika interferentsiks külmunud protsessile Aken Protsessihalduri poolt, hakkasin puhtast serotoniinist higistama.

Kaotamata sekunditki, läksin tagasi oma C-koodi juurde, valmistudes saatma VNC peamise aknasse veel ühe sõnumi WM_SHOWWINDOW. Tsüklis. Igavesti. Niisiis, hulk sõnumeid WM_SHOWWINDOW, mida ma nüüd teadsin, VNC püüab täielikult ignoreerida... omaette riskides.

Kompileerisin ja käivitasin oma elu kõige vabaima 4 KB koodi. Umbes kolme sekundi pärast teatas Windows, et protsess vncserver.exe ei vasta ja tegi ettepaneku, millest ma lihtsalt ei saanud keelduda:

Kas soovite selle protsessi lõpetada?

Kuradi jah!

Olgu, tunnistan, et selle päeva ülejäänud osa olin äärmiselt rahul iseendaga.

Pärast mitmeid tunde, mille ma kulutasin oma uue supervõime seedimisele, otsustasin, kuidas seda kasutada. Lihtsalt seansi lõpetamine otse tema silme all oleks olnud liiga lihtne. Mul oli parem idee - täielikult kaduda.

Pärast programmeerimise soketite lahingu ristimine Sain aru, et saan kirjutada koodi, mis teeb kahte asja. Esiteks hõivab see hiljuti vabaks saadetud TCP-porti 5900, mille lõhkus rumal VNC-serveri protsess. Seejärel loob see uue TCP-ühenduse määratud masina VNC-serveriga. Kood hakkab lihtsalt edastama kõiki andmeid kahe soketi vahel, ja Colombo arvab, et ta ühendub minuga, samal ajal kui ta ühendub hoopis teise VNC-serveriga.

Minu kood toimib kui salajane sild minu ja mõne teise õnnetu hinge vahel, kelle ma valin. See oli suurepärane.

Hakkasin kohe kirjutama oma vale VNC-silda. Colombo ühendus minuga toimus mitu korda, kuid ma jätkasin programmeerimist tema silme all. Ma jõudsin järeldusele, et tal pole minu tegemistest aimugi, kuigi ma kirjutasin ilmselgeid asju, nagu portide numbrid ja sellised kommentaarid nagu // Прощай, жуткий шпион VNC.

Mõne päeva pärast ei suutnud ma koodi õigesti tööle panna. Mis veel hullem, töötasin pidevalt musta VNC-märgina süsteemisalves. Kui see oli ühendatud, ei saanud ma porti vabastada, et oma koodi testida.

Kui oleksin siis teadnud netcat!

Lõpuks ei pidanud närvid vastu, ma olin ikkagi kannatamatu 17-aastane tüüp. Jälgides, kuidas valge VNC-serveri ikoon muutub mustaks, läksin närvi, avasin algse koodi, mis täitis sõnumijärjekorra, ja käivitasin selle tema silme all. Ootasin isegi paar sekundit, enne kui vajutasin Lõpeta protsess, lihtsalt veendumiseks, et ta seda näeb.

Kui selle nupu vajutamine veel ei veennud mind täielikult, et see oli seda väärt, siis tema hüpe oma monitorite turvapiirilt minuni, et kiiresti läheneda ja mind toast välja saata, oli kindlasti seda väärt.

Lõpuks keelati mul võrku pääseda kaheks nädalaks. Tundus õiglane karistus, mõtlesin ma. Umbes kolme nädala pärast kadus VNC-server laadimisskriptidest ja ei ilmunud enam kusagile. Ma ei saanud kunagi teada, kas minu ülesanne mängis selles mingit rolli või mitte, kuid see purustas mu plaani rikkaks saada, müües oma VNC relva üliõpilastele, kes kõndisid ülikoolide arvutiklassides üle kogu riigi.

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster