Coder Battle: Me vs. That VNC Guy

В این وبلاگ تعداد کمی از داستان های برنامه نویس منتشر شده است. دوست دارم چیزهای احمقانه قدیمی ام را به یاد بیاورم. خب، در اینجا یک چنین داستان دیگری وجود دارد.

من برای اولین بار در حدود 11 سالگی به کامپیوتر به خصوص برنامه نویسی علاقه مند شدم. در ابتدای دبیرستان بоبیشتر اوقات فراغت خود را صرف سرهم کردن با C64 و نوشتن BASIC کردم، سپس کدهای بد را با قیچی حذف کردم. شوخی نمیکنم قیچی.

پس از مدرسه (در حدود سن 16 سالگی)، کودکان بریتانیایی معمولاً به کالج می روند، جایی که قبل از رفتن به دانشگاه سه یا چهار موضوع را انتخاب می کنند. با توجه به علاقه‌ام به جعبه بژ و ضبط صوت در خانه، به این نتیجه رسیدم که تحصیل در رشته علوم کامپیوتر در کالج انتخاب درستی است.

من از این دوره بیشتر از آنچه انتظار داشتم لذت بردم. آنجا برای اولین بار با پاسکال و دلفی آشنا شدم.

در زمان استراحت بین کلاس ها، دانش آموزان می توانستند روی هر دستگاه رایگانی در اتاق کامپیوتر کار کنند. تصور کنید: یک اتاق بزرگ که برای حدود صد نفر طراحی شده است، با ردیف هایی از میزها پر از ماشین ها، مانند میزهایی که مانیتور روی واحد سیستم قرار دارد. هواداران دائماً زمزمه می کنند، توپ های موش روی میزها وزوز می کنند و لحظه ای متوقف نمی شوند. بوی عجیبی در هوا به مشام می رسد، انگار 50 تا 100 نوجوان هورمونی به طور دوره ای تغییر می کنند تا صدها تراشه پنتیوم III را خنک کنند.

با وجود خطرات سلامتی، دوست داشتم وقتی یک دقیقه رایگان داشتم پشت کامپیوتر بنشینم.

ادمین وظیفه در اتاق مردی کوتاه قد و میانسال بود که به دلیل اشتیاق سیری ناپذیرش برای تبدیل شدن به یک دیکتاتور شیطانی برای این نقش انتخاب شد. من هم همینطور فکر میکنم. در حال انجام وظیفه یک دست کم گرفتن است؛ آن مرد واقعاً کار خود را دوست داشت. او وظیفه داشت نظم را حفظ کند تا کسی از رایانه مدرسه برای کار نامناسب استفاده نکند.

تا به امروز، شهود من به من می‌گوید که پاداش مدیر مستقیماً به تعداد دانش‌آموزانی بستگی دارد که او با دست آنها را گرفته و از اتاق کامپیوتر بیرون آورده است. من مطمئنم که این مرد وام مسکن خود را زودتر پرداخت کرده است.

او در گوشه دور اتاق کامپیوتر پشت میز گوشه ای نشست. و با اطمینان می‌توان فرض کرد که مانیتورهای باروری او راهی برای تولیدمثل با یک دوره بارداری بسیار کوتاه پیدا کرده‌اند، تعداد زیادی از آنها وجود دارد. فقط می توان تعجب کرد که آیا او واقعاً وقت دارد تا همه آنها را پیگیری کند. البته شوخی می کنم... گفتم که کارش را خیلی جدی گرفته؟

در آن زمان، شبکه کامپیوتری ویندوز 2000 را اجرا می کرد. به زودی متوجه شدم که هر بار که وارد سیستم می شدم، اسکریپتی راه اندازی می شد که مشخص می کرد سرور VNC را از حساب مدیر برای دسترسی از راه دور به دسکتاپ راه اندازی می کرد. هر وقت این مرد می خواست از شما جاسوسی کند، مستقیماً به دستگاه شما وصل می شد و تماشا می کرد. وحشتناک بود، و حالا که به آن فکر می کنم، احتمالاً غیرقانونی است.

با بریدن دندان هایم روی BASIC و C64، اکنون به C و حتی کمی C++ نوشتم. در آن زمان من هنوز علاقه زیادی به زبان D داشتم که برخی از کاستی های C++ را همانطور که در آن زمان دیدم اصلاح کرد.

من به اتاق کامپیوتر می رفتم تا چیز جدیدی را در D بخوانم یا با کامپایلر Digital Mars D بازی کنم. گاهی اوقات، در حالی که از فکر کردن به آینده عالی D منحرف می شدم، کد C می نوشتم تا سایر برنامه های Win32 را از طریق پنجره آنها هک کنم. دسته ها

در روزهای خوب برنامه نویسی Win32، یافتن دسته پنجره ساده ترین روش برای هک کردن برنامه های دیگر بود. بدیهی است که همه برنامه های رابط کاربری گرافیکی در ویندوز دارای یک پنجره بودند، حتی اگر روی صفحه ظاهر نمی شد. با نوشتن یک برنامه برای بازیابی یک دسته به یک فرآیند دیگر (در اصل یک پیوند به آن)، می توانید پیام هایی را برای آن ارسال کنید. این امکان انجام برخی عملیات اساسی مانند پنهان کردن/نمایش یک پنجره برنامه و همچنین موارد بسیار جالبی مانند مجبور کردن یک فرآیند برای بارگذاری یک DLL دلخواه در فضای حافظه و شروع اجرای کد را فراهم کرد. بعد از تزریق DLL، سرگرمی شروع شد.

در یک ماه و نیم اول، این کارآگاه خیلی من را اذیت نکرد، فقط یکی دو بار به سرور VNC دستگاه من متصل شد. اما یک جلسه خاص ممکن است علاقه او را برانگیخته باشد. داشتم مقداری کد C می نوشتم تا پنجره های Minesweeper را پنهان کنم (بدون بستن آنها) تا بازی در کلاس راحت تر شود که متوجه شدم نماد سفید VNC در سینی سیستم سیاه شده است. این بدان معنی بود که او اکنون مرا تماشا می کرد.

من طبق معمول به کدنویسی ادامه دادم و سعی کردم او را نادیده بگیرم. در همین حین، دستگاه شروع به کند شدن کرد و سعی داشت حداکثر نرخ فریم را به یکی از مانیتورهای بیشمار گوشه اتاق منتقل کند. ویندوز تقریباً جواب نداد، وقتی صبرم تمام شد، از سیستم خارج شدم و آن روز را تمام کردم.

در بازدیدهای بعدی از اتاق کامپیوتر، کلمبو تقریباً هر بار به کارهایی که من انجام می‌دادم علاقه شدیدی نشان داد. بعد از تقریباً چهارمین بار، تصمیم گرفتم: باید کاری در این مورد انجام دهم.

من اعتراف می کنم که یک فرد منطقی و منطقی می توانست این موضوع را مستقیماً با او یا رئیسش مطرح کند. با این حال، من همیشه تسلیم وسوسه می‌شدم و به سرعت تصمیم می‌گرفتم تا استراتژی کاملاً متفاوتی را اتخاذ کنم.

- بدون این سرور VNC نمی توانید کاری انجام دهید! - چندین بار آرام و قاطع به خودم گفتم.

کشتن VNC لازم بود.

من با گروه های بزرگی از دانش آموزان شروع کردم به رفتن به اتاق کامپیوتر و تا حد امکان دورتر از گوشه با مانیتورها نشستم. این برای مدتی جواب داد و به من فرصت داد تا ایده ها را آزمایش کنم.

اولین تلاش من، فکر می کنم شما موافق باشید، بسیار ضعیف بود. با کلیک راست روی نماد VNC در سینی سیستم، منویی با حروف جادویی EXIT دیدم. متأسفانه، حروف با متن خاکستری نوشته شده بودند. مدیر مورد منوی "خروج" را از طریق ویرایشگر خط مشی گروه غیرفعال کرده است. من سعی کردم فرآیند را از Task Manager حذف کنم، اما البته برای من نامرئی بود زیرا تحت یک حساب کاربری متفاوت و دارای امتیاز بیشتر اجرا می شد. درست نشد.

به یاد آوردم سرور VNC روی پورت TCP 5900 اجرا می شود. برنامه بعدی من ارسال بسته های خراب به این پورت بود تا آن را خراب کنم.

من حداقل چند روز را صرف این پروتکل کردم و اشکال مختلفی از مزخرفات با ساختار خوب را به پورت 5900 فرستادم و امیدوار بودم که خراب شود. در نهایت، آن هم کار نکرد.

از قبل داشتم فکر می کردم که نمی توانم از شر این چیز خلاص شوم، که ناگهان به من رسید: باید یک پنجره وجود داشته باشد! ما باید آن را نمایش دهیم. شاید یک دکمه آبدار "بی صدا" داشته باشد که می توانم از آن به خوبی استفاده کنم!

من کد C تقریباً عالی خود را اجرا کردم تا دستگیره پنجره اصلی یک فرآیند دیگر را پیدا کنم - و مطمئناً VNC پیدا شد. وقتی انگشتانم تایپ کردند، احساس الهام گرفتم WM_SHOWWINDOW. سعی کنید حدس بزنید چه چیزی در مقابلم دیدم؟

هیچ چیز!

حالا کنجکاو شده بودم...پنجره داشت اما پیام های من را نادیده می گرفت. من کدم را دوباره چک کردم تا مطمئن شوم کار می کند. آن را روی چندین فرآیند دیگر تست کردم و عالی کار کرد. من سعی کردم پیام های دیگری را به پنجره VNC بفرستم، اما هنوز چیزی نیست.

و بعد دوباره به ذهنم رسید!

با تشکر از بسیار ضخیم کتاب چارلز پتزولد من به دقت نحوه عملکرد فرآیندهای Win32 در داخل سیستم را مطالعه کردم. هر برنامه Win32 یک پنجره و همچنین یک "صف پیام" دارد. پیام‌هایی که در اثر تعامل کاربر ایجاد می‌شوند، و همچنین پیام‌هایی که توسط خود ویندوز ارسال می‌شوند، در یک صف می‌رسند و خود برنامه تصمیم می‌گیرد که چگونه آنها را پردازش کند.

به خودی خود خیلی جالب نیست. اما وقتی متوجه شدم که یک صف پیام پردازش نشده به اندازه کافی بزرگ به عنوان یک اکتشافی برای مدیر فرآیند پنجره عمل می کند تا در یک فرآیند آویزان مداخله کند، شروع به عرق کردن سروتونین خالص کردم.

بدون اتلاف ثانیه، به کد C بازگشتم و آماده ارسال پیام دیگری به پنجره اصلی VNC شدم WM_SHOWWINDOW. در یک چرخه. ابدی. بنابراین، بسیاری از پیام ها. WM_SHOWWINDOW، که اکنون می دانستم که VNC سعی می کند کاملاً نادیده گرفته شود ... در خطر آن.

من 4 کیلوبایت آزادی خواهانه ترین کد زندگی ام را کامپایل و اجرا کردم. پس از حدود سه ثانیه، ویندوز این فرآیند را گزارش کرد vncserver.ехе پاسخ نمی دهد و پیشنهادی داد که من به سادگی نتوانستم رد کنم:

آیا می خواهید این فرآیند را تکمیل کنید؟

معلومه که آره!

اجازه دهید اعتراف کنم که در بقیه روز به طرز غیرقابل تحملی از خودم راضی بودم.

پس از چند ساعت صرف هضم ابرقدرت جدیدم، تصمیم گرفتم چگونه از آن استفاده کنم. خیلی آسان بود که فقط جلسه را درست جلوی او بکشد. من ایده بهتری داشتم - ناپدید شدن کامل.

پس از غسل تعمید آتش با برنامه نویسی سوکت متوجه شدم که می توانم کدی بنویسم که دو کار را انجام دهد. ابتدا پورت TCP 5900 که به تازگی آزاد شده است را اشغال می کند، که قبلاً توسط فرآیند سرور VNC بدون سرنخ اشغال شده بود. سپس یک اتصال TCP جدید به سرور VNC دستگاه مشخص شده ایجاد می کند. کد به سادگی تمام داده‌های بین دو سوکت را پراکسی می‌کند و Columbo فکر می‌کند که به من وصل می‌شود، در حالی که در واقع به یک سرور VNC کاملاً متفاوت متصل می‌شود.

کد من به عنوان یک پل مخفی بین من و یک روح فقیر دیگر که انتخاب می کنم عمل می کند. فوق العاده بود

من بلافاصله شروع به نوشتن پل VNC جعلی خود کردم. کلمبو چندین بار به من وصل شد، اما من جلوی او به برنامه نویسی ادامه دادم. من به این نتیجه رسیدم که او نمی داند من چه کار می کنم، حتی اگر چیزهای واضحی مانند شماره پورت و نظراتی مانند // Прощай, жуткий шпион VNC.

بعد از چند روز نتوانستم کد را درست کار کنم. بدتر از همه، من تقریباً به طور مداوم با نماد سیاه VNC در سینی سیستم کار می کردم. وقتی وصل بود، نتوانستم پورت را برای آزمایش کدم آزاد کنم.

اگه اون موقع میدونستم netcat!

بالاخره اعصابم خورد، بالاخره من یک پسر 17 ساله بی حوصله بودم. با تماشای سیاه شدن دوباره نماد سرور VNC سفید، ترسیدم، کد اصلی را که صف پیام را پر کرده بود باز کردم و آن را جلوی چشمان او اجرا کردم. حتی قبل از کلیک کردن، چند ثانیه صبر کردم End Process، فقط برای اینکه مطمئن شود آن را دیده است.

اگر فشار دادن آن دکمه کاملاً من را متقاعد نمی کرد که ارزشش را دارد، پس او که از پشت قلعه مانیتورهایش می پرید تا سریع به من نزدیک شود و من را از اتاق بیرون کند، مطمئناً این کار را می کرد.

در نتیجه دو هفته از حضور در شبکه محروم شدم. من فکر کردم یک مجازات عادلانه. پس از حدود سه هفته، سرور VNC از اسکریپت های بوت ناپدید شد و هرگز در هیچ جای دیگری ظاهر نشد. من هرگز نمی دانستم که آیا حادثه من نقشی در این موضوع داشته است یا نه، اما این موضوع برنامه من را برای ثروتمند شدن شگفت انگیز با فروش اسلحه VNC خود به دانشجویان افسرده در سالن های کامپیوتر دانشگاه در سراسر کشور به طور کامل خراب کرد.

منبع: www.habr.com

اضافه کردن نظر