Bitka kodera: Ja protiv tog VNC tipa

В ovaj blog Objavljeno je dosta programerskih priča. Volim se prisjećati svojih starih gluposti. Pa evo još jedne takve priče.

Prvi put sam se počeo zanimati za računala, posebno za programiranje, kada sam imao oko 11 godina. Na početku srednje škole bоVećinu svog slobodnog vremena proveo sam petljajući po svom C64 i pišući BASIC, a zatim škarama izrezujući loš kod. Ne šalim se, škare.

Nakon škole (oko 16. godine), britanska djeca obično idu na koledž, gdje biraju učiti tri ili četiri predmeta prije odlaska na sveučilište. S obzirom na moju ljubav prema bež kutiji i magnetofonu kod kuće, odlučio sam da je studij "informatike" na fakultetu pravi izbor.

Uživao sam u tečaju više nego što sam očekivao; tamo sam se prvi put susreo s Pascalom i Delphijem.

Za vrijeme odmora između nastave učenici su mogli raditi na bilo kojem slobodnom stroju u informatičkoj učionici. Zamislite: ogromna prostorija, dizajnirana za stotinjak ljudi, s redovima stolova ispunjenih strojevima, poput onih u kojima monitor stoji na jedinici sustava. Navijači neprestano pjevuše, loptice miša zuje po stolovima, ne prestaju ni sekunde. U zraku se osjeća čudan miris, kao da se 50-100 hormonalnih tinejdžera povremeno mijenja kako bi ohladilo stotine Pentium III čipova.

Unatoč zdravstvenim rizicima, volio sam sjediti za računalom kad sam imao slobodnu minutu.

Dežurni admin u sobi bio je niski sredovječni muškarac koji je za ovu ulogu izabran zbog svoje neutažive želje da postane zli diktator. Pretpostavljam da. Dužnost je malo reći; tip je stvarno volio svoj posao. Imao je zadatak održavati red kako nitko ne bi koristio školsko računalo za bilo što neprimjereno.

Do danas mi moja intuicija govori da je bonus administratora izravno ovisio o broju učenika koje je uhvatio za ruku i ispratio iz informatičke učionice. Prilično sam siguran da je ovaj tip ranije otplatio svoju hipoteku.

Sjedio je u udaljenom kutu računalne sobe za kutnim stolom. I bilo je sigurno pretpostaviti da su njegovi monitori plodnosti pronašli način za reprodukciju s impresivno kratkim razdobljem trudnoće, bilo ih je toliko mnogo. Moglo se samo pitati je li doista imao vremena pratiti ih sve. Naravno, šalim se... jesam li spomenuo da je svoj posao shvaćao vrlo ozbiljno?

U to je vrijeme računalna mreža pokretala Windows 2000. Ubrzo sam otkrio da se svaki put kad bih se prijavio u sustav pokrenula skripta koja je određivala pokretanje VNC poslužitelja s administratorskog računa za daljinski pristup radnoj površini. Kad god bi te taj tip želio špijunirati, spojio bi se izravno na tvoj stroj i gledao. Bilo je jezivo, a sad kad bolje razmislim, vjerojatno i protuzakonito.

Nakon što sam se okušao u BASIC-u i C64, sada sam pisao u C-u, pa čak i malo C++-u. U to sam vrijeme još uvijek bio jako zainteresiran za jezik D, koji je ispravio neke nedostatke C++-a, kako sam ga tada vidio.

Znao sam otići u računalnu sobu pročitati nešto novo na D-u ili se igrati s kompajlerom Digital Mars D. Ponekad, dok sam bio ometen razmišljanjem o sjajnoj budućnosti D-a, napisao sam C kod da hakiram druge Win32 programe kroz njihov prozor ručke.

U dobrim starim danima programiranja Win32, pronalaženje ručice prozora bila je najlakša metoda za hakiranje drugih programa. Očito su svi GUI programi na Windowsima imali prozor, čak i ako se nije pojavljivao na ekranu. Napisivanjem programa za dohvaćanje oznake drugog procesa (u suštini veze na njega), možete mu slati poruke. To je omogućilo neke osnovne operacije poput skrivanja/prikazivanja prozora programa, kao i stvarno zgodne stvari poput prisiljavanja procesa da učita proizvoljan DLL u svoj memorijski prostor i počne izvršavati kod. Nakon DLL injekcije, počela je zabava.

U prvih mjesec i pol dana ovaj mi detektiv nije puno smetao, povezao se na VNC server na mom računalu samo jednom ili dva puta. Ali jedna određena seansa možda je pobudila njegovo zanimanje. Pisao sam neki C kod da sakrijem prozore Minesweepera (bez zatvaranja) kako bih olakšao igranje u razredu, kad sam primijetio da je bijela VNC ikona u programskoj traci pocrnila. To je značilo da me sada promatra.

Nastavio sam kodirati kao i obično, pokušavajući ga ignorirati. U međuvremenu je stroj počeo usporavati, pokušavajući prenijeti maksimalnu brzinu kadrova na jedan od bezbrojnih monitora u kutu sobe. Windows je skoro prestao reagirati, kad mi je ponestalo strpljenja, odjavio sam se i završio za taj dan.

Prilikom sljedećih posjeta kompjuterskoj učionici, Colombo se gotovo svaki put živo zanimao za ono što radim. Otprilike nakon četvrtog puta, odlučio sam: moram nešto poduzeti po tom pitanju.

Priznajem da je razumna, racionalna osoba mogla jednostavno postaviti ovo pitanje izravno njemu ili njegovom šefu. Međutim, uvijek sam popuštao iskušenju i brzo sam se nagovorio da usvojim potpuno drugačiju strategiju.

- Ne možete ništa bez ovog VNC servera! — rekao sam nekoliko puta smireno i odlučno.

Bilo je potrebno ubiti VNC.

Počeo sam ulaziti u informatičku učionicu s velikim grupama studenata i sjediti što dalje od kuta s monitorima. Ovo je neko vrijeme funkcioniralo i dalo mi je vremena da testiram ideje.

Mislim da ćete se složiti da je moj prvi pokušaj bio prilično slab. Desnim klikom na ikonu VNC u programskoj traci, vidio sam izbornik sa čarobnim slovima EXIT. Nažalost, pisma su bila napisana u sivom konturnom tekstu. Administrator je onemogućio stavku izbornika "Izlaz" kroz uređivač pravila grupe. Pokušao sam ubiti proces iz Upravitelja zadataka, ali mi je naravno bio nevidljiv jer se izvodio pod drugim, privilegiranim računom. Nije išlo.

VNC poslužitelj radi na TCP portu 5900, sjetio sam se. Moj sljedeći plan bio je poslati oštećene pakete na ovaj port kako bih ga srušio.

Proveo sam barem nekoliko dana petljajući s protokolom, šaljući razne oblike dobro strukturiranog sranja na port 5900 i nadajući se da će se pokvariti. Na kraju ni to nije upalilo.

Već sam počeo misliti da se neću moći riješiti ove stvari, kad mi je odjednom sinulo: tamo mora biti prozor! Moramo to prikazati. Možda će imati lijepu sočnu tipku "Isključi zvuk" koju ću moći odlično iskoristiti!

Pokrenuo sam svoj sada gotovo savršeni C kod kako bih pronašao ručku za glavni prozor drugog procesa - i sigurno je VNC pronađen. Osjećao sam se nadahnuto kad su moji prsti tipkali WM_SHOWWINDOW. Pokušajte pogoditi što sam vidio ispred sebe?

Ništa!

Sada sam bio znatiželjan... imao je prozor, ali je ignorirao moje poruke. Dvaput sam provjerio svoj kod kako bih se uvjerio da radi. Testirao sam ga na nekoliko drugih procesa i radio je odlično. Pokušao sam poslati druge poruke u VNC prozor, i dalje ništa.

A onda mi je opet sinulo!

Zahvaljujući vrlo gustom knjiga Charles Petzold Pažljivo sam proučavao kako Win32 procesi rade unutar sustava. Svaka Win32 aplikacija ima prozor kao i "red poruka". Poruke izazvane interakcijom korisnika, kao i poruke koje šalje sam Windows, dolaze u red čekanja, a aplikacija sama odlučuje kako će ih obraditi.

Nije baš zanimljivo samo po sebi. Ali kad sam shvatio da je dovoljno veliki neobrađeni red čekanja poruka djelovao kao heuristika za Window Process Manager da intervenira u zaustavljenom procesu, počeo sam se znojiti čistim serotoninom.

Ne gubeći ni sekunde, vratio sam se svom C kodu, pripremajući se poslati još jednu poruku u glavni prozor VNC-a WM_SHOWWINDOW. U ciklusu. Vječna. Dakle, puno poruka. WM_SHOWWINDOW, za koje sam sada znao da će VNC pokušati potpuno ignorirati... na vlastitu opasnost.

Sastavio sam i pokrenuo 4KB koda koji voli najviše slobode u mom životu. Nakon otprilike tri sekunde, Windows je izvijestio da je proces vncserver.ехе ne odgovara, i dao ponudu koju jednostavno nisam mogao odbiti:

Želite li dovršiti ovaj proces?

NARAVNO DA DA!

Dopusti mi da priznam da sam ostatak dana bio nepodnošljivo zadovoljan sobom.

Nakon nekoliko sati provedenih u probavi moje nove supermoći, odlučio sam kako ću je upotrijebiti. Bilo je prelako jednostavno ubiti sesiju pred njim. Imao sam bolju ideju - potpuno nestati.

Nakon vatreno krštenje s programiranjem utičnica Shvatio sam da mogu napisati kod koji bi radio dvije stvari. Prvo će zauzeti novooslobođeni TCP port 5900, koji je prethodno bio zauzet procesom VNC servera koji nema pojma. Zatim će stvoriti novu TCP vezu s VNC poslužiteljem navedenog stroja. Kod će jednostavno proslijediti sve podatke između dva soketa, a Columbo će misliti da se spaja na mene, dok će se zapravo spajati na potpuno drugačiji VNC poslužitelj.

Moj kod će djelovati kao tajni most između mene i neke druge jadne duše po mom izboru. Bilo je predivno.

Odmah sam počeo pisati svoj lažni VNC most. Columbo me nekoliko puta spojio, ali ja sam nastavio programirati pred njim. Došao sam do zaključka da nema pojma što radim, iako sam pisao očite stvari poput brojeva priključaka i komentara poput // Прощай, жуткий шпион VNC.

Nakon nekoliko dana nisam uspio natjerati kod da ispravno radi. Da stvar bude još gora, radio sam gotovo neprekidno s crnom VNC ikonom u programskoj traci. Dok je bio povezan, nisam mogao osloboditi port da testiram svoj kod.

Da sam tada znao netcat!

Na kraju su mi popustili živci, ipak sam bio nestrpljiv momak od 17 godina. Gledajući kako bijela ikona VNC poslužitelja ponovno postaje crna, prestrašio sam se, otvorio originalni kod koji je popunjavao red poruka i pokrenuo ga pred njegovim očima. Čak sam i pričekao nekoliko sekundi prije nego što sam kliknuo End Process, samo da budem siguran da je vidio.

Ako me pritisak na tu tipku nije u potpunosti uvjerio da se isplatilo, onda to što je on skočio iza svoje tvrđave monitora kako bi mi brzo prišao i izveo me iz sobe svakako jest.

Kao rezultat toga, bio sam dva tjedna zabranjen pristup mreži. Poštena kazna, pomislio sam. Nakon otprilike tri tjedna, VNC poslužitelj je nestao iz skripti za pokretanje i nikada se nije pojavio nigdje drugdje. Nikada nisam znao je li moj incident igrao ikakvu ulogu u ovome ili ne, ali potpuno je uništio moj plan da se basnoslovno obogatim prodajom svog VNC pištolja depresivnim studentima u fakultetskim računalnim dvoranama diljem zemlje.

Izvor: www.habr.com

Dodajte komentar