Кодерын тулаан: Би тэр VNC залуугийн эсрэг

В энэ блог Нэлээд хэдэн программистуудын үлгэрүүд хэвлэгдсэн. Би хуучин тэнэг зүйлсээ эргэн дурсах дуртай. За, бас нэг ийм түүх энд байна.

Би анх 11 настай байхдаа компьютер, тэр дундаа програмчлалыг сонирхож эхэлсэн. Ахлах сургуулийн эхэнд боБи чөлөөт цагаараа ихэнх цагаа C64-тэй эргэлзэж, BASIC бичих, дараа нь хайчаар муу кодыг хайчлахад зарцуулсан. Би тоглоогүй ээ, хайч.

Их Британийн хүүхдүүд сургуулиа төгсөөд (ойролцоогоор 16 настай) ихэвчлэн коллежид явдаг бөгөөд их сургуульд орохоосоо өмнө гурав, дөрвөн хичээлийг сонгон суралцдаг. Би гэртээ шаргал хайрцаг, дуу хураагуурт дуртай байсан тул коллежид "компьютерийн шинжлэх ухаан"-д суралцах нь зөв сонголт гэж шийдсэн.

Хичээл хүлээж байснаас ч илүү таалагдсан; Тэнд би анх Паскаль, Делфи нартай уулзсан.

Хичээлийн завсарлагааны үеэр оюутнууд компьютерийн өрөөнд ямар ч үнэгүй машин дээр ажиллах боломжтой. Төсөөлөөд үз дээ: зуу орчим хүнд зориулагдсан асар том өрөө, системийн нэгж дээр монитор байрладаг шиг машинуудаар дүүргэсэн ширээнүүдтэй. Фенүүд нь байнга шуугиж, хулганы бөмбөгүүд ширээн дээр шуугиж, нэг секунд ч зогсохгүй. 50-100 дааврын өсвөр насны хүүхэд хэдэн зуун Pentium III чипийг хөргөхийн тулд үе үе солигдож байгаа мэт хачин үнэр агаарт байна.

Эрүүл мэндийн хувьд эрсдэлтэй байсан ч чөлөөт цаг гарвал би компьютерийн ард суух дуртай байсан.

Өрөөний жижүүр админ нь намхан, дунд эргэм насны эр байсан бөгөөд муу дарангуйлагч болох гэж ханашгүй хүсэлдээ автан энэ дүрд сонгогджээ. Би тийм гэж бодъё. Албан үүргээ гүйцэтгэсэн нь дутуу хэлсэн, тэр залуу ажилдаа үнэхээр дуртай байсан. Сургуулийн компьютерийг хэн ч зохисгүй зүйлд ашиглахгүй байхын тулд түүнд дэг журам сахиулах үүрэг өгсөн.

Өнөөдрийг хүртэл миний зөн совин надад админы урамшуулал нь түүний гараас барьж, компьютерийн өрөөнөөс гаргасан оюутнуудын тооноос шууд хамаардаг гэж хэлдэг. Энэ залуу орон сууцны зээлээ эрт төлсөн гэдэгт итгэлтэй байна.

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

Тухайн үед компьютерийн сүлжээ нь Windows 2000 үйлдлийн системтэй байсан. Удалгүй би системд нэвтрэх болгондоо ширээний компьютерт алсаас хандахын тулд администраторын бүртгэлээс VNC серверийг эхлүүлэхийг заасан скрипт ажиллуулдаг болохыг олж мэдсэн. Энэ залуу таныг тагнахыг хүсэх болгондоо таны машинтай шууд холбогдож хардаг байсан. Энэ нь аймшигтай байсан бөгөөд одоо бодоход хууль бус юм болов уу.

BASIC болон C64 дээр шүдээ зүссэн би одоо C, бүр бага зэрэг C++ дээр бичдэг. Тэр үед би C++-ийн зарим дутагдлыг зассан D хэлийг маш их сонирхож байсан, тэр үед харсан.

Би компьютерийн өрөөнд орж D дээр ямар нэгэн шинэ зүйл уншиж эсвэл Digital Mars D хөрвүүлэгчтэй тоглодог байсан.Заримдаа D-ийн агуу ирээдүйн талаар бодохоос сатаарч байхдаа бусад Win32 программуудыг цонхоор нь хакердахын тулд С код бичдэг байсан. бариул.

Хуучин 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-ийн үндсэн цонх руу өөр зурвас илгээхээр бэлдлээ. WM_SHOWWINDOW. Цикл дотор. Мөнхийн. Тиймээс, маш олон мессеж. WM_SHOWWINDOW, VNC үүнийг бүрмөсөн үл тоомсорлохыг би одоо мэдэж байсан ... эрсдэлтэй.

Би амьдралынхаа хамгийн эрх чөлөөнд дуртай 4KB кодыг эмхэтгэж ажиллуулсан. Гурван секундын дараа Windows энэ үйл явцыг мэдээлэв vncserver.ехе хариу өгөхгүй, би татгалзаж чадахгүй гэсэн санал тавьсан:

Та энэ үйл явцыг дуусгахыг хүсч байна уу?

ТАМЫН ТИЙМ!

Үлдсэн хугацаанд би өөртөө тэвчихийн аргагүй сэтгэл хангалуун байснаа хүлээн зөвшөөрье.

Хэдэн цагийн турш шинэ хүчээ шингээж авсны дараа би үүнийг хэрхэн ашиглахаа шийдсэн. Түүний өмнө хуралдааныг зүгээр л алах нь дэндүү амархан байсан. Надад илүү сайн санаа байсан - бүрмөсөн алга болно.

дараа залгуур програмчлалын хамт галын баптисм Би хоёр зүйлийг хийх код бичиж чадна гэдгээ ойлгосон. Энэ нь эхлээд VNC серверийн процессоор ажиллаж байсан шинээр чөлөөлөгдсөн 5900 TCP портыг эзлэх болно. Дараа нь энэ нь заасан машины VNC серверт шинэ TCP холболт үүсгэнэ. Код нь ердөө л хоёр залгуурын хоорондох бүх өгөгдлийг прокси хийх бөгөөд Колумб өөрийгөө надтай холбогдож байна гэж бодох боловч үнэндээ огт өөр VNC серверт холбогдох болно.

Миний код намайг болон миний сонгосон ядуу сүнсний хооронд нууц гүүр болж ажиллах болно. Гайхалтай байсан.

Би шууд л хуурамч VNC гүүрээ бичиж эхлэв. Коламбо надтай хэд хэдэн удаа холбогдсон ч би түүний өмнө программ хийсээр байсан. Би портын дугаар, сэтгэгдэл гэх мэт тодорхой зүйлийг бичсэн ч тэр миний юу хийж байгааг мэдэхгүй байна гэсэн дүгнэлтэд хүрсэн. // Прощай, жуткий шпион VNC.

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

Хэрэв би тэр үед мэдсэн бол netcat!

Эцэст нь миний мэдрэл унав, эцэст нь би 17 настай тэвчээргүй залуу байсан. Цагаан VNC серверийн дүрс дахин хар болж байгааг хараад би сандарч, мессежийн дарааллыг дүүргэсэн анхны кодыг нээж, түүний нүдний өмнө гүйлгэсэн. Би бүр дарахаас өмнө хэдэн секунд хүлээсэн End Process, зүгээр л тэр үүнийг харсан гэдэгт итгэлтэй байхын тулд.

Хэрэв тэр товчлуурыг дарах нь үнэ цэнэтэй гэдэгт бүрэн итгүүлж чадаагүй бол тэр мониторуудын цайзныхаа араас үсрэн над руу хурдан ойртож, намайг өрөөнөөс гаргах нь гарцаагүй.

Үүний үр дүнд би хоёр долоо хоногийн турш сүлжээнд орохыг хориглов. Шударга шийтгэл гэж би бодлоо. Гурван долоо хоногийн дараа VNC сервер ачаалах скриптүүдээс алга болж, өөр хаана ч гарч ирээгүй. Миний үйл явдал үүнд ямар нэгэн үүрэг гүйцэтгэсэн эсэхийг би хэзээ ч мэдэхгүй байсан ч улс даяар коллежийн компьютерийн танхимд сэтгэлээр унасан оюутнуудад VNC буугаа зарж гайхалтай баяжих төлөвлөгөөг минь бүрмөсөн сүйрүүлсэн.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх