В публикувани са доста програмистки анекдоти. Харесва ми да си спомням за старите си глупости. Е, ето още една такава приказка.
За първи път се заинтересувах от компютри, особено програмиране, когато бях около 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-годишен. Отново наблюдавайки как белата икона на VNC сървъра става черна, избухнах, отворих началния код, който запълваше опашката за съобщения, и го стартирах пред очите му. Даже изчаках няколко секунди, преди да натисна End Process, просто за да съм сигурен, че го вижда.
Ако натискането на този бутон още не ме беше убедиило напълно, че бе си струвало, то скачането му от неговата крепост от монитори, за да се приближи бързо до мен и да ме изгони от стаята, определено струваше.
В крайна сметка ми забраниха достъпа до мрежата за две седмици. Справедливо наказание, помислих си. Около три седмици по-късно сървърът VNC изчезна от стартовите скриптове и не се появи никъде повече. Никога не узнах дали инцидентът ми е изиграл роля в това или не, но той напълно разруши моя план за фантастично обогатяване чрез продажбата на VNC оръжия на потиснати студенти в компютърните зали на колежи из цялата страна.
Източник: habr.com
