Coder Battle: Ja vs. Ten chlap z VNC

В tento blog Programátorských rozprávok bolo publikovaných pomerne dosť. Rád spomínam na svoje staré hlúposti. No a tu je ďalší takýto príbeh.

Prvýkrát som sa začal zaujímať o počítače, najmä o programovanie, keď som mal asi 11 rokov. Na začiatku strednej školy bоVäčšinu svojho voľného času som trávil hraním sa s C64 a písaním BASICu, potom som vystrihoval zlý kód nožnicami. Nerobím si srandu, nožnice.

Po škole (približne vo veku 16 rokov) britské deti zvyčajne idú na vysokú školu, kde sa rozhodnú študovať tri alebo štyri predmety pred tým, ako idú na univerzitu. Vzhľadom na moju lásku k béžovej krabici a magnetofónu doma som sa rozhodol, že štúdium „informatiky“ na vysokej škole je správna voľba.

Kurz sa mi páčil viac, ako som očakával; tam som prvýkrát stretol Pascala a Delphi.

Počas prestávok medzi vyučovacími hodinami mohli žiaci pracovať na ľubovoľnom voľnom stroji v počítačovej učebni. Predstavte si: obrovskú miestnosť určenú pre asi sto ľudí s radmi stolov plných strojov, ako sú tie, kde monitor stojí na systémovej jednotke. Ventilátory neustále hučia, na stoloch bzučia myšacie guľôčky, ktoré sa nezastavia ani na sekundu. Vo vzduchu je cítiť zvláštny zápach, ako keby sa 50-100 hormonálnych tínedžerov pravidelne striedalo, aby ochladzovali stovky čipov Pentium III.

Napriek zdravotným rizikám som rád sedel za počítačom, keď som mal voľnú minútu.

Službukonajúci admin v miestnosti bol nízky muž v strednom veku, ktorý bol vybraný pre túto úlohu kvôli jeho neukojiteľnej túžbe stať sa zlým diktátorom. Myslím, že áno. Služba je podhodnotenie, ten chlap svoju prácu naozaj miloval. Mal za úlohu udržiavať poriadok, aby nikto nepoužíval školský počítač na nič nevhodné.

Dodnes mi moja intuícia hovorí, že adminov bonus priamo závisel od počtu študentov, ktorých chytil za ruku a odprevadil z počítačovej učebne. Som si celkom istý, že ten chlap predčasne splatil hypotéku.

Sedel vo vzdialenom rohu počítačovej miestnosti pri rohovom stole. A dalo sa s istotou predpokladať, že jeho monitory plodnosti našli spôsob, ako sa rozmnožovať s pôsobivo krátkym obdobím tehotenstva, bolo ich tak veľa. Dalo sa len čudovať, či mal naozaj čas sledovať ich všetkých. Samozrejme, žartujem... už som spomínal, že svoju prácu bral veľmi vážne?

V tom čase bežal v počítačovej sieti Windows 2000. Čoskoro som zistil, že pri každom prihlásení do systému sa spustil skript, ktorý špecifikoval spustenie VNC servera z účtu správcu pre vzdialený prístup na plochu. Kedykoľvek vás chcel tento chlapík špehovať, pripojil sa priamo k vášmu stroju a sledoval. Bolo to strašidelné a teraz, keď o tom premýšľam, pravdepodobne nezákonné.

Po tom, čo som si orezal zuby na BASIC a C64, som teraz písal v C a dokonca aj trochu v C++. V tom čase ma ešte veľmi zaujímal jazyk D, ktorý napravil niektoré nedostatky C++, ako som to vtedy videl.

Chodil som do počítačovej učebne, aby som si prečítal niečo nové na D alebo sa hral s kompilátorom Digital Mars D. Niekedy, keď som bol vyrušený z premýšľania o veľkej budúcnosti D, napísal som kód C, aby som cez ich okno hackol iné programy Win32 rukoväte.

V starých dobrých časoch programovania Win32 bolo nájdenie kľučky okna najjednoduchšou metódou na hacknutie iných programov. Je zrejmé, že všetky programy GUI v systéme Windows mali okno, aj keď sa nezobrazovalo na obrazovke. Napísaním programu na získanie handle na iný proces (v podstate odkaz naň) by ste mu mohli posielať správy. To umožnilo niektoré základné operácie, ako je skrytie/zobrazenie okna programu, ako aj skutočne skvelé veci, ako napríklad prinútenie procesu, aby načítal ľubovoľnú knižnicu DLL do svojho pamäťového priestoru a začal vykonávať kód. Po injekcii DLL sa začala zábava.

Prvý mesiac a pol ma tento detektív veľmi netrápil, k VNC serveru na mojom stroji sa pripojil iba raz alebo dvakrát. Ale jedno konkrétne sedenie mohlo vzbudiť jeho záujem. Písal som nejaký C kód na skrytie okien Minesweeper (bez toho, aby som ich zatvoril), aby som si uľahčil hru v triede, keď som si všimol, že biela ikona VNC na systémovej lište sčernela. To znamenalo, že ma teraz sledoval.

Pokračoval som v kódovaní ako obvykle a snažil som sa ho ignorovať. Medzitým sa stroj začal spomaľovať a snažil sa preniesť maximálnu snímkovú frekvenciu na jeden z nespočetných monitorov v rohu miestnosti. Windows takmer prestal reagovať, keď mi došla trpezlivosť, odhlásil som sa a deň skončil.

Pri ďalších návštevách počítačovej miestnosti sa Colombo takmer zakaždým živo zaujímal o to, čo robím. Asi po štvrtýkrát som sa rozhodol: Musím s tým niečo urobiť.

Pripúšťam, že rozumný, racionálne uvažujúci človek mohol túto otázku jednoducho nastoliť priamo jemu alebo jeho šéfovi. Vždy som však podľahol pokušeniu a rýchlo som sa prehovoril na úplne inú stratégiu.

- Bez tohto servera VNC nemôžete robiť nič! — Povedal som si pokojne a rozhodne niekoľkokrát.

Bolo potrebné zabiť VNC.

Začal som chodiť do počítačovej učebne s veľkými skupinami študentov a sedieť čo najďalej od rohu s monitormi. Chvíľu to fungovalo a dalo mi to nejaký čas na testovanie nápadov.

Môj prvý pokus, myslím, že budete súhlasiť, bol dosť slabý. Po kliknutí pravým tlačidlom myši na ikonu VNC v systémovej lište sa mi zobrazila ponuka s magickými písmenami EXIT. Žiaľ, písmená boli napísané sivým obrysovým textom. Správca zakázal položku ponuky "Ukončiť" prostredníctvom Editora zásad skupiny. Pokúsil som sa zabiť proces zo Správcu úloh, ale samozrejme bol pre mňa neviditeľný, pretože bežal pod iným, privilegovanejším účtom. Nevyšlo to.

Spomenul som si, že server VNC beží na porte TCP 5900. Môj ďalší plán bol poslať poškodené pakety na tento port, aby som ho zrútil.

Strávil som aspoň pár dní hrabaním sa v protokole, posielaním rôznych foriem dobre štruktúrovaných svinstiev na port 5900 a dúfajúc, že ​​sa pokazí. Nakoniec ani to nezabralo.

Už som si začínal myslieť, že sa tejto veci nebudem vedieť zbaviť, keď mi zrazu svitlo: musí tam byť okno! Musíme to zobraziť. Možno bude mať pekné šťavnaté tlačidlo „Stlmiť“, ktoré môžem skvele využiť!

Spustil som svoj teraz takmer dokonalý kód C, aby som našiel rukoväť hlavného okna iného procesu - a určite sa našiel VNC. Cítil som inšpiráciu, keď moje prsty písali WM_SHOWWINDOW. Skúste hádať, čo som videl pred sebou?

Nič!

Teraz som bol zvedavý... malo okno, ale ignorovalo moje správy. Dvakrát som skontroloval svoj kód, aby som sa uistil, že funguje. Testoval to na niekoľkých ďalších procesoch a fungovalo to skvele. Skúšal som posielať ďalšie správy do okna VNC a stále nič.

A potom mi to znova došlo!

Vďaka veľmi hustému kniha Charles Petzold Pozorne som si preštudoval, ako procesy Win32 fungujú vo vnútri systému. Každá aplikácia Win32 má okno, ako aj „front správ“. Správy spustené interakciou používateľa, ako aj správy odoslané samotným Windowsom prichádzajú do frontu a samotná aplikácia rozhoduje o ich spracovaní.

Sama o sebe nie veľmi zaujímavá. Ale keď som si uvedomil, že dostatočne veľký front nespracovaných správ funguje ako heuristika pre Window Process Manager, aby zasiahol do pozastaveného procesu, začal som potiť čistý serotonín.

Bez straty sekundy som sa vrátil k svojmu C kódu a pripravil som sa na odoslanie ďalšej správy do hlavného okna VNC WM_SHOWWINDOW. V cykle. Večný. Takže veľa správ. WM_SHOWWINDOW, o ktorom som teraz vedel, že sa VNC pokúsi úplne ignorovať... na svoje nebezpečenstvo.

Zostavil som a spustil 4 kB kódu, ktorý najviac miluje slobodu v mojom živote. Po asi troch sekundách systém Windows oznámil, že proces prebieha vncserver.ехе neodpovedá a urobil som ponuku, ktorú som jednoducho nemohol odmietnuť:

Chcete dokončiť tento proces?

SAKRA ÁNO!

Priznám sa, že po zvyšok dňa som bol sám so sebou neznesiteľne spokojný.

Po niekoľkých hodinách strávených trávením mojej novej superschopnosti som sa rozhodol, ako ju využijem. Bolo príliš ľahké zabiť reláciu priamo pred ním. Mal som lepší nápad – úplne zmiznúť.

Po krst ohňom programovaním socketov Uvedomil som si, že môžem napísať kód, ktorý bude robiť dve veci. Najprv obsadí novo uvoľnený port TCP 5900, ktorý bol predtým obsadený procesom bezradného servera VNC. Potom vytvorí nové pripojenie TCP k serveru VNC zadaného počítača. Kód jednoducho zastúpi všetky dáta medzi dvoma zásuvkami a Columbo si bude myslieť, že sa pripája ku mne, hoci v skutočnosti sa bude pripájať k úplne inému serveru VNC.

Môj kód bude fungovať ako tajný most medzi mnou a nejakou inou úbohou dušou podľa môjho výberu. Bolo to úžasné.

Okamžite som začal písať svoj falošný VNC most. Columbo sa na mňa niekoľkokrát napojil, no ja som pokračoval v programovaní pred ním. Dospel som k záveru, že nemá potuchy, čo robím, aj keď som písal samozrejmé veci ako čísla portov a komentáre ako // Прощай, жуткий шпион VNC.

Po niekoľkých dňoch sa mi nepodarilo spustiť kód správne. Aby toho nebolo málo, takmer nepretržite som pracoval s čiernou ikonou VNC v systémovej lište. Kým bol pripojený, nemohol som uvoľniť port, aby som otestoval svoj kód.

Keby som to vtedy vedel netcat!

Nakoniec mi povolili nervy, bol som predsa netrpezlivý 17-ročný chalan. Sledoval som, ako biela ikona VNC servera opäť sčernie, vydesil som sa, otvoril pôvodný kód, ktorý zaplnil front správ, a spustil som mu ho pred očami. Dokonca som čakal pár sekúnd, kým som klikol End Process, len aby sa uistil, že to videl.

Ak ma stlačenie toho tlačidla úplne nepresvedčilo, že to stojí za to, tak určite áno, keď vyskočil spoza svojej pevnosti monitorov, aby sa ku mne rýchlo priblížil a vyviedol ma z miestnosti.

V dôsledku toho som dostal zákaz vstupu do siete na dva týždne. Spravodlivý trest, pomyslel som si. Asi po troch týždňoch server VNC zmizol zo spúšťacích skriptov a nikde inde sa už neobjavil. Nikdy som nevedel, či v tom môj incident zohral nejakú rolu alebo nie, ale úplne to zničilo môj plán rozprávkovo zbohatnúť predajom mojej VNC pištole depresívnym študentom na univerzitných počítačových sálach po celej krajine.

Zdroj: hab.com

Pridať komentár