Bitka programera: ja protiv onog tipa s VNC

V na ovom blogu objavljeno je mnogo računalnih priča. Volim se prisjetiti svojih starih gluposti. Pa, evo još jedne takve priče.

Prvi put sam se zainteresovao za računala, posebno programiranje, kada sam imao oko 11 godina. U početku srednje škole boveći dio svog slobodnog vremena provodio sam igrajući se sa svojim C64 i pisao na Basicu, a onda sam škarama rezal loš kod. Ne šalim se, škarama.

Nakon škole (u dobi od oko 16 godina), britanska djeca obično idu na fakultet, gdje biraju tri ili četiri predmeta za studij prije nego što krenu na sveučilište. S obzirom na svoju ljubav prema bežoj kutiji i kasetofonu kod kuće, odlučio sam da je studiranje 'informatike' na fakultetu pravi izbor.

Kurs mi se svidio više nego što sam očekivao; tamo sam prvi put upoznao Pascal i Delphi.

Između nastave studenti su mogli raditi na bilo kojem slobodnom računalu u računalnoj dvorani. Zamislite: ogromna soba, predviđena negdje za stotinu ljudi, s redovima stolova, natovarenih računalima — poput onih gdje je monitor na sistemskoj jedinici. Kontinuirano zujanje ventilatora, kuglice miša grguću po stolovima ne stajući ni sekunde. U zraku je čudan miris, kao da se 50-100 tinejdžera koji luče hormone povremeno miješa za hlađenje stotina Pentium III čipova.

Bez obzira na rizike za zdravlje, volio sam sjesti za računalom kada god bih imao slobodnu minutu.

U sobi je dežurao admin, niskog muškarca srednjih godina, kojeg su izabrali za ovu ulogu zbog njegovog neizmjernog entuzijazma da postane zli dictator. Mislim da je tako. Dežurati — slabo rečeno, tip je stvarno volio svoj posao. Pružili su mu zadatak da održava red, kako nitko ne bi koristio računalo za učenje za nešto neprikladno.

I do danas mi intuicija govori da je honorar admina bio izravno povezan s brojem studenata koje uhvati na djelu i izbaci iz računalne dvorane. Praktički sam siguran da je tip prije vremena otplatio svoj hipoteku.

Sedeo je u udaljenom kutu računarske sobe za uglastim stolom. I s sigurnošću se moglo pretpostaviti da su njegovi plodni monitori pronašli način da se razmnožavaju s impresivno kratkim razdobljem trudnoće — toliko ih je bilo mnogo. Ostajalo je samo nagađati prati li on stvarno sve njih. Naravno, šalim se… spomenuo sam da je ozbiljno shvaćao posao?

Tada je računarska mreža radila pod operativnim sistemom Windows 2000. Ubrzo sam otkrio da se pri svakom prijavljivanju pokreće skripta koja pokreće VNC server s administratorskim računom za daljinski pristup radnoj površini. Svaki put kada je taj tip želeo da vas nadgleda, povezivao se direktno na vašu mašinu i posmatrao. Bilo je to zastrašujuće, a sada kada razmislim, verovatno i ilegalno.

Nakon što sam se osposobio u Basicu i C64, sada sam pisao na C-u i čak malo na C++. Tada sam se veoma zaljubio u jezik D, koji je ispravljao neke nedostatke C++-a, kako mi se tada činilo.

Obično sam ulazio u računalnu sobu kako bih pročitao nešto novo o D-u ili se igrao s kompajlerom Digital Mars D. Ponekad, ometajući misli o velikoj budućnosti D-a, pisao sam kod na C-u za hakovanje drugih Win32 programa putem njihovih prozorskih deskriptora.

U dobra stara vremena programiranja na Win32, pronalaženje deskriptora prozora bila je najjednostavnija metoda za hakovanje drugih programa. Očigledno, sve programe s grafičkim korisničkim interfejsom u Windows-u imale su prozor, čak i ako nije bio prikazan na ekranu. Pisajući program za ekstrakciju deskriptora drugog procesa (štaviše, linka na njega), mogli ste mu slati poruke. To je omogućilo obavljanje nekih osnovnih operacija, poput skrivanja/prikazivanja prozora programa, kao i zaista kul stvari, poput prisiljavanja procesa da učita proizvoljnu DLL u svoj prostor memorije i započne izvršavanje koda. Nakon injekcije DLL-a počinjalo je najzanimljivije.

V prvih petnajstih dneh me ta detektiv ni posebej motil, povezal se je z VNC strežnikom na mojem računalniku le enkrat ali dvakrat. A ena posebna seja je verjetno prebudila njegovo zanimanje. Pisal sem nekakšno kodo v C-ju za skrivanje oken Minesweeper (brez zapiranja), da bi bilo lažje igrati v razredu, in takrat sem opazil, da je bela ikona VNC v sistemski vrstici postala črna. To je pomenilo, da me zdaj opazuje.

Nadaljeval sem s kodiranjem kot običajno, poskušal sem se čim manj ukvarjati z njim. Medtem je računalnik začel očitno zaostajati, ko je poskušal prenesti maksimalno število sličic na enega izmed mnogih monitorjev v kotu sobe. Windows je skoraj nehal odzivati se, ko je moje potrpljenje popustilo, iz sistema sem se odjavil in zaključil za danes.

Med naslednjimi obiski računalniške sobe je Columbo skoraj vsakokrat pokazal živo zanimanje za to, kar delam. Približno po četrtem obisku sem sklenil, da je treba s tem nekaj storiti.

Predvidevam, da bi razumen, racionalen človek preprosto postavil to vprašanje neposredno njemu ali njegovemu nadrejenemu. Vendar pa sem se vedno predal skušnjavi in hitro prepričal sebe, da izberem povsem drugačno strategijo.

— Nič ne boš mogel storiti brez tega VNC strežnika! — sem si mirno odločeno rekel nekajkrat.

Treba je bilo ubiti VNC.

Začel sem vstopati v računalniško sobo z velikimi skupinami študentov in sedeti čim dlje od kota z monitorji. Nekaj časa je to delovalo in mi dalo malo časa za preverjanje idej.

Moja prva poskusna, mislim, da se strinjate, je bila precej šibka. S klikom z desno tipko miške na ikono VNC v sistemski vrstici se je odprl meni z magičnimi črkami E-X-I-T. Na žalost so bile črke napisane sivo obrobnim besedilom. Administrator je onemogočil izbiro v meniju 'Izhod' prek urejevanja skupinskih politik. Poskusil sem ubiti proces prek upravitelja opravil, a seveda je bil za mene neviden, saj je deloval pod drugo, bolj privilegirano računovodsko. Nič ni uspelo.

VNC strežnik deluje na TCP vratih 5900, sem se spomnil. Moj naslednji načrt je bil, da na ta vrata pošljem poškodovane pakete, da bi ga ustavil.

В течение нескольких дней я исследовал протокол, отправляя на порт 5900 различные формы структурированного трафика в надежде на сбой. Наконец, это тоже не сработало.

Я уже начал думать, что не смогу избавиться от этой вещи, когда внезапно осенило: должно быть окно! Нужно его отобразить. Может, там окажется классная кнопка «Выключить», которую я смогу использовать!

Я запустил свой почти идеальный код на C для поиска дескриптора главного окна другого процесса — и действительно нашел VNC. Я чувствовал себя на седьмом небе, когда набрал WM_SHOWWINDOW. Попробуйте угадать, что я увидел?

Ничего!

Теперь мне стало любопытно... у него было окно, но оно не реагировало на мои сообщения. Я дважды проверил свой код, чтобы удостовериться, что он работает. Протестировал его на нескольких других процессах, и он работал отлично. Я пытался отправить другие сообщения в окно VNC, но тоже ничего.

И тут меня осенило!

С помощью очень толстой книги Чарльза Петцольда я углубился в изучение работы процессов Win32 в системе. У каждого приложения Win32 есть окно и «очередь сообщений». Сообщения, вызванные взаимодействием с пользователем, а также сообщения, отправленные самой Windows, попадают в очередь, а само приложение решает, как их обрабатывать.

Само по себе это не слишком захватывающе. Но когда я понял, что достаточно большая необработанная очередь сообщений может стать методом вмешательства в зависший процесс со стороны менеджера Window Process Manager, меня охватило чувство серотонина.

Не теряя ни секунды, я вернулся к своему коду на C, готовясь отправить в главное окно VNC еще одно сообщение WM_SHOWWINDOW. В цикле. Вечном. Так что множество сообщений WM_SHOWWINDOW, которые, как я теперь знал, VNC будет полностью игнорировать... на свой страх и риск.

Я скомпилировал и запустил 4 КБ самого свободолюбивого кода в своей жизни. Примерно через три секунды Windows сообщила, что процесс vncserver.ехе не отвечает и предложила мне что-то, от чего я просто не мог отказаться:

Вы хотите завершить этот процесс?

Черт возьми, ДА!

Позвольте признаться, что остаток дня я был невыносимо доволен собой.

Po nekaj urah, preživetih z obdelovanjem svoje nove supermoči, sem se odločil, kako jo bom izkoristil. Preprosto ubiti sejo pred njim bi bilo preprosto. Imel sem boljšo idejo – preprosto izginiti.

Po vajanja s programiranjem socketov Ugotovil sem, da lahko napišem kodo, ki bo naredila dve stvari. Najprej bo zasedla nedavno sproščen TCP port 5900, ki ga je prej zasedal nevedni proces VNC strežnika. Nato bo ustvarila novo TCP povezavo z VNC strežnikom določenega računalnika. Koda bo preprosto proxy-irala vse podatke med dvema socketoma, Colombo bo mislil, da se povezuje z mano, medtem ko se v resnici povezuje z povsem drugim VNC strežnikom.

Moja koda bo delovala kot skrivni most med mano in kakšno drugo revno dušo po moji izbiri. To je bilo čudovito.

Takoj sem se lotil pisanja svojega ponarejenega VNC mostu. Colombo se je večkrat povezoval z mano, jaz pa sem še naprej programiral pred njegovimi očmi. Prišel sem do zaključka, da nima pojma o mojih dejanjih, čeprav sem pisal očitne stvari, kot so številke portov in komentarji, kot so // Прощай, жуткий шпион VNC.

Čez nekaj dni mi nikakor ni uspelo spraviti kode v pravilno delovanje. Kar je še slabše, sem neprekinjeno delal s črnim VNC znakom v sistemski plati. Dokler je bil povezan, nisem mogel sprostiti porta, da bi preveril svojo kodo.

Ko bi takrat vedel o netcat!

Nazadnje so živci popustili, vseeno sem bil nestrpen 17-letnik. Spet sem opazoval, kako se bel znak VNC strežnika spremeni v črnega, in sem obupno odprl prvotno kodo, ki je napolnila čakalno vrsto, ter jo zagnal pred njegovimi očmi. Tudi počakal sem nekaj sekund, preden sem pritisnil Konec procesa, samo da se prepričam, da to vidi.

Če me pritisk na ta gumb še ni popolnoma prepričal, da je bilo vredno, je njegov skok iz utrdbe monitorjev, da bi mi hitro pristopil in me izgnal iz sobe, zagotovo bil vredno.

Na koncu so mi prepovedali dostop do omrežja za dva tedna. Pravična kazen, sem si mislil. Približno tri tedne pozneje je strežnik VNC izginil iz zagonskih skript in se več nikoli ni pojavil. Nikoli nisem izvedel, ali je imela moja situacija kakšen vpliv na to ali ne, a je povsem uničila moj načrt in sanje o bogatenju s prodajo svojega VNC orodja zatiranim študentom v računalniških učilnicah po vsej državi.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster