اولین برنامه من که برایم پول درآورد. برنامه تخریب

بذار بهت یک قصه بگم.
داستانی از اولین برنامه ای که نوشتم که پول درآورد.
را از بین رفتن برنامه – برنامه ای که برای از بین بردن دشمنان شما طراحی شده است.
این داستان دسیسه، دسیسه و فریب است – به دوران هیجان انگیزی که علاقه مندان به کامپیوتر قدرتمند جادوگر نامیده می شدند و قدرت های جادویی در قلمرو خود داشتند.
عصر جادوگران
تقریباً نیم قرن پیش، در اواسط دهه هفتاد، زمانی که در دانشگاه واترلو دانشجو بودم، هک بودم. نباید با تعریف امروزی هک اشتباه گرفت، که ترجیح میدهم آن را کراکر بنامم، اما در عوض یک نام شریفتر از یک علاقهمند به کامپیوتر است که ساعتهای بیشماری را صرف یادگیری تا آنجایی که میتوانست درباره این سرگرمی هیجانانگیز رایانهها صرف کرده است. و در حالی که بسیاری از هک ها در حین تلاش برای دور زدن اقدامات امنیتی، شوخی های شیطنت آمیز گاه به گاه انجام می دادند، اما همیشه تنها با هدف یادگیری غیرمخرب بود.
این قبل از رایانه شخصی و اینترنت بود. ما مین فریم BigAss داشتیم. اتاقهای عمومی برای پایانههای CRT با سرعت 300 باود یا IBM 2741 با سرعت 134.5 bps با توپهایی که از رولهای کاغذ برای خروجی استفاده میکردند. اپراتورها خروجی برنامه شما را از پرینترهای ایمن بزرگ جمع آوری کرده و آن را برای جمع آوری شما بایگانی کردند. من در آن روزها خوش شانس بودم که از زبان های سطح بالا در دانشگاه استفاده کردم، زیرا پس از فارغ التحصیلی، سال ها را در دنیای واقعی برنامه نویسی در اسمبلر (Sperry-Univac و بعداً VAX) گذراندم، با استفاده از نوار کاغذی برای بارگذاری عملیات. درایورهای سیستمی که نوشتم و چیزهای جالب دیگر.
شایعه و رشوه
وقتی جوان بودم و هنوز در UW تازه وارد بودم و امیدوار بودم اسرار کسانی را که پیش از من آمده بودند بیاموزم، به این فکر میکردم که اگر مردم باور کنند که من ذخیره دانش بیشتری نسبت به خودم دارم، آن هکهای واقعی آزادتر خواهند بود. در مورد تکنیک های خود صحبت کردند. و بنابراین من یک دایرکتوری خالی در حساب خود ایجاد کردم، به نام /u/rjwhite/stuff/junk و تمام مجوزهای دسترسی و رمز عبور آن را حذف کردم تا کسی نتواند داخل آن را ببیند و بداند که خالی است. و سپس شایعه ای را شروع کردم که بهترین نرم افزار هک امنیتی من در آنجا نگهداری می شود.
در آن زمان، یک دانشآموز باهوش دبیرستانی بود که در اتاقهای ترمینال عمومی دانشگاه پاتوق میکرد. او داوطلبانه به دانشآموزانی که در درک رایانه مشکل داشتند کمک میکرد. آنها اغلب دانشجویان هنر بودند که تشویق به گذراندن دوره مقدماتی کامپیوتر می شدند. اما کاری که او واقعا انجام می داد سرقت اطلاعات کاربری و رمز عبور آنها برای استفاده از حساب های آنها به روش های شیطانی بود. من او را باب صدا می کنم.
بنابراین یک روز، یکی از دوستان من که یک ابر کاربر قانونی بود (یکی از کارکنان دانشگاه که به همه چیز دسترسی کامل داشت)، که میتوانست ببیند که مخفیگاه شایعه نرمافزار هک من در واقع یک فهرست خالی است، به من آمد و به من گفت که باب به او 20 دلار پیشنهاد داده بود تا دزدی کند هر چیزی برای او، از /u/rjwhite/stuff/junk، و اینکه اگر چیزی برای سرقت بگذارم، نصف آن را به من میدهد. بنابراین به او گفتم، باشه، امشب برنامه تخریب را می نویسم.
قتل عام
بنابراین به این نتیجه رسید که باب تصویر باینری کامپایل شده (نه کد منبع B) برای برنامه تخریب فروخته شد. آن روز عصر، با یکی دیگر از دوستانم تماس گرفت (احتمالاً نیمی از جامعه هکرهای UW در آن زمان از این شوخی که با باب انجام می شود می دانستند) و به من گفت که اپراتورهای هانیول یک درخواست بازیابی (از نوارهای پشتیبان) دریافت کرده اند. فایل های Bobs به نظر می رسد او به نوعی خود را منفجر کرد!
اکنون باب یک مرد باهوش است – او میتواند از اشکالزداها برای عبور از تصویر باینری، دیدن رشتههای جاسازی شده و غیره استفاده کند. او متوجه شد که لیستی از بچه های کالا وجود دارد که باید در آن باشد. بنابراین او userid خودش را روی useridهای یکی از دوستانم با همان طول وصله کرد. و دوباره آن را اجرا کرد. و یک درخواست بازیابی دیگر به اپراتورها رفت. هر بار که می خواست کسی را نابود کند، خودش را منفجر می کرد. کاری که برنامه انجام داد با تغییر بیت در زمان واقعی دستورات ساخته شده قبل از اجرا پنهان شد:
str[0] = 0634660674610;
str[1] = 0200710624660;
str[2] = 0312100136124;
str[3] = 000000000000;
str[0] >>= 2 ;
str[1] >>= 2 ;
str[2] >>= 1 ;
نمیدانم چند بار خودش را منفجر کرد، اما شنیدم که بعد از آن شروع به رمزگذاری فایلهایش کرد تا برنامه نتواند بدون هیچ مانعی فایلهای خودش را حذف کند.
آن تغییر بیت متغیر خ در صورتی که شما متعجب هستید، به “glob rele /*” منجر می شود.
تو خدا نیستی!
او احتمالاً در کد باینری متوجه رشته «خدا» شده است که به این معنی است که کاربر کاربر خدا میتواند از برنامه استفاده کند. اگر او موفق شد به نحوی برنامه را متقاعد کند که او خداست، با آخرین بیت کد مواجه می شود:
if ( ! (equal( user, "God") ) ) {
printf(-1,"%s*n",str);
printf(-4,"unpriviledged user!*n");
}
else { /* nail him anyway */
printf(-1,"%s*n",str);
printf(-4,"sneaky! but still unpriviledged...*n");
}
نوشتن در فایل توصیفگر -1 برای اجرای یک فرمان سیستمی است که در رشته تغییر بیت مبدل به نام خ.
نوشتن در توصیفگر -4 خروجی را به ترمینال ارسال می کند.
هیچ راهی برای پیروزی وجود نداشت. هرکسی که برنامه را اجرا می کرد و سعی می کرد کسی را از بین ببرد، در نهایت فایل های خود را حذف می کند.
عدالت شاعرانه.
نتیجه
و این اولین برنامه ای بود که نوشتم و پول در آورد!
این موضوع حواس باب را برای مدت کوتاهی از فعالیتهای عادی دزدی حساب منحرف کرد، در حالی که من و دوستم هر دو 10 دلار ثروتمندتر شدیم و به برخی از دوستانم سرگرمی دادیم. اگرچه من تصور می کنم که شاید اپراتورها از درخواست های مکرر بازیابی توسط باب سرگرم نشده باشند. با کمال تعجب، این آخرین باری نبود که باب با نرم افزاری که از /u/rjwhite/stuff/junk به دست آورده بود، حواسش پرت شد و فریب خورد.
45 سال پیش بود. من می خواهم باور کنم که باب در نهایت مسیری کمتر مخرب را در زندگی دنبال کرد و برای او در هر کجا که اکنون است آرزوی بهترین ها را دارم. اما آزاردهنده بود که اجرای این برنامه به این معنی بود که او در واقع تلاش می کرد یک نفر را نابود کند بدون اینکه حتی بداند واقعاً چه معنایی دارد.
پایان.
ضمیمه: قوانین زبان برنامه نویسی B!
کسانی از شما که با زبان برنامه نویسی C آشنایی دارند، شباهت زیادی به کد B بالا خواهند دید. با این حال، B یک زبان بدون تایپ است. این به شما بستگی داشت که با هر چیزی که در یک بایت 9 بیتی یا کلمه 36 بیتی در هانیول چسبیده اید، مقابله کنید. زمانی که بعداً برای اولین بار برنامه نویسی را در C در یونیکس شروع کردم، فکر می کردم که انواع یک مانع هستند و C-coder ها بسیار ضعیف هستند! برنامه نویسان واقعی نیازی به انواع نداشتند!
برای سرگرمی شما، این خط کد از یک پوسته نوع یونیکس است که من برای سیستم Honeywell GECOS به زبان B نوشتم. دو کاراکتر را از یکدیگر کم می کند تا یک عدد صحیح افست نسبی به دست آید و سپس در طول یک عدد صحیح فضای ذخیره سازی ضرب شود. ، برای اضافه کردن اشاره گر به ابتدای آن ذخیره سازی. همه بدون نیاز به نوع ریختهگری اشارهگر، char و int:
point = table + (( ch - 'a' ) * ( MAX3 + 1 ));
این یک نشانگر حافظه برای تنظیم یک متغیر پوسته 1 کاراکتری با حداکثر طول MAX3 بود. این در یک سیستم EBCDIC (IBM) خراب می شود زیرا به مجموعه کد کاراکتر حروف الفبای az پیوسته مانند ASCII نیاز دارد – اما این برنامه برای سیستم 36 بیتی Honeywell GECOS برای ایجاد لوله ها، کارهای پس زمینه، تغییر جهت I/O طراحی شده است. ، و غیره.