Coder Battle: Me vs That VNC Guy

В tento blog Programátorských příběhů bylo publikováno poměrně dost. Rád vzpomínám na své staré hlouposti. No, tady je další takový příběh.

Poprvé jsem se začal zajímat o počítače, zejména o programování, když mi bylo asi 11 let. Na začátku střední školy bоVětšinu svého volného času jsem trávil šťoucháním se s C64 a psaním BASICu, pak jsem vystřihoval špatný kód nůžkami. Nedělám si srandu, nůžky.

Po škole (kolem 16 let) britské děti obvykle jdou na vysokou školu, kde se rozhodnou studovat tři nebo čtyři předměty, než půjdou na univerzitu. Vzhledem k mé lásce k béžové krabici a magnetofonu doma jsem se rozhodl, že studium „informatiky“ na vysoké škole je správná volba.

Kurz jsem si užil víc, než jsem čekal; tam jsem se poprvé setkal s Pascalem a Delphi.

O přestávkách mezi vyučováním mohli žáci pracovat na libovolném volném stroji v počítačové učebně. Představte si: obrovskou místnost určenou pro asi sto lidí s řadami stolů plných strojů, jako jsou ty, kde monitor stojí na systémové jednotce. Fanoušci neustále hučí, na stolech bzučí myší kuličky, které se ani na vteřinu nezastaví. Ve vzduchu je cítit podivný zápach, jako by se 50-100 hormonálních teenagerů pravidelně střídalo, aby chladili stovky čipů Pentium III.

I přes zdravotní rizika jsem rád seděl u počítače, když jsem měl volnou minutu.

Služební administrátor v místnosti byl malý muž středního věku, který byl pro tuto roli vybrán kvůli své neukojitelné touze stát se zlým diktátorem. Předpokládám. Ve službě je podcenění, ten chlap svou práci opravdu miloval. Měl za úkol udržovat pořádek, aby školní počítač nikdo nepoužíval k ničemu nevhodnému.

Dodnes mi moje intuice říká, že adminův bonus přímo závisel na počtu studentů, které chytil za ruku a vyvedl z počítačové učebny. Jsem si docela jistý, že ten chlap předčasně splatil hypotéku.

Seděl ve vzdáleném rohu počítačové učebny u rohového stolu. A dalo se s jistotou předpokládat, že jeho monitory plodnosti našly způsob, jak se rozmnožovat s působivě krátkou dobou březosti, bylo jich tolik. Člověk se mohl jen ptát, zda měl opravdu čas je všechny sledovat. Samozřejmě, žertuji... zmínil jsem se, že svou práci bral velmi vážně?

V té době běžel v počítačové síti Windows 2000. Brzy jsem zjistil, že při každém přihlášení do systému se spouští skript, který specifikuje spouštění VNC serveru z administrátorského účtu pro vzdálený přístup na plochu. Kdykoli vás chtěl tento chlápek špehovat, připojil se přímo k vašemu počítači a sledoval. Bylo to strašidelné a teď, když o tom přemýšlím, pravděpodobně nezákonné.

Po ořezání BASICu a C64 jsem nyní psal v C a dokonce i trochu C++. V té době mě ještě hodně zajímal jazyk D, který opravoval některé nedostatky C++, jak jsem to tehdy viděl.

Chodil jsem do počítačové učebny, abych si přečetl něco nového na D nebo si hrál s kompilátorem Digital Mars D. Občas, když jsem byl vyrušen z přemýšlení o velké budoucnosti D, napsal jsem kód C, abych naboural jiné programy Win32 přes jejich okno. rukojeti.

Za starých dobrých časů programování Win32 bylo nalezení ovladače okna nejsnazší metodou hackování jiných programů. Je zřejmé, že všechny programy GUI ve Windows měly okno, i když se na obrazovce nezobrazovalo. Když napíšete program, který načte popisovač do jiného procesu (v podstatě odkaz na něj), můžete mu posílat zprávy. To umožnilo některé základní operace, jako je skrytí/zobrazení okna programu, a také opravdu skvělé věci, jako je vynucení procesu, aby nahrál libovolnou DLL do svého paměťového prostoru a začal spouštět kód. Po injekci DLL začala zábava.

První měsíc a půl mě tato detektivka moc netrápila, k VNC serveru na mém stroji se připojila jen jednou nebo dvakrát. Ale jedno konkrétní sezení mohlo vzbudit jeho zájem. Psal jsem nějaký kód v C pro skrytí oken Hledání min (aniž bych je zavíral), abych si usnadnil hraní ve třídě, když jsem si všiml, že bílá ikona VNC na systémové liště zčernala. To znamenalo, že mě teď pozoroval.

Pokračoval jsem v kódování jako obvykle a snažil se ho ignorovat. Mezitím se stroj začal zpomalovat a snažil se přenést maximální snímkovou frekvenci na jeden z nesčetných monitorů v rohu místnosti. Windows téměř přestaly reagovat, když mi došla trpělivost, odhlásil jsem se a pro tento den skončil.

Při dalších návštěvách počítačové učebny se Colombo téměř pokaždé živě zajímal o to, co dělám. Asi po čtvrté jsem se rozhodl: Musím s tím něco udělat.

Připouštím, že rozumný, racionálně uvažující člověk mohl jednoduše vznést toto téma přímo jemu nebo jeho šéfovi. Vždy jsem však podlehl pokušení a rychle jsem se přemluvil, abych přijal úplně jinou strategii.

- Bez tohoto VNC serveru nemůžete nic dělat! — Řekl jsem si klidně a rozhodně několikrát.

Bylo nutné zabít VNC.

Začal jsem chodit do počítačové učebny s velkými skupinami studentů a sedět co nejdál od rohu s monitory. Chvíli to fungovalo a dalo mi to čas vyzkoušet nápady.

Můj první pokus, myslím, že budete souhlasit, byl dost slabý. Po kliknutí pravým tlačítkem na ikonu VNC v systémové liště se mi zobrazila nabídka s kouzelnými písmeny EXIT. Bohužel byly dopisy napsány šedým obrysovým textem. Správce zakázal položku nabídky "Konec" prostřednictvím Editoru zásad skupiny. Pokusil jsem se zabít proces ze Správce úloh, ale samozřejmě byl pro mě neviditelný, protože běžel pod jiným, privilegovanějším účtem. Nevyšlo to.

Vzpomněl jsem si, že VNC server běží na TCP portu 5900. Můj další plán byl poslat poškozené pakety na tento port, aby se zhroutil.

Strávil jsem alespoň pár dní šťoucháním se s protokolem, posíláním různých forem dobře strukturovaných keců na port 5900 a doufal jsem, že se to zlomí. Ani to se nakonec nepovedlo.

Už jsem si začínal myslet, že se té věci nezbavím, když mi najednou došlo: musí tam být okno! Musíme to zobrazit. Možná bude mít pěkné šťavnaté tlačítko „Mute“, které mohu dobře využít!

Spustil jsem svůj nyní téměř dokonalý kód C, abych našel ovladač hlavního okna jiného procesu - a VNC bylo jistě nalezeno. Cítil jsem inspiraci, když jsem psal prsty WM_SHOWWINDOW. Zkuste hádat, co jsem viděl před sebou?

Nic!

Teď jsem byl zvědavý... mělo to okno, ale ignorovalo to moje zprávy. Dvakrát jsem zkontroloval svůj kód, abych se ujistil, že funguje. Vyzkoušeno na několika dalších procesech a fungovalo to skvěle. Zkoušel jsem odesílat další zprávy do okna VNC a stále nic.

A pak mi to zase došlo!

Díky velmi hustému knihu Charles Petzold Pečlivě jsem studoval, jak procesy Win32 fungují uvnitř systému. Každá aplikace Win32 má okno a také "frontu zpráv". Zprávy vyvolané interakcí uživatele i zprávy odesílané samotným Windows přicházejí ve frontě a samotná aplikace rozhoduje o jejich zpracování.

Samo o sobě není moc zajímavé. Ale když jsem si uvědomil, že dostatečně velká fronta nezpracovaných zpráv funguje jako heuristika pro Window Process Manager, aby zasáhl do zavěšeného procesu, začal jsem potit čistý serotonin.

Bez ztráty vteřiny jsem se vrátil ke svému C kódu a připravoval se na odeslání další zprávy do hlavního okna VNC WM_SHOWWINDOW. V cyklu. Věčný. Takže hodně zpráv. WM_SHOWWINDOW, o kterém jsem teď věděl, že se VNC pokusí úplně ignorovat... na vlastní nebezpečí.

Zkompiloval jsem a spustil 4KB nejsvobodnějšího kódu mého života. Po asi třech sekundách systém Windows oznámil, že proces probíhá vncserver.ехе neodpovídá a učinil nabídku, kterou jsem prostě nemohl odmítnout:

Chcete tento proces dokončit?

SAKRA ANO!

Přiznám se, že po zbytek dne jsem byl sám se sebou nesnesitelně spokojený.

Po několika hodinách strávených trávením své nové superschopnosti jsem se rozhodl, jak ji využiji. Bylo příliš snadné zabít relaci přímo před ním. Měl jsem lepší nápad – úplně zmizet.

Po křest ohněm s programováním socketů Uvědomil jsem si, že bych mohl napsat kód, který by dělal dvě věci. Nejprve obsadí nově uvolněný TCP port 5900, dříve obsazený bezradným procesem serveru VNC. Poté vytvoří nové TCP připojení k VNC serveru zadaného stroje. Kód jednoduše zprostředkuje všechna data mezi dvěma sokety a Columbo si bude myslet, že se připojuje ke mně, i když se ve skutečnosti bude připojovat k úplně jinému serveru VNC.

Můj kód bude fungovat jako tajný most mezi mnou a nějakou jinou ubohou duší, kterou si vyberu. Bylo to úžasné.

Okamžitě jsem začal psát svůj falešný VNC most. Columbo se ke mně několikrát připojil, ale dál jsem programoval před ním. Došel jsem k závěru, že nemá ponětí, co dělám, i když jsem psal samozřejmé věci jako čísla portů a komentáře jako // Прощай, жуткий шпион VNC.

Po několika dnech jsem nemohl kód správně spustit. Aby toho nebylo málo, pracoval jsem téměř nepřetržitě s černou ikonou VNC v systémové liště. Zatímco byl připojen, nemohl jsem uvolnit port, abych otestoval svůj kód.

Kdybych to tehdy věděl netcat!

Nakonec mi povolily nervy, vždyť jsem byl netrpělivý 17letý kluk. Když jsem viděl, jak bílá ikona VNC serveru opět zčerná, vyděsil jsem se, otevřel původní kód, který zaplnil frontu zpráv, a spustil mu ho před očima. Před kliknutím jsem dokonce pár sekund čekal End Process, jen aby se ujistil, že to viděl.

Pokud mě zmáčknutí toho tlačítka úplně nepřesvědčilo, že to za to stojí, pak určitě ano, když vyskočil zpoza své pevnosti monitorů, aby se ke mně rychle přiblížil a vyvedl mě z místnosti.

V důsledku toho jsem byl na dva týdny vyloučen ze sítě. Spravedlivý trest, pomyslel jsem si. Asi po třech týdnech VNC server zmizel ze spouštěcích skriptů a nikde jinde se neobjevil. Nikdy jsem nevěděl, jestli v tom můj incident sehrál nějakou roli nebo ne, ale úplně to zničilo můj plán pohádkově zbohatnout prodejem své VNC pistole studentům v depresi na univerzitních počítačových sálech po celé zemi.

Zdroj: www.habr.com

Přidat komentář