Бітва кодэраў: я супраць таго хлопца з 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

Дадаць каментар