Битва кодерів: я проти того хлопця з 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 у системному треї став чорним. Це означало, що тепер він спостерігає за мною.

Я продовжував кодувати як завжди, намагаючись не звертати на нього уваги. Тим часом, машина почала безпосередньо підгальмовувати, намагаючись передати максимальну частоту кадрів на один із незліченних моніторів у кутку кімнати. Вінда майже перестала реагувати, коли мій терпець урвався, я вийшов із системи і закінчив на сьогодні.

Під час наступних візитів до комп'ютерної зали Коломбо майже щоразу виявляв цікавість до того, чим я займаюся. Приблизно після четвертого разу я вирішив: із цим треба щось робити.

Припускаю, що розумна, раціональна людина могла просто порушити це питання безпосередньо з нею або її начальником. Однак я завжди піддавався спокусі і швидко вмовив себе обрати зовсім іншу стратегію.

- Ти нічого не зможеш зробити без цього сервера VNC! — спокійно рішуче сказав я собі кілька разів.

Потрібно було вбити VNC.

Я почав входити до комп'ютерної зали з великими групами студентів і сідати якнайдалі від кута з моніторами. Якийсь час це працювало і дало мені трохи часу на перевірку ідей.

Моя перша спроба, я думаю, ви погодитеся, була досить слабкою. Клацнувши правою кнопкою миші по значку VNC у системному треї, я побачив меню з чарівними літерами EXIT. На жаль, літери були написані сірим текстом. Адміністратор вимкнув пункт меню "Вихід" через редактор групової політики. Я спробував убити процес із Диспетчера завдань, але, звичайно, він був невидимий для мене, оскільки працював під іншим, більш привілейованим обліковим записом. Нічого не вийшло.

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.ехе не відповідає, і зробила пропозицію, від якої я просто не міг відмовитися:

Ви хочете завершити цей процес?

Чорт забирай, ТАК!

Дозвольте зізнатися, що решту дня я був нестерпно задоволений собою.

Після кількох годин, витрачених на перетравлення моєї нової суперсили, я вирішив, як її використовуватиму. Просто вбити сеанс прямо в нього на очах було дуже просто. Я мав ідею краще — зникнути зовсім.

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

Мій код діятиме як таємний міст між мною та якоюсь іншою бідною душею на мій вибір. Це було прекрасно.

Я одразу почав писати свій підроблений бридж VNC. Коломбо кілька разів підключався до мене, але я програмував у нього на очах. Я дійшов висновку, що він не має поняття про мої дії, хоча я писав очевидні речі, такі як номери портів і коментарі на кшталт // Прощай, жуткий шпион VNC.

За кілька днів я ніяк не міг змусити код працювати правильно. Що ще гірше, я практично безперервно працював із чорним значком VNC у системному треї. Поки його було підключено, я не міг звільнити порт, щоб перевірити свій код.

Якби я тоді знав про netcat!

Зрештою нерви не витримали, все-таки я був нетерплячим 17-річним хлопцем. Знову спостерігаючи, як білий значок сервера VNC стає чорним, я психанул, відкрив початковий код, який заповнював чергу повідомлень, і запустив на очах. Я навіть зачекав пару секунд, перш ніж натиснути End Processпросто переконатися, що він бачив.

Якщо натискання цієї кнопки ще не повністю переконало мене, що воно того варте, то його стрибок через свою фортецю моніторів, щоб швидко підійти до мене і вивести мене з кімнати, безумовно, вартував того.

У результаті мені заборонили доступ до мережі на два тижні. Справедливе покарання, подумав я. Приблизно за три тижні сервер VNC зник із завантажувальних скриптів і більше ніде не з'являвся. Я так і не дізнався, чи мій інцидент зіграв якусь роль у цьому чи ні, але він повністю зруйнував мій план казкового збагачення на продажі своєї гармати VNC пригніченим студентам у комп'ютерних залах коледжів по всій країні.

Джерело: habr.com

Додати коментар або відгук