Coder Battle: Me vs. That VNC Guy

В бул блог Бир нече программист жомоктор жарыяланган. Мен мурунку келесоо нерселеримди эстегенди жакшы көрөм. Мына ушундай дагы бир окуя.

Мен биринчи жолу компьютерге, өзгөчө программалоого 11 жашымда кызыгып калдым. Орто мектептин башталышында боМен бош убактымдын көбүн C64 менен иштөөгө жана BASIC жазууга, анан кайчы менен жаман кодду кесип салууга жумшадым. Мен тамашалап жаткан жокмун, кайчы.

Мектептен кийин (болжол менен 16 жашта) британиялык балдар, адатта, колледжге барышат, алар университетке барар алдында үч же төрт предметти үйрөнүүнү тандашат. Үйдөгү беж кутуга жана магнитофонго болгон сүйүүмдү эске алып, мен колледжде «компьютер илимин» окууну туура тандоо деп чечтим.

Курс мен күткөндөн да көбүрөөк жакты; Паскаль менен Делфи менен биринчи жолу ошол жерден тааныштым.

Сабактардын ортосундагы тыныгууларда студенттер компьютер бөлмөсүндөгү каалаган акысыз машинада иштей алышат. Элестетиңиз: системалык блокто монитор тургандар сыяктуу, машиналар менен толтурулган столдор менен жүзгө жакын кишиге ылайыкталган чоң бөлмө. Күйөрмандар тынымсыз ызылдап, чычкан топтору столдордо бир секунд да токтобой ызылдап турат. 50-100 гормоналдык өспүрүмдөр жүздөгөн Pentium III чиптерин муздатуу үчүн мезгил-мезгили менен алмашып тургандай, абада кызык жыт бар.

Ден соолукка коркунуч болгонуна карабай, бош убактым болгондо компьютерде отурганды жакшы көрчүмүн.

Бөлмөдө нөөмөттө турган админ кыска бойлуу, орто бойлуу адам болгон, ал жаман диктатор болгусу келген тойбогон каалоосунан улам бул ролго тандалган. Мен ошондой деп ойлойм. Нөөмөттө - бул азыраак; жигит өз ишин чындап сүйчү. Ал мектеп компьютерин эч ким туура эмес нерсеге колдонбоосу үчүн тартипти сактоого милдеттендирилген.

Ушул күнгө чейин менин интуициям администратордун бонусу анын колунан кармап, компьютер бөлмөсүнөн алып чыккан студенттердин санына түздөн-түз көз каранды экенин айтат. Мен бул жигит ипотекасын эрте төлөп бергенине толук ишенем.

Ал компьютер бөлмөсүнүн эң четки бурчунда, бурчтагы столдо отурду. Ал эми анын төрөткө байкоочулары таасирдүү кыска кош бойлуулук мезгили менен көбөйүү жолун тапты деп ишенүүгө болот, алардын саны абдан көп болчу. Алардын баарын эсепке алганга анын чындап эле убактысы барбы деген суроо туулат. Албетте, тамашалап жатам... анын ишине өтө олуттуу мамиле кылганын айттымбы?

Ошол учурда компьютер тармагы Windows 2000 менен иштеп жаткан. Мен көп өтпөй мен системага кирген сайын VNC серверин иш тактасына алыстан жетүү үчүн администратордун эсебинен баштоону белгилеген скрипт ишке киргенин билдим. Бул жигит сени аңдыгысы келген сайын, ал түздөн-түз сиздин машинаңызга туташып, карап турган. Бул үрөй учурарлык болчу, азыр ойлосом, балким, мыйзамсыз.

BASIC жана C64 тилдеринде тиштеримди кесип, мен азыр C жана бир аз C++ тилинде жаздым. Ал кезде мен дагы деле ошол кезде көргөндөй C++ тилинин кээ бир кемчиликтерин оңдогон D тилине абдан кызыгам.

Мен компьютер бөлмөсүнө кирип, D боюнча жаңы нерсени окуп же Digital Mars D компилятору менен ойночумун.Кээде D программасынын улуу келечеги жөнүндө ойлонууга алаксып жатканда, мен алардын терезеси аркылуу башка Win32 программаларын бузуш үчүн C кодун жаздым. туткалар.

Win32 программалоонун жакшы күндөрүндө, терезе туткасын табуу башка программаларды бузуп алуунун эң оңой ыкмасы болгон. Албетте, Windowsтун бардык GUI программалары экранда көрүнбөсө дагы, терезеси болгон. Башка процесстин туткасын алуу үчүн программа жазуу менен (негизинен ага шилтеме), сиз ага билдирүүлөрдү жөнөтө аласыз. Бул программанын терезесин жашыруу/көрсөтүү сыяктуу кээ бир негизги операцияларга, ошондой эле процессти эс тутум мейкиндигине ыктыярдуу DLL жүктөөгө жана кодду ишке ашырууга мажбурлоо сыяктуу эң сонун нерселерди аткарууга мүмкүндүк берди. DLL инъекциясынан кийин көңүл ачуу башталды.

Биринчи бир жарым айда бул детектив мени көп деле түйшөлткөн жок, ал менин машинамдагы VNC серверине бир же эки жолу гана туташты. Бирок бир сессия анын кызыгуусун жаратышы мүмкүн. Мен класста ойноону жеңилдетүү үчүн Minesweeper терезелерин жашыруу үчүн (аларды жаппастан) C кодун жазып жатып, системалык тактадагы ак VNC сөлөкөтү кара болуп калганын байкадым. Бул анын азыр мени карап турганын билдирген.

Мен ага көңүл бурбаганга аракет кылып, адаттагыдай эле коддоону уланттым. Ошол эле учурда, аппарат бөлмөнүн бурчундагы сансыз мониторлордун бирине максималдуу кадр ылдамдыгын берүүгө аракет кылып, жайлай баштады. Windows дээрлик жооп бербей калды, чыдамым түгөнгөндө, мен чыгып, бир күндү бүтүрдүм.

Компьютердик бөлмөгө кийинки сапарларында Коломбо менин дээрлик ар бир жолу эмне кылып жатканыма абдан кызыкчу. Төртүнчү жолудан кийин мен чечтим: бул тууралуу бир нерсе кылышым керек.

Мен мойнума алам, эстүү, эстүү адам бул маселени түз эле өзүнө же жетекчисине көтөрсө болмок. Бирок, мен ар дайым азгырыктарга берилип, бат эле башка стратегияны кабыл алуу үчүн өзүмдү сүйлөштүм.

- Бул VNC серверисиз эч нерсе кыла албайсыз! — деп бир нече жолу тынч жана чечкиндуу айттым.

Бул VNC өлтүрүү керек болчу.

Мен студенттердин чоң топтору менен компьютер бөлмөсүнө кирип, мониторлор менен бурчтан алысыраак отура баштадым. Бул бир аз убакыт иштеп, идеяларды сынап көрүү үчүн мага бир аз убакыт берди.

Менин биринчи аракетим, сиз макул болосуз деп ойлойм, алсыз болду. Системалык тактадагы VNC сөлөкөтүн оң баскыч менен чыкылдатып, мен EXIT сыйкырдуу тамгалары бар менюну көрдүм. Тилекке каршы, тамгалар боз контур текстинде жазылган. Администратор "Чыгуу" меню пунктун Топтук саясат редактору аркылуу өчүрүп койгон. Мен процессти Тапшырма башкаргычынан өлтүрүүгө аракет кылдым, бирок, албетте, ал мага көрүнбөй калды, анткени ал башка, артыкчылыктуу аккаунтта иштеп жаткан. Андан майнап чыккан жок.

VNC сервери TCP 5900 портунда иштейт, мен эстедим. Менин кийинки планым бул портко бузулган пакеттерди жөнөтүү болчу, аны кыйратыш үчүн.

Мен жок дегенде бир нече күн протоколду иштеп чыгууга жумшадым, 5900 портуна ар кандай формадагы жакшы структурланган шылдыңдарды жөнөтүп, ал бузулат деп үмүттөндүм. Акыр-аягы, бул да ишке ашкан жок.

Мен бул нерседен кутула албайм деп ойлой баштаган элем, капысынан мага таң калып: ал жерде терезе болсо керек! Биз аны көрсөтүшүбүз керек. Балким, ал жакшы ширелүү "Үнсүз" баскычына ээ болот, мен аны жакшы колдоном!

Мен башка процесстин негизги терезесинин туткасын табуу үчүн дээрлик кемчиликсиз C кодумду иштеттим - жана албетте, VNC табылды. Манжаларым тергенде мен шыктандым WM_SHOWWINDOW. Менин алдымда эмне көргөнүмдү болжолдоого аракет кылыңызчы?

Эч нерсе!

Эми кызыгып калдым... анын терезеси бар экен, бирок менин билдирүүлөрүмө көңүл бурбай жатты. Мен анын иштешине ынануу үчүн кодумду эки жолу текшердим. Аны бир нече башка процесстерде сынап көрдүм жана ал сонун иштеди. Мен VNC терезесине башка билдирүүлөрдү жөнөтүүгө аракет кылдым, бирок эч нерсе болгон жок.

Анан кайра мага таң калды!

Чоң рахмат китеп Чарльз Петцольд Мен Win32 процесстери системанын ичинде кантип иштээрин кылдат изилдеп чыктым. Ар бир Win32 тиркемесинде терезе жана "билдирүү кезеги" бар. Колдонуучунун өз ара аракетинен улам пайда болгон билдирүүлөр, ошондой эле Windows өзү жөнөткөн билдирүүлөр кезекке келип, аларды кантип иштетүүнү тиркеме өзү чечет.

Өзү абдан кызыктуу эмес. Бирок мен жетиштүү чоң иштелбеген билдирүү кезеги Терезе процессинин менеджери илинип турган процесске кийлигишүү үчүн эвристикалык ролду аткарганын түшүнгөндө, мен таза серотонинди тердей баштадым.

Бир секунданы текке кетирбестен, мен негизги VNC терезесине дагы бир билдирүү жөнөтүүгө даярданып, C кодума кайтып келдим. WM_SHOWWINDOW. Циклде. Түбөлүк. Ошентип, көп билдирүүлөр. WM_SHOWWINDOW, мен азыр VNC толугу менен көрмөксөнгө салууга аракет кыларын билген... анын коркунучу астында.

Мен жашоомдогу эң эркиндикти сүйгөн 4KB кодду түздүм жана иштеттим. Болжол менен үч секунддан кийин Windows бул процессти билдирди vncserver.ехе жооп бербейт жана мен жөн эле баш тарта албаган сунуш киргизди:

Бул процессти аягына чыгаргыңыз келеби?

ООБА!

Мойнума алайын, калган күнү мен өзүмө чыдагыс ыраазы болдум.

Бир нече сааттан кийин өзүмдүн жаңы күчүмдү сиңирип алгандан кийин, мен аны кантип колдонууну чечтим. Анын алдында сессияны жөн эле өлтүрүү өтө оңой эле. Менде жакшыраак идея бар болчу - таптакыр жок болуп кетүү.

кийин розетка программалоо менен отко чөмүлтүлүү Мен эки нерсени кыла турган код жаза аларымды түшүндүм. Ал адегенде жаңыдан бошотулган 5900 TCP портун ээлейт, буга чейин түшүнүксүз VNC сервер процесси ээлеген. Андан кийин ал көрсөтүлгөн машинанын VNC серверине жаңы TCP байланышын түзөт. Код эки розетка ортосундагы бардык маалыматтарды проксидейт жана Колумбо мени менен туташып жатат деп ойлойт, чындыгында ал таптакыр башка VNC серверине туташат.

Менин кодум мени менен мен тандаган башка кедей жандын ортосунда жашыруун көпүрө болот. Бул сонун болду.

Мен дароо эле жасалма VNC көпүрөмдү жаза баштадым. Коламбо мага бир нече жолу кошулду, бирок мен анын алдында программалоону уланттым. Мен порт номерлери сыяктуу ачык-айкын нерселерди жазсам да, ал менин эмне кылып жатканымды билбейт деген тыянакка келдим. // Прощай, жуткий шпион VNC.

Бир нече күндөн кийин кодду туура иштете алган жокмун. Андан да жаманы, мен тутумдук тактадагы кара VNC сөлөкөтү менен дээрлик үзгүлтүксүз иштеп жаттым. Ал туташып турганда, мен кодумду текшерүү үчүн портту коё алган жокмун.

Эгер ошондо билсем netcat!

Акыры нервим бузулду, мен 17 жаштагы чыдамсыз жигит болчумун. Ак VNC серверинин сөлөкөтүнүн кайра кара болуп калганын көрүп, мен чочуп кеттим, билдирүү кезегин толтурган баштапкы кодду ачып, анын көз алдында чуркадым. Мен чыкылдатуудан мурун бир нече секунд күттүм End Process, жөн гана аны көргөнүнө ынануу үчүн.

Эгерде бул баскычты басуу мени бул татыктуу экенине толук ишендирбесе, анда ал өзүнүн мониторлорунун аркасынан секирип, мага тез жакындап, мени бөлмөдөн чыгарды.

Жыйынтыгында эки жумага тармакка кирүүгө тыюу салынды. Адилет жаза, деп ойлодум. Болжол менен үч жумадан кийин, VNC сервери жүктөө скрипттеринен жок болуп, башка эч жерде көрүнгөн жок. Бул окуяда менин окуямдын кандайдыр бир ролу бар же жокпу, мен эч качан билген эмесмин, бирок бул менин VNC куралымды өлкө боюнча колледждердин компьютердик залдарында депрессияга кабылган студенттерге сатып, укмуштуудай байып кетүү планымды толугу менен бузуп салды.

Source: www.habr.com

Комментарий кошуу