Кодираща битка: Аз срещу този VNC човек

В този блог Бяха публикувани доста приказки за програмисти. Обичам да си спомням старите си глупави неща. Е, ето още една подобна история.

За първи път започнах да се интересувам от компютри, особено от програмиране, когато бях на около 11 години. В началото на гимназията bоПрекарвах по-голямата част от свободното си време в бърникане с моя C64 и писане на BASIC, след което изрязвах лошия код с ножица. Не се шегувам, ножици.

След училище (около 16-годишна възраст) британските деца обикновено отиват в колеж, където избират да изучават три или четири предмета, преди да отидат в университет. Предвид любовта ми към бежовата кутия и касетофона у дома, реших, че изучаването на „компютърни науки“ в колежа е правилният избор.

Наслаждавах се на курса повече, отколкото очаквах; там за първи път срещнах Паскал и Делфи.

В междучасията учениците можеха да работят на всяка свободна машина в компютърната зала. Представете си: огромна стая, предназначена за около сто души, с редици от маси, пълни с машини, като тези, където мониторът стои на системния блок. Феновете непрекъснато си тананикат, мишките бръмчат по масите, без да спират нито за секунда. Във въздуха се носи странна миризма, сякаш 50-100 хормонални тийнейджъри периодично сменят, за да охладят стотици чипове Pentium III.

Въпреки рисковете за здравето, обичах да сядам на компютъра, когато имах свободна минута.

Дежурният администратор в стаята беше нисък мъж на средна възраст, избран за тази роля заради ненаситното му желание да стане зъл диктатор. Предполагам. Дежурството е подценяване; човекът наистина обичаше работата си. Той имаше за задача да следи за реда, така че никой да не използва училищния компютър за нещо неподходящо.

До ден днешен интуицията ми подсказва, че бонусът на администратора зависи пряко от броя на учениците, които той е хванал за ръка и ескортирал от компютърната зала. Сигурен съм, че този човек е изплатил ипотеката си по-рано.

Той седна в далечния ъгъл на компютърната зала на ъглова маса. И беше безопасно да се предположи, че неговите монитори за плодовитост са намерили начин да се възпроизвеждат с впечатляващо кратък период на бременност, имаше толкова много от тях. Човек можеше само да се чуди дали наистина имаше време да следи всички тях. Разбира се, шегувам се... споменах ли, че той приемаше работата си много сериозно?

По това време компютърната мрежа работеше с Windows 2000. Скоро открих, че всеки път, когато влизам в системата, се стартира скрипт, който указва стартирането на VNC сървъра от администраторския акаунт за отдалечен достъп до работния плот. Всеки път, когато този човек искаше да ви шпионира, той се свързваше директно с вашата машина и наблюдаваше. Беше зловещо и сега, като се замисля, вероятно незаконно.

След като си изрязах зъбите на BASIC и C64, сега писах на C и дори малко на C++. По това време все още много се интересувах от езика D, който коригира някои от недостатъците на C++, както го виждах тогава.

Влизах в компютърната зала, за да прочета нещо ново на D или да играя с компилатора Digital Mars D. Понякога, докато бях разсеян от мислите за великото бъдеще на D, пишех C код, за да хакна други Win32 програми през техния прозорец дръжки.

В добрите стари времена на програмирането на Win32 намирането на манипулатор на прозорец беше най-лесният метод за хакване на други програми. Очевидно всички GUI програми на Windows имаха прозорец, дори и да не се появяваше на екрана. Като напишете програма за извличане на манипулатор към друг процес (по същество връзка към него), можете да изпращате съобщения до него. Това позволи някои основни операции като скриване/показване на прозорец на програма, както и наистина страхотни неща като принуждаване на процес да зареди произволен DLL в своето пространство в паметта и да започне да изпълнява код. След инжектирането на DLL забавлението започна.

През първия месец и половина този детектив не ме притесняваше много, той се свърза с VNC сървъра на моята машина само веднъж или два пъти. Но една конкретна сесия може да е събудила интереса му. Пишех някакъв C код, за да скрия прозорците на Minesweeper (без да ги затварям), за да улесня играта в клас, когато забелязах, че бялата икона на VNC в системната област е станала черна. Това означаваше, че сега той ме наблюдава.

Продължих да кодирам както обикновено, опитвайки се да го игнорирам. Междувременно машината започна да забавя, опитвайки се да предаде максималната честота на кадрите на един от безбройните монитори в ъгъла на стаята. Windows почти спря да отговаря, когато търпението ми се изчерпа, излязох и приключих за деня.

При следващите посещения в компютърната зала Коломбо проявяваше силен интерес към това, което правя почти всеки път. След около четвъртия път реших: трябва да направя нещо по въпроса.

Признавам, че един разумен, рационален човек би могъл просто да повдигне този въпрос директно пред него или пред шефа му. Винаги обаче се поддавах на изкушението и бързо се убедих да възприема напълно различна стратегия.

- Не можете да направите нищо без този VNC сървър! — казах си няколко пъти спокойно и решително.

Беше необходимо да се убие VNC.

Започнах да влизам в компютърната зала с големи групи ученици и да седя възможно най-далеч от ъгъла с мониторите. Това проработи известно време и ми даде малко време да тествам идеи.

Първият ми опит, мисля ще се съгласите, беше доста слаб. Щраквайки с десния бутон върху иконата на VNC в системната област, видях меню с магическите букви EXIT. За съжаление писмата бяха написани със сив контурен текст. Администраторът е деактивирал елемента от менюто „Изход“ чрез редактора на групови правила. Опитах се да убия процеса от диспечера на задачите, но разбира се беше невидим за мен, защото се изпълняваше под различен, по-привилегирован акаунт. Не се получи.

VNC сървърът работи на TCP порт 5900, сетих се. Следващият ми план беше да изпратя повредени пакети към този порт, за да го срина.

Прекарах поне няколко дни в бърникане с протокола, изпращайки различни форми на добре структурирани глупости до порт 5900 и надявайки се, че ще се повреди. В крайна сметка и това не проработи.

Вече започнах да си мисля, че няма да мога да се отърва от това нещо, когато изведнъж ми просветна: там трябва да има прозорец! Трябва да го покажем. Може би ще има хубав сочен бутон „Изключване на звука“, който мога да използвам чудесно!

Изпълних моя вече почти перфектен C код, за да намеря манипулатора на главния прозорец на друг процес - и със сигурност VNC беше намерен. Чувствах се вдъхновен, когато пръстите ми пишеха WM_SHOWWINDOW. Опитайте се да познаете какво видях пред себе си?

Нищо!

Сега ми стана любопитно... имаше прозорец, но игнорираше съобщенията ми. Проверих два пъти кода си, за да се уверя, че работи. Тествах го на няколко други процеса и работи страхотно. Опитах се да изпратя други съобщения до прозореца на VNC и пак нищо.

И тогава пак ми просветна!

Благодарение на много дебелите книгата Charles Petzold Проучих внимателно как работят процесите Win32 вътре в системата. Всяко Win32 приложение има прозорец, както и "опашка за съобщения". Съобщенията, задействани от взаимодействието на потребителя, както и съобщенията, изпратени от самия Windows, пристигат на опашка и самото приложение решава как да ги обработи.

Не е много интересно само по себе си. Но когато разбрах, че достатъчно голяма необработена опашка от съобщения действа като евристика за Window Process Manager да се намеси в застоял процес, започнах да отделям чист серотонин.

Без да губя нито секунда, се върнах към моя C код, подготвяйки се да изпратя друго съобщение до главния прозорец на VNC WM_SHOWWINDOW. В цикъл. Вечен. И така, много съобщения. WM_SHOWWINDOW, което сега знаех, че VNC ще се опита да игнорира напълно... на свой риск.

Компилирах и пуснах 4KB от най-свободолюбивия код в живота ми. След около три секунди Windows съобщи, че процесът vncserver.ехе не отговаря и направи оферта, на която просто не можех да откажа:

Искате ли да завършите този процес?

ПО ДЯВОЛИТЕ ДА!

Нека си призная, че през останалата част от деня бях непоносимо доволен от себе си.

След няколко часа, прекарани в смилане на новата ми суперсила, реших как ще я използвам. Беше твърде лесно просто да убия сесията точно пред него. Имах по-добра идея - да изчезна напълно.

След бойно кръщение с програмиране на сокет Разбрах, че мога да напиша код, който ще направи две неща. Първо ще заеме наскоро освободения TCP порт 5900, зает преди това от безсмисления VNC сървърен процес. След това ще създаде нова TCP връзка към VNC сървъра на посочената машина. Кодът просто ще проксира всички данни между двата сокета и Columbo ще си помисли, че се свързва с мен, докато всъщност ще се свързва към напълно различен VNC сървър.

Моят код ще действа като таен мост между мен и някоя друга бедна душа по мой избор. Беше прекрасно.

Веднага започнах да пиша моя фалшив VNC мост. Columbo се свърза с мен няколко пъти, но аз продължих да програмирам пред него. Стигнах до заключението, че той няма представа какво правя, въпреки че написах очевидни неща като номера на портове и коментари като // Прощай, жуткий шпион VNC.

След няколко дни не можах да накарам кода да работи правилно. За да влоша нещата, работех почти непрекъснато с черната икона на VNC в системната област. Докато беше свързан, не можах да освободя порта, за да тествам кода си.

Ако знаех тогава netcat!

Накрая нервите ми не издържаха, все пак бях нетърпелив 17-годишен. Гледайки как бялата икона на VNC сървър отново става черна, аз се изплаших, отворих оригиналния код, който попълваше опашката със съобщения, и го пуснах пред очите му. Дори изчаках няколко секунди, преди да щракна End Process, само за да се уверя, че го е видял.

Ако натискането на този бутон не ме убеди напълно, че си заслужава, то това, че той изскочи иззад крепостта си от монитори, за да се приближи бързо до мен и да ме изведе от стаята, със сигурност го направи.

В резултат на това бях забранен от мрежата за две седмици. Справедливо наказание, помислих си. След около три седмици VNC сървърът изчезна от скриптовете за зареждане и никога не се появи никъде другаде. Никога не разбрах дали моят инцидент е изиграл някаква роля в това или не, но той напълно съсипа плана ми да стана баснословно богат, като продам пистолета си VNC на депресирани студенти в компютърните зали на колежа в цялата страна.

Източник: www.habr.com

Добавяне на нов коментар