Bitwa programistów: ja kontra ten facet z VNC

В tego bloga Opublikowano całkiem sporo opowieści programistów. Lubię wspominać swoje stare głupoty. Cóż, oto kolejna taka historia.

Po raz pierwszy zainteresowałem się komputerami, zwłaszcza programowaniem, gdy miałem około 11 lat. Na początku liceum bоWiększość wolnego czasu spędzałem majsterkując przy moim C64 i pisząc BASIC, a następnie wycinając nożyczkami błędny kod. Nie żartuję, nożyczki.

Po szkole (w wieku około 16 lat) brytyjskie dzieci zwykle idą do college'u, gdzie przed pójściem na uniwersytet decydują się na naukę trzech lub czterech przedmiotów. Biorąc pod uwagę moją miłość do beżowego pudełka i magnetofonu w domu, zdecydowałem, że studiowanie „informatyki” na studiach było właściwym wyborem.

Kurs podobał mi się bardziej, niż się spodziewałem; tam po raz pierwszy spotkałem Pascala i Delphi.

W przerwach między zajęciami studenci mogli pracować na dowolnym, wolnym komputerze w sali komputerowej. Wyobraź sobie: ogromną salę, przeznaczoną na około sto osób, z rzędami stołów zastawionych maszynami, takimi jak te, w których monitor stoi na jednostce systemowej. Wentylatory nieustannie szumią, kulki myszy brzęczą na stołach, nie zatrzymując się ani na sekundę. W powietrzu unosi się dziwny zapach, jakby 50–100 hormonalnych nastolatków okresowo przesiadało się, aby ochłodzić setki chipów Pentium III.

Pomimo zagrożenia dla zdrowia lubiłem przesiadywać przy komputerze, gdy miałem wolną chwilę.

Administratorem dyżurującym na sali był niski mężczyzna w średnim wieku, który został wybrany na to stanowisko ze względu na jego nienasyconą chęć zostania złym dyktatorem. Tak przypuszczam. Służba to mało powiedziane, facet naprawdę kochał swoją pracę. Miał za zadanie utrzymywać porządek, tak aby nikt nie używał szkolnego komputera do niczego niewłaściwego.

Intuicja do dziś mi podpowiada, że ​​premia administratora zależała bezpośrednio od liczby uczniów, których złapał za rękę i wyprowadził z sali komputerowej. Jestem pewien, że ten facet spłacił wcześniej kredyt hipoteczny.

Usiadł w odległym kącie sali komputerowej przy narożnym stole. Można było też bezpiecznie założyć, że jego monitory płodności znalazły sposób na reprodukcję przy imponująco krótkim okresie ciąży, a było ich tak wiele. Można się tylko zastanawiać, czy naprawdę miał czas, aby ich wszystkich śledzić. Oczywiście żartuję... czy wspominałem, że traktował swoją pracę bardzo poważnie?

W tym czasie w sieci komputerowej działał system Windows 2000. Wkrótce odkryłem, że za każdym razem, gdy logowałem się do systemu, uruchamiał się skrypt, który kazał uruchomić serwer VNC z konta administratora w celu zdalnego dostępu do pulpitu. Ilekroć ten facet chciał cię szpiegować, łączył się bezpośrednio z twoją maszyną i obserwował. To było przerażające i teraz, gdy o tym myślę, prawdopodobnie nielegalne.

Po przebrnięciu przez BASIC i C64 pisałem teraz w C i nawet trochę w C++. W tamtym czasie nadal bardzo interesowałem się językiem D, który skorygował pewne niedociągnięcia C++, tak jak to wtedy widziałem.

Zwykle szedłem do pokoju komputerowego, żeby przeczytać coś nowego na D lub pobawić się kompilatorem Digital Mars D. Czasami, gdy byłem oderwany od myślenia o wspaniałej przyszłości D, pisałem kod w C, aby włamać się do innych programów Win32 przez ich okno uchwyty.

W starych, dobrych czasach programowania Win32 znalezienie uchwytu okna było najłatwiejszą metodą zhakowania innych programów. Oczywiście wszystkie programy GUI w systemie Windows miały okno, nawet jeśli nie było ono widoczne na ekranie. Pisząc program pobierający uchwyt do innego procesu (w zasadzie łącze do niego), możesz wysyłać do niego komunikaty. Pozwoliło to na wykonanie kilku podstawowych operacji, takich jak ukrywanie/pokazywanie okna programu, a także naprawdę fajnych rzeczy, takich jak wymuszanie na procesie załadowania dowolnej biblioteki DLL do jego przestrzeni pamięci i rozpoczęcia wykonywania kodu. Po wstrzyknięciu DLL zaczęła się zabawa.

Przez pierwsze półtora miesiąca ten detektyw nie przeszkadzał mi zbytnio, łączył się z serwerem VNC na moim komputerze tylko raz lub dwa razy. Ale jedna konkretna sesja mogła wzbudzić jego zainteresowanie. Pisałem kod w C, aby ukryć okna Sapera (bez ich zamykania), aby ułatwić grę na zajęciach, kiedy zauważyłem, że biała ikona VNC na pasku zadań stała się czarna. Oznaczało to, że teraz mnie obserwuje.

Kontynuowałem kodowanie jak zwykle, starając się go ignorować. Tymczasem maszyna zaczęła zwalniać, próbując przesłać maksymalną liczbę klatek na sekundę do jednego z niezliczonych monitorów w rogu pokoju. Windows prawie przestał odpowiadać, kiedy moja cierpliwość się skończyła, wylogowałem się i skończyłem na cały dzień.

Podczas kolejnych wizyt w sali komputerowej Colombo niemal za każdym razem żywo interesował się tym, co robię. Mniej więcej po czwartym razie zdecydowałem: muszę coś z tym zrobić.

Przyznam, że rozsądna, racjonalna osoba mogła po prostu poruszyć tę kwestię bezpośrednio z nim lub swoim szefem. Zawsze jednak ulegałem pokusie i szybko namówiłem się na przyjęcie zupełnie innej strategii.

- Bez tego serwera VNC nic nie zrobisz! — spokojnie i zdecydowanie powtarzałem sobie kilka razy.

Trzeba było zabić VNC.

Zacząłem chodzić do sali komputerowej z dużymi grupami uczniów i siadać jak najdalej od rogu z monitorami. To działało przez jakiś czas i dało mi trochę czasu na przetestowanie pomysłów.

Moja pierwsza próba, myślę, że się zgodzicie, była dość słaba. Klikając prawym przyciskiem myszy ikonę VNC na pasku zadań, zobaczyłem menu z magicznymi literami WYJŚCIE. Niestety, litery były pisane szarym konturem. Administrator wyłączył opcję menu „Wyjdź” za pomocą Edytora zasad grupy. Próbowałem zabić proces z poziomu Menedżera zadań, ale oczywiście było to dla mnie niewidoczne, ponieważ działał na innym, bardziej uprzywilejowanym koncie. Nie wyszło.

Przypomniałem sobie, że serwer VNC działa na porcie TCP 5900. Mój następny plan polegał na wysłaniu uszkodzonych pakietów do tego portu w celu jego zawieszenia.

Spędziłem co najmniej kilka dni majsterkując przy protokole, wysyłając różne formy dobrze ustrukturyzowanych bzdur na port 5900 w nadziei, że się zepsuje. Ostatecznie to też nie zadziałało.

Już myślałem, że nie uda mi się pozbyć tej rzeczy, gdy nagle dotarło do mnie: tam musi być okno! Musimy to wyświetlić. Może będzie miał fajny, soczysty przycisk „Wycisz”, który będę mógł świetnie wykorzystać!

Uruchomiłem mój prawie idealny kod C, aby znaleźć uchwyt do głównego okna innego procesu - i rzeczywiście, znaleziono VNC. Poczułem inspirację, kiedy zacząłem pisać palcami WM_SHOWWINDOW. Spróbuj zgadnąć, co widziałem przed sobą?

Nic!

Teraz byłem ciekaw... miał okno, ale ignorował moje wiadomości. Sprawdziłem dwukrotnie mój kod, aby upewnić się, że działa. Przetestowałem to na kilku innych procesach i działało świetnie. Próbowałem wysłać inne wiadomości do okna VNC i nadal nic.

I wtedy znowu do mnie dotarło!

Dzięki bardzo grubemu książka Charles Petzold Dokładnie przestudiowałem, jak procesy Win32 działają w systemie. Każda aplikacja Win32 ma okno oraz „kolejkę wiadomości”. Wiadomości wywołane interakcją użytkownika, a także wiadomości wysyłane przez sam system Windows trafiają do kolejki, a aplikacja sama decyduje, jak je przetworzyć.

Samo w sobie niezbyt interesujące. Kiedy jednak zdałem sobie sprawę, że wystarczająco duża kolejka nieprzetworzonych komunikatów działa jak heurystyka umożliwiająca Menedżerowi procesów okiennych interweniowanie w zawieszonym procesie, zacząłem się pocić czystą serotoniną.

Nie marnując ani sekundy, wróciłem do kodu C, przygotowując się do wysłania kolejnej wiadomości do głównego okna VNC WM_SHOWWINDOW. W cyklu. Wieczny. A więc mnóstwo wiadomości. WM_SHOWWINDOW, o którym teraz wiedziałem, że VNC będzie próbowało całkowicie zignorować… na własne ryzyko.

Skompilowałem i uruchomiłem 4 KB najbardziej kochającego wolność kodu w moim życiu. Po około trzech sekundach system Windows zgłosił, że proces vncserver.ехе nie odpowiada i złożył propozycję nie do odrzucenia:

Czy chcesz zakończyć ten proces?

O TAK!

Przyznam, że przez resztę dnia byłem z siebie nieznośnie zadowolony.

Po kilku godzinach spędzonych na trawieniu mojej nowej supermocy zdecydowałem, jak ją wykorzystam. Zbyt łatwo było po prostu zabić sesję tuż przed nim. Miałem lepszy pomysł - zniknąć całkowicie.

Później chrzest bojowy z programowaniem gniazd Zdałem sobie sprawę, że mogę napisać kod, który zrobi dwie rzeczy. Najpierw zajmie nowo zwolniony port TCP 5900, wcześniej zajęty przez nieświadomy proces serwera VNC. Następnie utworzy nowe połączenie TCP z serwerem VNC określonej maszyny. Kod po prostu przekaże wszystkie dane pomiędzy dwoma gniazdami, a Columbo będzie myślał, że łączy się ze mną, podczas gdy w rzeczywistości będzie łączył się z zupełnie innym serwerem VNC.

Mój kod będzie działał jak tajny pomost między mną a inną biedną duszą, którą wybiorę. Było cudownie.

Natychmiast zacząłem pisać mój fałszywy most VNC. Columbo łączył się ze mną kilka razy, ale nadal programowałem przed nim. Doszedłem do wniosku, że nie miał pojęcia co robię, mimo że napisałem rzeczy oczywiste jak numery portów i komentarze typu // Прощай, жуткий шпион VNC.

Po kilku dniach nie udało mi się uruchomić kodu. Co gorsza, pracowałem niemal bez przerwy z czarną ikoną VNC w zasobniku systemowym. Gdy był podłączony, nie mogłem zwolnić portu, aby przetestować mój kod.

Gdybym wtedy wiedział netcat!

W końcu nerwy mi puściły, w końcu byłem niecierpliwym 17-latkiem. Widząc, jak biała ikona serwera VNC znów staje się czarna, przestraszyłem się, otworzyłem oryginalny kod, który wypełnił kolejkę wiadomości, i uruchomiłem go na jego oczach. Nawet odczekałem kilka sekund przed kliknięciem End Process, żeby się upewnić, że to widział.

Jeśli naciśnięcie tego przycisku nie przekonało mnie do końca, że ​​było warto, to wyskoczenie zza swojej fortecy monitorów, aby szybko do mnie podejść i wyprowadzić mnie z pokoju, z pewnością to zrobiło.

W rezultacie zostałem zablokowany w sieci na dwa tygodnie. Myślę, że to sprawiedliwa kara. Po około trzech tygodniach serwer VNC zniknął ze skryptów startowych i nigdy nie pojawił się nigdzie indziej. Nigdy nie wiedziałem, czy mój incydent odegrał w tym jakąkolwiek rolę, czy nie, ale całkowicie zrujnował mój plan bajecznego wzbogacenia się, sprzedając moją broń VNC studentom z depresją w salach komputerowych na uczelniach w całym kraju.

Źródło: www.habr.com

Dodaj komentarz