Bitka kodirnikov: Jaz proti tistemu VNC tipu

В ta blog Objavljenih je bilo kar nekaj programerskih pravljic. Rad se spominjam svojih starih neumnosti. No, tukaj je še ena takšna zgodba.

Računalništvo, predvsem programiranje, me je začelo zanimati, ko sem bil star približno 11 let. Na začetku srednje šole bоVečino prostega časa sem porabil za poigravanje s svojim C64 in pisanje BASIC-a, nato pa s škarjami izrezal slabo kodo. Ne hecam se, škarje.

Po šoli (približno pri 16 letih) gredo britanski otroci običajno na kolidž, kjer se odločijo za študij treh ali štirih predmetov, preden odidejo na univerzo. Glede na mojo domačo ljubezen do bež škatle in magnetofona sem se odločil, da je študij “računalništva” na fakulteti prava izbira.

V tečaju sem užival bolj, kot sem pričakoval; tam sem se prvič srečal s Pascalom in Delphijem.

Med odmori med poukom so učenci lahko delali na kateremkoli prostem stroju v računalniški učilnici. Predstavljajte si: ogromna soba, zasnovana za približno sto ljudi, z vrstami miz, napolnjenih s stroji, kot so tisti, kjer monitor stoji na sistemski enoti. Navijači nenehno brenčijo, miške žogice brenčijo na mizah in ne prenehajo niti za trenutek. V zraku je nenavaden vonj, kot da bi se 50-100 hormonskih najstnikov občasno zamenjalo za hlajenje na stotine čipov Pentium III.

Kljub zdravstveni nevarnosti sem rad sedel za računalnik, ko sem imel prosto minuto.

Dežurni admin v sobi je bil nizek moški srednjih let, ki so ga za to vlogo izbrali zaradi njegove nenasitne želje, da bi postal zlobni diktator. Mislim, da. Delo v službi je podcenjevanje; fant je res oboževal svoje delo. Zadolžen je bil za red, da nihče ne bi uporabljal šolskega računalnika za karkoli neprimernega.

Še danes mi intuicija pravi, da je bil administratorjev bonus neposredno odvisen od števila študentov, ki jih je prijel za roko in jih pospremil iz računalniške učilnice. Prepričan sem, da je ta tip predčasno odplačal svojo hipoteko.

Sedel je v skrajnem kotu računalniške sobe za kotno mizo. In varno je bilo domnevati, da so njegovi monitorji plodnosti našli način za razmnoževanje z izjemno kratko gestacijsko dobo, toliko jih je bilo. Lahko bi se le spraševali, ali je res imel čas spremljati vse. Seveda se hecam ... sem omenil, da je svoje delo jemal zelo resno?

Takrat je v računalniškem omrežju deloval Windows 2000. Kmalu sem ugotovil, da se ob vsaki prijavi v sistem zažene skript, ki določa zagon strežnika VNC iz skrbniškega računa za oddaljeni dostop do namizja. Kadarkoli je ta tip želel vohuniti za vami, se je neposredno povezal z vašo napravo in opazoval. Bilo je srhljivo in zdaj, ko pomislim na to, verjetno nezakonito.

Ko sem zobal BASIC in C64, sem zdaj pisal v C in celo malo C++. Takrat me je še zelo zanimal jezik D, ki je popravil nekatere pomanjkljivosti C++, kot sem ga takrat videl.

Včasih sem šel v računalniško učilnico, da bi prebral nekaj novega o D ali se igral s prevajalnikom Digital Mars D. Včasih, ko sem bil moten od razmišljanja o veliki prihodnosti D, sem napisal kodo C, da sem skozi njihovo okno vdrl v druge programe Win32 ročaji.

V dobrih starih časih programiranja Win32 je bilo iskanje okenske ročice najlažji način za vdor v druge programe. Očitno so vsi programi GUI v sistemu Windows imeli okno, tudi če se ni pojavilo na zaslonu. Če napišete program za pridobivanje ročice drugega procesa (v bistvu povezavo do njega), mu lahko pošljete sporočila. To je omogočilo nekatere osnovne operacije, kot je skrivanje/prikaz programskega okna, pa tudi res kul stvari, kot je prisiljevanje procesa, da naloži poljuben DLL v svoj pomnilniški prostor in začne izvajati kodo. Po vstavitvi DLL se je začela zabava.

V prvem mesecu in pol me ta detektiv ni kaj dosti motil, na VNC strežnik na mojem računalniku se je povezal le enkrat ali dvakrat. Toda ena posebna seja je morda vzbudila njegovo zanimanje. Pisal sem kodo C, da bi skril okna Minesweeperja (ne da bi jih zaprl), da bi olajšal igranje v razredu, ko 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 in ga poskušal ignorirati. Medtem je stroj začel upočasnjevati in poskušal prenesti največjo hitrost slike na enega od neštetih monitorjev v kotu sobe. Windows se je skoraj prenehal odzivati, ko mi je zmanjkalo potrpljenja, sem se odjavil in končal za ta dan.

Ob naslednjih obiskih računalniške sobe se je Colombo skoraj vsakič zelo zanimal za to, kar počnem. Po približno četrtem času sem se odločil: glede tega moram nekaj narediti.

Priznam, da bi razumen, racionalen človek to vprašanje preprosto izpostavil neposredno njemu ali njegovemu šefu. Vendar sem se vedno vdal skušnjavi in ​​se hitro prepričal, da sem sprejel popolnoma drugačno strategijo.

- Brez tega strežnika VNC ne morete narediti ničesar! — sem si večkrat mirno in odločno rekel.

Treba je bilo ubiti VNC.

Začel sem zahajati v računalniško učilnico z velikimi skupinami študentov in sedel čim dlje od kota z monitorji. To je nekaj časa delovalo in dalo mi je nekaj časa za preizkušanje idej.

Mislim, da se boste strinjali, da je bil moj prvi poskus precej šibak. Z desnim klikom na ikono VNC v sistemski vrstici sem videl meni s čarobnimi črkami EXIT. Na žalost so bila pisma napisana s sivim orisom. Skrbnik je prek urejevalnika pravilnika skupine onemogočil postavko menija »Izhod«. Proces sem poskušal uničiti v upravitelju opravil, vendar mi je bil seveda neviden, ker se je izvajal pod drugim, bolj privilegiranim računom. Ni šlo.

Strežnik VNC deluje na vratih TCP 5900, sem se spomnil. Moj naslednji načrt je bil poslati poškodovane pakete na ta vrata, da bi jih zrušil.

Vsaj nekaj dni sem se ukvarjal s protokolom, pošiljal različne oblike dobro strukturiranega sranja na vrata 5900 in upal, da se bo pokvaril. Na koncu tudi to ni šlo.

Začel sem že misliti, da se te stvari ne bom mogel znebiti, ko se mi je nenadoma posvetilo: tam mora biti okno! Moramo ga prikazati. Mogoče bo imel lep sočen gumb »Izklopi zvok«, ki ga bom lahko odlično uporabil!

Zagnal sem svojo zdaj skoraj popolno kodo C, da bi našel ročaj glavnega okna drugega procesa - in zagotovo je bil najden VNC. Ko so moji prsti tipkali, sem čutil navdih WM_SHOWWINDOW. Poskusite uganiti, kaj sem videl pred seboj?

Nič!

Zdaj sem bil radoveden ... imelo je okno, vendar je ignoriralo moja sporočila. Dvakrat sem preveril svojo kodo, da sem se prepričal, da deluje. Preizkusil sem ga na več drugih procesih in delovalo je odlično. Poskušal sem poslati druga sporočila v okno VNC, pa še vedno nič.

In potem se mi je spet posvetilo!

Zahvaljujoč zelo debelim knjigo Charles Petzold Natančno sem preučil, kako procesi Win32 delujejo znotraj sistema. Vsaka aplikacija Win32 ima okno in tudi "čakalno vrsto sporočil". Sporočila, ki jih sproži interakcija uporabnika, pa tudi sporočila, ki jih pošlje sam Windows, pridejo v čakalno vrsto, aplikacija pa se sama odloči, kako jih bo obdelala.

Samo po sebi ni zelo zanimivo. Toda ko sem ugotovil, da je dovolj velika čakalna vrsta neobdelanih sporočil delovala kot hevristika za Window Process Manager, da bi posredoval v začasno ustavljenem procesu, sem se začel znojiti čisti serotonin.

Ne da bi izgubil niti sekundo, sem se vrnil k svoji kodi C in se pripravljal na pošiljanje novega sporočila v glavno okno VNC WM_SHOWWINDOW. V ciklu. Večna. Torej, veliko sporočil. WM_SHOWWINDOW, za katerega sem zdaj vedel, da ga bo VNC poskušal popolnoma prezreti ... na lastno nevarnost.

Prevedel in zagnal sem 4 KB najbolj svobodoljubne kode v svojem življenju. Po približno treh sekundah je Windows sporočil, da je postopek vncserver.ехе ne odgovori, in dal ponudbo, ki je preprosto nisem mogel zavrniti:

Ali želite dokončati ta postopek?

HRK JA!

Naj priznam, da sem bil preostanek dneva neznosno zadovoljen sam s seboj.

Po nekaj urah prebavljanja moje nove supermoči sem se odločil, kako jo bom uporabil. Preveč enostavno je bilo kar ubiti sejo tik pred njim. Imel sem boljšo idejo - popolnoma izginiti.

Po ognjeni krst s programiranjem vtičnic Spoznal sem, da lahko napišem kodo, ki bi naredila dve stvari. Najprej bo zasedel na novo osvobojena vrata TCP 5900, ki jih je prej zasedel proces strežnika Clueless VNC. Nato bo ustvaril novo povezavo TCP s strežnikom VNC navedenega stroja. Koda bo preprosto posredovala vse podatke med obema vtičnicama in Columbo bo mislil, da se povezuje z mano, v resnici pa se bo povezoval s popolnoma drugim strežnikom VNC.

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

Takoj sem začel pisati svoj lažni VNC most. Columbo se je večkrat povezal z mano, vendar sem še naprej programiral pred njim. Prišel sem do zaključka, da nima pojma, kaj počnem, čeprav sem pisal očitne stvari, kot so številke vrat in komentarji, kot // Прощай, жуткий шпион VNC.

Po nekaj dneh kode nisem mogel doseči, da bi pravilno delovala. Da bi bile stvari še hujše, sem skoraj neprekinjeno delal s črno ikono VNC v sistemski vrstici. Medtem ko je bil povezan, nisem mogel sprostiti vrat, da bi preizkusil svojo kodo.

Če bi takrat vedel netcat!

Na koncu so me popustili živci, navsezadnje sem bil nepotrpežljiv 17-letnik. Ko sem opazoval, kako bela ikona strežnika VNC spet postane črna, sem se prestrašil, odprl izvirno kodo, ki je zapolnila čakalno vrsto sporočil, in jo zagnal pred njegovimi očmi. Počakal sem celo nekaj sekund, preden sem kliknil End Process, samo da se prepričam, da je videl.

Če me pritisk na ta gumb ni popolnoma prepričal, da je bilo vredno, potem me je zagotovo prepričal njegov skok izza svoje trdnjave monitorjev, da bi se mi hitro približal in me odpeljal iz sobe.

Posledično sem bil dva tedna prepovedan dostop do omrežja. Poštena kazen, sem pomislil. Po približno treh tednih je strežnik VNC izginil iz zagonskih skriptov in se nikoli ni pojavil nikjer drugje. Nikoli nisem vedel, ali je imel moj incident kakšno vlogo pri tem ali ne, vendar je popolnoma uničil moj načrt, da bi bajno obogatel s prodajo svoje pištole VNC depresivnim študentom v računalniških dvoranah fakultet po vsej državi.

Vir: www.habr.com

Dodaj komentar