W opublikowano wiele programistycznych anegdot. Lubię przypominać sobie swoje stare głupoty. Cóż, oto kolejna taka historia.
Po raz pierwszy zainteresowałem się komputerami, a zwłaszcza programowaniem, kiedy miałem około 11 lat. Na początku szkoły średniejwiększąwiększość wolnego czasu spędzałem z moim C64, pisałem w Basicu, a potem wycinałem nożyczkami zły kod. .
Po szkole (w wieku około 16 lat) brytyjscy uczniowie zazwyczaj idą do college'u, gdzie wybierają do nauki trzy lub cztery przedmioty, zanim przejdą na uniwersytet. Mając na uwadze swoją miłość do beżowego pudełka i magnetofonu w domu, postanowiłem, że nauka 'informatyki' w college'u to dobry wybór.
Kurs spodobał mi się bardziej, niż się spodziewałem; tam po raz pierwszy poznałem Pascala i Delphi.
W przerwach między zajęciami studenci mogli pracować na dowolnej wolnej maszynie w sali komputerowej. Wyobraźcie sobie: ogromny pokój, pomyślany na około sto osób, z rzędami stołów, na których stały maszyny — coś w rodzaju takich, gdzie monitor stoi na jednostce centralnej. Stałe brzęczenie wentylatorów, kulki myszy toczą się po stołach, nie zatrzymując się ani na chwilę. W powietrzu dziwny zapach, jakby 50-100 nastolatków wydzielających hormony okresowo zmieniało się, aby schłodzić setki chipów Pentium III.
Pomimo ryzyka dla zdrowia, lubiłem usiąść przy komputerze, gdy znalazła się wolna chwila.
W pokoju czuwał administrator, niski mężczyzna w średnim wieku, który został wybrany na tę rolę z powodu nieustannej pasji do bycia złym dyktatorem. Tak mi się wydaje. Czuwał — to mało powiedziane, facet naprawdę kochał swoją pracę. Miał za zadanie pilnować porządku, aby nikt nie używał komputera edukacyjnego do czegoś niestosownego.
I do dziś intuicja podpowiada mi, że premia dla admina bezpośrednio zależała od liczby studentów, których złapał na gorącym uczynku i wyrzucił z sali komputerowej. Jestem prawie pewien, że ten facet przedwcześnie spłacił swoją hipotekę.
Siedział w dalszym kącie sali komputerowej przy narożnym biurku. Można było z dużą pewnością przypuszczać, że jego płodne monitory znalazły sposób na rozmnażanie się z imponująco krótkim okresem ciąży — było ich tak dużo. Pozostawało tylko zgadywać, czy naprawdę nadążał za nimi wszystkimi. Oczywiście żartuję… wspominałem, że bardzo poważnie podchodził do pracy?
W tamtym czasie sieć komputerowa działała na systemie Windows 2000. Wkrótce odkryłem, że przy każdym logowaniu uruchamiał się skrypt, który uruchamiał serwer VNC z konta administracyjnego, aby zdalnie uzyskać dostęp do pulpitu. Zawsze, gdy ten facet chciał cię śledzić, łączył się bezpośrednio z twoją maszyną i obserwował. To było straszne, a jeśli teraz o tym pomyśleć, prawdopodobnie również nielegalne.
Zadraszając zęby na Basicu i C64, teraz pisałem w C, a nawet trochę w C++. W tamtym czasie bardzo fascynowałem się językiem D, który poprawiał niektóre niedoskonałości C++, jak mi się wtedy wydawało.
Zwykle wchodziłem do sali komputerowej, aby poczytać coś nowego na temat D lub bawić się kompilatorem Digital Mars D. Czasami, odrywając się od myśli o świetlanej przyszłości D, pisałem kod w C, aby włamać się do innych programów Win32 poprzez ich uchwyty okien.
W dawnych dobrych czasach programowania na Win32 wyszukiwanie uchwytu okna było najprostszą metodą na włamanie się do innych programów. Oczywiste jest, że wszystkie programy z interfejsem graficznym w Windows miały okno, nawet jeśli nie było ono wyświetlane na ekranie. Pisząc program do wyodrębniania uchwytu innego procesu (w zasadzie linku do niego), mogłeś wysyłać mu wiadomości. Umożliwiało to wykonanie podstawowych operacji, takich jak ukrywanie/pokazywanie okna programu, a także naprawdę fajnych rzeczy, na przykład zmuszanie procesu do załadowania dowolnej DLL do swojej przestrzeni pamięci i rozpoczęcia wykonania kodu. Po iniekcji DLL zaczynała się najciekawsza część.
Przez pierwsze półtora miesiąca ten detektyw specjalnie mnie nie niepokoił, podłączył się do serwera VNC na moim komputerze tylko raz lub dwa. Ale jedna konkretna sesja prawdopodobnie obudziła w nim zainteresowanie. Pisałem jakiś kod w C do ukrywania okien Minesweeper (nie zamykając ich), aby łatwiej było grać w klasie, i nagle zauważyłem, że biały ikonka VNC w zasobniku systemowym stała się czarna. Oznaczało to, że teraz mnie obserwuje.
Kontynuowałem kodowanie jak zwykle, starając się nie zwracać na niego uwagi. W międzyczasie maszyna zaczęła się konkretnie zacinać, próbując przekazywać maksymalną liczbę klatek na jeden z niezliczonych monitorów w rogu pokoju. Windows prawie przestał reagować, więc, kiedy moje cierpliwość się skończyła, wylogowałem się i zakończyłem na dzisiaj.
Podczas kolejnych wizyt w sali komputerowej Colombo za każdym razem wykazywał żywe zainteresowanie tym, co robię. Po około czwartym razie postanowiłem, że muszę coś z tym zrobić.
Przyznaję, że rozsądna, racjonalna osoba mogła po prostu poruszyć tę kwestię bezpośrednio z nim lub jego szefem. Jednak zawsze ulegałem pokusie i szybko przekonywałem siebie, aby wybrać zupełnie inną strategię.
— Nie możesz nic zrobić bez tego serwera VNC! — spokojnie, zdecydowanie powiedziałem sobie kilka razy.
Trzeba było zabić VNC.
Zacząłem wchodzić do sali komputerowej z dużymi grupami studentów i siadać jak najdalej od kąta z monitorami. Przez jakiś czas działało i dało mi trochę czasu na przemyślenie pomysłów.
Moja pierwsza próba, myślę, że się zgodzisz, była dość słaba. Klikając prawym przyciskiem myszy na ikonę VNC w zasobniku systemowym, zobaczyłem menu z magicznymi literami E-X-I-T. Niestety, litery były napisane szarym konturowym tekstem. Administrator wyłączył element menu „Wyjście” za pomocą edytora zasad grupy. Próbowałem zabić proces w Menedżerze zadań, ale oczywiście był niewidoczny dla mnie, ponieważ działał na innym, bardziej uprzywilejowanym koncie. Nic z tego nie wyszło.
Serwer VNC działa na porcie TCP 5900, przypomniałem sobie. Mój następny plan polegał na wysłaniu uszkodzonych pakietów na ten port, aby go zawiesić.
Przez co najmniej kilka dni badałem protokół, wysyłając na port 5900 różne formy poprawnie skonstruowanego syfu i mając nadzieję, że się złamie. Ostatecznie to też nie zadziałało.
Zaczynałem myśleć, że nie będę mógł pozbyć się tej rzeczy, kiedy nagle mnie olśniło: musi być tam okno! Muszę je wyświetlić. Może będzie tam przycisk „Wyłącz”, który świetnie wykorzystam!
Uruchomiłem swój prawie doskonały kod C, aby znaleźć uchwyt głównego okna innego procesu – i rzeczywiście znalazłem VNC. Czułem się uniesiony, gdy palce wpisały WM_SHOWWINDOW. Spróbuj zgadnąć, co zobaczyłem przed sobą?
Nic!
Teraz byłem ciekawy… miał okno, ale ignorowało moje wiadomości. Sprawdziłem mój kod, aby upewnić się, że działa. Przetestowałem go na kilku innych procesach i działał doskonale. Próbowałem wysyłać do okna VNC inne wiadomości, a nadal nic.
I wtedy znowu mnie olśniło!
Dzięki bardzo grubej Charlesa Petzolda dokładnie studiowałem, jak działają procesy Win32 w systemie. Każda aplikacja Win32 ma okno oraz „kolejkę wiadomości”. Wiadomości wywołane interakcją z użytkownikiem oraz wiadomości wysyłane przez samą Windows trafiają do kolejki, a samo aplikacja decyduje, jak je obsłużyć.
Nie jest to szczególnie ciekawe samo w sobie. Ale kiedy zrozumiałem, że wystarczająco duża nieprzetworzona kolejka wiadomości pełni rolę heurystyki do ingerowania w zawieszony proces przez menedżera Window Process Manager, poczułem dreszcz czystego serotoniny.
Bez chwili zwłoki wróciłem do mojego kodu C, gotowy, by wysłać do głównego okna VNC jeszcze jedną wiadomość WM_SHOWWINDOW. W pętli. Wiecznej. Tak więc, mnóstwo wiadomości WM_SHOWWINDOW, które, jak teraz wiedziałem, VNC spróbuje całkowicie zignorować… na własną odpowiedzialność.
Skompilowałem i uruchomiłem 4 KB najbardziej wolnomyślniego kodu w moim życiu. Około trzy sekundy później Windows powiadomiło, że proces vncserver.exe nie odpowiada, i zaoferowało propozycję, której po prostu nie mogłem odmówić:
Czy chcesz zakończyć ten proces?
Cholera, TAK!
Pozwól, że przyznam, że resztę dnia byłem nie do zniesienia zadowolony z samego siebie.
Po kilku godzinach przetwarzania mojej nowej supermocy postanowiłem, jak zamierzam jej użyć. Po prostu zabicie sesji na jego oczach byłoby zbyt proste. Miałem lepszy pomysł – zniknąć całkowicie.
Po Zrozumiałem, że mogę napisać kod, który zrobi dwie rzeczy. Po pierwsze, zajmie niedawno zwolniony port TCP 5900, wcześniej zajmowany przez nieświadomy proces serwera VNC. Następnie stworzy nowe połączenie TCP z serwerem VNC na wybranej maszynie. Kod będzie po prostu proxował wszystkie dane między dwoma gniazdami, a Kolumbo pomyśli, że łączy się ze mną, podczas gdy w rzeczywistości łączy się z zupełnie innym serwerem VNC.
Mój kod będzie działał jak tajny most między mną a jakąś inną biedną duszą według mojego wyboru. To było wspaniałe.
Od razu zacząłem pisać mój fałszywy most VNC. Kolumbo łączył się ze mną kilka razy, ale ja nadal programowałem na jego oczach. Doszedłem do wniosku, że nie ma pojęcia o moich działaniach, choć pisałem oczywiste rzeczy, takie jak numery portów i komentarze typu // Прощай, жуткий шпион VNC.
Po kilku dniach nie mogłem zmusić kodu do działania poprawnie. Co gorsza, nieustannie pracowałem z czarną ikoną VNC w zasobniku systemowym. Dopóki był podłączony, nie mogłem zwolnić portu, aby sprawdzić mój kod.
Gdybym wtedy wiedział o netcat!
W końcu nerwy nie wytrzymały, byłem w końcu niecierpliwym 17-letnim facetem. Znowu obserwując, jak biała ikona serwera VNC staje się czarna, wpadłem w szał, otworzyłem pierwotny kod, który wypełniał kolejkę wiadomości i uruchomiłem go na jego oczach. Nawet poczekałem kilka sekund przed naciśnięciem Zakończ proces, żeby upewnić się, że to widział.
Jeśli naciśnięcie tego przycisku jeszcze do końca mnie nie przekonało, że warto, to jego skok z powodu jego solidnych monitorów, aby szybko podejść do mnie i wyrzucić mnie z pokoju, zdecydowanie było warte tego.
Ostatecznie zablokowano mi dostęp do sieci na dwa tygodnie. Uważałem to za sprawiedliwą karę. Około trzy tygodnie później serwer VNC zniknął z skryptów rozruchowych i odtąd się nie pojawił. Nigdy się nie dowiedziałem, czy mój incydent miał w tym jakiś wpływ, ale całkowicie zniweczył mój plan na szybkie wzbogacenie się z sprzedaży mojej broni VNC uciskanym studentom w salach komputerowych na całym kraju.
Źródło: habr.com
