V Bylo zveřejněno mnoho programátorských historek. Rád vzpomínám na své staré hlouposti. Takže, zde je další takový příběh.
Poprvé jsem se o počítače, zejména programování, začal zajímat, když mi bylo asi 11 let. Na začátku střední školy jsemotrávil většinu volného času se svým C64 a psal na Basicu, a pak vystřihoval špatný kód nůžkami. .
Po škole (ve věku asi 16 let) britské děti obvykle jdou na vysokou školu, kde si vybírají tři-čtyři předměty, než se přihlásí na univerzitu. Vzhledem k mé lásce k béžové krabičce a kazetovému magnetofonu doma jsem usoudil, že studium 'informatiky' na vysoké škole je správná volba.
Kurz mě překvapil více, než jsem očekával; poprvé jsem se tam seznámil s Pascalem a Delphim.
V přestávkách mezi vyučováním mohli studenti pracovat na jakémkoliv volném počítači v počítačové místnosti. Představte si: obrovský pokoj, navržený pro zhruba sto lidí, s řadami stolů, na kterých byly počítače – takové, kde monitor stojí na systémové jednotce. Neustálé hučení ventilátorů, myší kuličky hučící po stolech, nezastavující se na vteřinu. V vzduchu se vznáší podivný zápach, jakoby 50-100 hormonálních adolescentů se občas měnilo pro zchlazení stovek čipů Pentium III.
I přes zdravotní rizika jsem rád seděl za počítačem, když se naskytla volná minutka.
V místnosti byl admin, muž středního věku nižší postavy, kterého vybrali na tuto roli kvůli jeho nekonečné touze stát se zlým diktátorem. Tak to vidím. Dohlížel – to je slabé slovo, ten kluk opravdu miloval svou práci. Měl na starosti udržování pořádku, aby nikdo nepoužíval školní počítač na nevhodné věci.
Až dodnes mám pocit, že odměna admina závisela přímo na počtu studentů, které chytli a vyvedli z počítačové místnosti. Jsem prakticky přesvědčen, že ten chlapec předčasně splatil svou hypotéku.
Seděl v zadním rohu počítačové místnosti za rohovým stolem. A bylo možné s jistotou předpokládat, že jeho plodné monitory našly způsob, jak se rozmnožovat se pozoruhodně krátkým těhotenským obdobím – bylo jich totiž tolik. Zůstávalo jen hádat, zda skutečně stíhá sledovat všechny. Samozřejmě, vtipkuji… zmínil jsem se, že svou práci bral velmi vážně?
Tehdy počítačová síť běžela pod Windows 2000. Brzy jsem zjistil, že při každém přihlášení se spouští skript, který spouští server VNC s administrátorským účtem pro vzdálený přístup k pracovnímu stolu. Kdykoli se ten chlapec chtěl podívat, připojil se přímo k vašemu počítači a sledoval vás. Bylo to děsivé, a pokud o tom nyní přemýšlím, pravděpodobně to bylo nezákonné.
Našroubovavši si zuby na Basic a C64, nyní jsem psal v C a dokonce trochu v C++. Tehdy jsem se stal velmi nadšeným jazykem D, který podle mě opravoval některé nedostatky C++, jak jsem to tehdy viděl.
Obvykle jsem chodil do počítačové místnosti, abych si přečetl něco nového o D, nebo si pohrál s kompilátorem Digital Mars D. Někdy, když jsem se odpoutal od myšlenek na velkou budoucnost D, jsem psal kód v C pro hackování jiných programů Win32 pomocí jejich okno popisovačů.
Ve starých dobrých časech programování na Win32 bylo hledání popisovače okna nejjednodušší metodou pro hackování jiných programů. Je zřejmé, že všechny programy s grafickým rozhraním ve Windows měly okno, i když nebylo zobrazeno na obrazovce. Napsáním programu pro vytažení popisovače jiného procesu (v podstatě odkazu na něj) jste mohli posílat zprávy. To umožnilo provádět některé základní operace, například skrýt/ukázat okno programu, a také skutečně skvělé věci, jako přimět proces, aby načetl libovolný DLL do svého paměťového prostoru a začal vykonávat kód. Po injekci DLL začalo to nejzajímavější.
V prvních dvou měsících mě tento detektiv zvlášť neznepokojoval, připojil se k VNC serveru na mém stroji pouze jednou nebo dvakrát. Ale jedno konkrétní sezení zřejmě probudilo jeho zájem. Psala jsem nějaký kód v C pro skrytí oken Minesweeperu (aniž bych je zavírala), abych se ve třídě lépe soustředila, a najednou jsem si všimla, že bílá ikona VNC v systémové liště zčernala. To znamenalo, že mě teď sleduje.
Pokračovala jsem v programování jako obvykle, snažíc se nevšímat si ho. Mezitím stroj začal výrazně zasekávat, když se snažil přenést maximální snímkovou frekvenci na jeden z bezpočtu monitorů v rohu místnosti. Windows téměř přestala reagovat a když už mi došla trpělivost, odhlásila jsem se a skončila s prací na dnešek.
Během dalších návštěv v počítačovém salónu projevoval Colombo téměř pokaždé živý zájem o to, co dělám. Přibližně po čtvrtém setkání jsem se rozhodla: s tím je třeba něco udělat.
Připouštím, že rozumný, racionální člověk by mohl tento problém jednoduše probrat přímo s ním nebo jeho nadřízeným. Nicméně jsem vždy podlehla pokušení a rychle se přesvědčila, abych zvolila zcela jinou strategii.
— Bez tohoto serveru VNC nic nezmůžeš! — řekla jsem si klidně a rozhodně několikrát.
Bylo třeba zrušit VNC.
Začala jsem ve vstoupit do počítačového salónu s velkými skupinami studentů a seděla co nejdále od rohu s monitory. Někdy to fungovalo a dalo mi to trochu času na promyšlení nápadů.
Můj první pokus, myslím, že se shodnete, byl dost slabý. Kliknutím pravým tlačítkem myši na ikonu VNC v systémové liště jsem viděla nabídku s kouzelnými písmeny E-X-I-T. Bohužel, písmena byla napsána šedým obrysovým textem. Administrátor zablokoval možnost „Ukončit“ prostřednictvím editoru skupinových politik. Zkusila jsem zabít proces v Úlohách, ale samozřejmě mi byl neviditelný, protože běžel pod jiným, privilegovanějším účtem. Nic nevyšlo.
Vzpomněla jsem si, že VNC server běží na portu TCP 5900. Můj další plán byl poslat na tento port poškozené pakety, abych ho zablokovala.
Po několik dní jsem zkoumal protokol, posílajíc na port 5900 různé formy správně strukturovaného bordelu a doufajíc, že se rozbije. Nakonec to také nevyšlo.
Už jsem začal myslet, že se této věci nezbavím, když mě najednou osvítilo: musí to mít okno! Musím ho zobrazit. Možná tam bude nějaké dobré šťavnaté tlačítko „Vypnout“, které budu moc skvěle využít!
Spustil jsem svůj téměř dokonalý C kód pro hledání deskriptoru hlavního okna jiného procesu – a skutečně jsem našel VNC. Cítil jsem se povzneseně, když jsem naťukal WM_SHOWWINDOW. Zkuste uhodnout, co jsem před sebou viděl?
Nic!
Teď mě zajímalo… mělo to okno, ale ignorovalo mé zprávy. Dvakrát jsem zkontroloval svůj kód, abych se ujistil, že funguje. Otestoval jsem ho na několika dalších procesech a fungoval skvěle. Zkoušel jsem posílat do okna VNC další zprávy, a přesto nic.
A v tu chvíli mě znovu osvítilo!
Díky velmi silné Charlese Petzolda jsem pečlivě studoval, jak procesy Win32 fungují uvnitř systému. Každá aplikace Win32 má okno a také „frontu zpráv“. Zprávy vyvolané uživatelskou interakcí, jakož i zprávy odeslané samotným Windows, přicházejí do fronty a samotná aplikace rozhoduje, jak je zpracovat.
Samo o sobě to není příliš zajímavé. Ale když jsem si uvědomil, že dostatečně velká nezpracovaná fronta zpráv slouží jako heuristika pro zásah do zamrzlého procesu ze strany správce Window Process Manager, pocítil jsem čisté serotoninové vzrušení.
Bez zbytečného otálení jsem se vrátil ke svému C kódu, připravujíc se poslat do hlavního okna VNC další zprávu WM_SHOWWINDOW. V cyklu. Věčném. Tak tedy, spousta zpráv WM_SHOWWINDOW, které, jak jsem nyní věděl, VNC se pokusí úplně ignorovat… na své vlastní riziko.
Sestavil jsem a spustil 4 KB nejvíce svobodného kódu v mém životě. Přibližně po třech sekundách Windows informovalo, že proces vncserver.exe neodpovídá, a udělalo nabídku, které jsem zkrátka nemohl odolat:
Chcete tento proces ukončit?
Sakra, ANO!
Dovolte mi přiznat, že zbytek dne jsem byl nesnesitelně spokojený se sebou.
Po několika hodinách strávených zpracováním své nové super síly jsem se rozhodl, jak ji využiju. Prostě zabít seanci přímo před jeho očima by bylo příliš jednoduché. Měl jsem lepší nápad - prostě zmizet.
Po Uvědomil jsem si, že mohu napsat kód, který bude dělat dvě věci. Nejprve zaujme nedávno uvolněný port TCP 5900, dříve obsazený nevědomým procesem VNC serveru. Poté vytvoří nové TCP spojení se zadaným VNC serverem. Kód jednoduše proproxy všechny data mezi dvěma sokety, a Kolombo bude mít za to, že se připojuje ke mně, zatímco ve skutečnosti se připojuje k úplně jinému VNC serveru.
Můj kód bude fungovat jako tajný most mezi mnou a nějakou jinou chudou duší dle mého výběru. Bylo to nádherné.
Ihned jsem začal psát svůj falešný VNC bridge. Kolombo se ke mně několikrát připojil, ale já jsem dál programoval před jeho očima. Došel jsem k závěru, že nemá tušení o mých krocích, i když jsem psal očividné věci, jako jsou čísla portů a komentáře jako // Прощай, жуткий шпион VNC.
Během pár dní jsem se nemohl donutit, aby kód fungoval správně. Co je ještě horší, skoro nepřetržitě jsem pracoval s černou ikonou VNC v systémové liště. Dokud byl připojen, nemohl jsem uvolnit port, abych zkontroloval svůj kód.
Kdybych tehdy věděl o netcat!
Nakonec nervy nevydržely, přece jen jsem byl netrpělivý 17letý kluk. Znovu jsem sledoval, jak se bílá ikona serveru VNC stává černou, vybuchl jsem, otevřel původní kód, který plnil frontu zpráv, a spustil ho před jeho očima. Dokonce jsem chvíli počkal, než jsem stiskl End Process, jen abych se ujistil, že to viděl.
Pokud stisknutí tohoto tlačítka mě ještě zcela nepřesvědčilo, že to stálo za to, pak jeho skok z pevností monitorů, aby se rychle dostal ke mně a vykázal mě z místnosti, určitě stálo za to.
Nakonec mi zakázali přístup k síti na dva týdny. Myslel jsem si, že je to spravedlivý trest. Přibližně za tři týdny zmizel server VNC ze spouštěcích skriptů a už se nikde neobjevil. Nikdy jsem se nedozvěděl, zda můj incident hrál nějakou roli v tom, nebo ne, ale úplně to zničilo můj plán na pohádkové zbohatnutí prodejem své VNC pušky utlačovaným studentům v počítačových učebnách po celé zemi.
Zdroj: habr.com
