Битка на кодерите: аз срещу онзи тип с VNC

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

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

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

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

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

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

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

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

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

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

След като наточих уменията си на Бейсик и C64, сега пишех на C и дори малко на C++. Тогава се заинтересувах от езика D, който поправяше някои недостатъци на C++, каквито ги виждах тогава.

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

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

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

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

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

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

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

Трябваше да убия VNC.

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

Моята първа опит, мисля, че ще се съгласите, беше доста слаба. Като кликнах с десния бутон на мишката върху иконата на VNC в системния трей, видях меню с вълшебните букви E-X-I-T. За съжаление, буквите бяха написани със сив контурен текст. Администраторът е деактивирал опцията 'Изход' чрез редактора на групова политика. Опитах се да убия процеса от Диспечера на задачите, но, разбира се, той беше невидим за мен, тъй като работеше под друга, по-привилегирована учетна запись. Нищо не стана.

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

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

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

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

Нищо!

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

И изведнъж ме осени отново!

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

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

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

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

Искате ли да приключите този процес?

По дяволите, ДА!

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

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

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

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

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

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

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

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

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

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

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

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster