به نام خدا


programming-by-hex-editor-part-3



برنامه نویسی با هگز ادیتور (زبان ماشین) قسمت سوم :



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


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


بدین منظور، از برنامه ی  قدرتمند c32asm که دارای اسمبلر و دیس اسمبلر و ری اسمبلر درونی و استاندارد و بین المللی است و هیچ گرامر و سلیقه ی شخصی یا فلسفه یا عقیده را بر من تحمیل نمی کند ، استفاده  می نمایم . این برنامه همچنین یک هگز ادیتور قدرتمند دارد که با دیس اسمبلر براحتی سوئیچ می شود و البته یک ابزار pe info  نیز دارد که با کمک آن می توانیم تا حدودی بر معماری نرم افزارهای ویندوز مسلط شویم .


برای تسلط کامل بر معماری نرم افزارهای ویندوز لازمست که برنامه ی  tiny hexer را نیز بکار گیریم .


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


بعد از مدتی متوجه می شوید که فقط یک هگز ادیتور برای انجام تمام کارها کفایت می کند و  می توانید بقیه را فراموش کنید  .


خب حالا من همین برنامه ی قدرتمند  c32asm را بکار می گیرم .


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


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


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


باور کنید قدرت یک هگز ادیتور ساده و بدوی ، میلیونها برابر بیشتر از ابزارهای دهان پرکن  گران قیمت انحصاری بزرگ تجاری ؛ از قبیل  ida pro می باشد .


ida pro به هیچ دردی نمی خورد . اصلا کارایی ندارد و فقط ابزاری برای خالی کردن جیب کاربران است .


ida pro فقط یک دیس اسمبلر خشک و خالی و کودن و سنگین و کند  است و عملا نه هگز ادیتور دارد نه   اسمبلر هوشمند  نه ری اسمبلر  . عملا  این نرم افزار گران قیمت تجاری ،  بدون  پلاگین هایش هیچ غلطی نمی تواند بکند و به هیچ دردی نمی خورد .



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


چه برای برنامه نویسی و چه برای هک و کرک و مهندسی معکوس و چه برای تولید انواع و اقسام فایها و چه برای هر منظور دیگری ،  هگز ادیتور کاملا کفایت می نماید .


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



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


دیکامپایلرها نیز ابزارهایی چرند و بی مصرف هستند و عملا شما را از زبان واقعی کامپیوتر ( زبان ماشین ) فرسنگها دور می نمایند .


شما برای رسیدن به سورس یک نرم افزار هیچ نیازی به دیکامپایلر ندارید .


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


+

خب با این مقدمه ی طولانی ، کار را به امید خدا  شروع می کنیم :


من فرض را بر این می گیرم که شما  فایلهای این وبلاگ خصوصا هگز ادیتورها  را دانلود کرده اید ( اگر هم دانلود نکرده باشید مهم نیست . مهم اینست که من درس ام را بدهم  و بروم  پی زندگی ام . چه دانلود بکنید چه نکنید اصلا اهمیت نمی دهم و درس ام را که دادم می روم دنبال  کار و زندگی ام  و آنوقت شما می مانید و حوض تان !!) .


با فرض بر اینکه شما این فایلها را دانلود کرده اید ( که می دانم هرگز دانلود نمی کنید ! ) ،  درس را شروع می کنم :


ابتدا برنامه ی  c32asm را اجرا کنید


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


سپس از منوی View روی  Pe info  کلیک کنید تا در سمت راست برنامه ، کادر مربوط به  معماری نرم افزارهای ویندوزی ، باز شود .


به کادر نگاه کنید . روی نوار عنوان این کادر ، عبارت properties نوشته شده است که  به معنای  ( مشخصات - خصوصیات )  می باشد زیرا مشخصات یک نرم افزار ویندوزی را به شما نشان می دهد .

در داخل کادر با عناوین زیر مواجه می شوید که اساس معماری و ساختار نرم افزارهای ویندوز را تشکیل می دهند:





DOS HEADER


File Header


Optional Header


SectionHeader



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


اینجاست که لازمست شما نرم افزار   Tiny Hexer را نیز دانلود کرده باشید تا بتوانید با استفاده از اسکریپت هایش به تمامی اجزای سازنده ی معماری نرم افزارهای ویندوز دست یابید .


درواقع نقطه ضعف بزرگ برنامه ی قدرتمند c32asm در اینست که بعد از SectionHeader ( جدول سکشن ها ) ، دیگه ادامه نمی دهد و سایر بخشهای نرم افزار را به شما معرفی نمی کند .


بعد از جدول سکشن ها ، شما به  انبوهی از کدهای 00 که کد زبان ماشین در مبنای هگزادسیمال می باشند  برخورد می کنید .


در بسیاری از مواقع ، این کدهای 00  که مستقیما بعد از جدول سکشن قرار می گیرند  ، اضافی هستند و عملا هیچ کاربردی ندارند و می توان  آنها را حذف کرد تا حجم نرم افزار کمتر شود و امنیت نیز بیشتر شود  .


البته در بخش پایانی تمام نرم افزارهای ویندوزی نیز شاهد هزاران کد هگز  00 هستیم که به  آنها اصطلاحا  پدینگ  (padding) گفته می شود که از نظر من یک نقطه ضعف امنیتی است و باید یا انرا حذف کرد یا با کدهای بی اثر  و خنثی مثل  90  ( به معنای nop ) ،  جایگزین کرد .

اینطوری یا حجم فایل کمتر می شود یا اینکه امنیت اش بیشتر می شود  .


بهرحال وجود هزاران کد هگز 00  در لابلای بخشهای مختلف نرم افزارهای ویندوز ، یک اشتباه بزرگ استراتژیک است که شرکت مایکروسافت سالهاست این اشتباه را تکرار می کند و انوقت انتظار دارد که ویندوز ، به انواع ویروس و تروجان و بدافزار و باج افزار و ...  آلوده نشود !!!!


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


اگر بیل گیتس نابغه واقعا نابغه بود می بایست از ساده ترین و فشرده ترین و تمیزترین و کوچکترین معماری برای ساخت نرم افزارها و درایورهای ویندوز استفاده نماید .

تا ویندوز هرگز آلوده نشود و نیاز به نصب صدها انتی ویروس نداشته باشیم .


اما دشمنی ذاتی بیل گیتس با زبانهای سطح  پایین ( ماشین و اسمبلی ) و خوی پول پرستی و حرص و طمع و جاسوسی و استعمارگری اش مانع از فهم این موضوع شد .


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


بگذریم .


خب حالا قصد داریم سهل انگاری و پول پرستی جناب بیل گیتس را جبران کنیم و به او درسی بدهیم که هیچوقت فراموش نکند !



درس ما دقیقا از اینجا شروع می شود :


روی مربع سمت چپ عبارت DOS HEADER کلیک کنید تا منوی کشویی باز شود :


روی عبارت e_magic   دابل کیک کنید تا در ستون وسط هگز ادیتور شاهد هایلایت شدن کدهای  4d5a باشیم که البته ناگفته پیداست که این کدها در ستون سمت راست هگز ادیتور با  عبارت معروف  MZ  مطابقت کامل دارند . 


کدهای 4d5a   که البته در اکثر هگز ادیتورها بصورت 4D5A  دیده می شوند بعنوان  شماره ی جادویی نیز  شناخته می شوند .


کافیست این کدها را با هر کد هگز دلخواه ، رونویسی کنید انوقت ، شاهد از کار افتادن نرم افزار خواهید بود !!


بنابراین تحت هیچ شرایطی این کدها را دستکاری نکنید .


برای شروع برنامه نویسی با هگز ادیتور حتما لازمست کدهای  4d5a را در ستون وسط هگز ادیتور بنویسید . این یک الزام است و باید حتما به ان مقید باشید .


خب حالا روی عبارت  e_cblp   دابل کلیک کنید تا شاهد هایلایت شدن عبارتهایی شبیه به این در ستون وسط هگز ادیتور باشید :


8000

5000

9000


در تمام نرم افزارهای ویندوزی ، بعد از کد معروف 4D5A ، شما بلافاصله  شاهد یکی از این سه کد بالایی می باشید .


عبارت e_cblp     تحت عنوان :  " بایتهای روی صفحه ی آخر فایل  "  معرفی شده است   .


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


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


در اکثر نرم افزارهای ویندوز ما شاهد کد 9000  ، در این قسمت هستیم . پس شما نیز می توانید هنگام ساخت نرم افزارتان ، این کد را در ستون وسط هگز ادیتور بنویسید و نتیجه را ذخیره نمایید  .


نکته ی مهم

زبان برنامه نویسی ماشین یک زبان  کاملا دستی است و چیزی به نام اسمبلر یا کامپایلر یا لینکر ندارد و تمامی اجزای نرم افزار باید با دست نوشته شوند اما مزیت اش اینست که شما  پس از نوشتن هر بخش از نرم افزار ، اگر خسته و بی حوصله شدید و یا کار واجب داشتید کافیست که هرچیزی را که در ستون وسط هگز ادیتور تایپ کرده اید را ذخیره نمایید .


بطور کلی : برای تولید نرم افزار یا هر نوع فایل در هگز ادیتور ، کافیست پس از  اتمام کار ، محصول مورد نظرمان را  ذخیره کنیم . پس خیلی راحت از منوی File  گزینه ی Save  یا  Save as  را انتخاب کرده و یک نام دلخواه به نرم افزارتان بدهید و پسوند exe را نیز به ان بدهید بعد ، کارتان را ذخیره نمایید .


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


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


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


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


+


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



از همین جا می توانید برای ساخت یک نرم افزار جدید ، الهام بگیرید .


ابتدا با یک هگز ادیتور دلخواه  ، یک فایل کاملا خالی بسازید و به ان یک نام دلخواه با پسوند exe بدهید و همان لحظه ، فایل تان را روی هارد ، ذخیره نمایید (Save).


سپس با کلیک بر روی ستون وسط هگز ادیتور  ، این کدها را با دست تایپ کرده و نتیجه را با  استفاده از منوی Save  ، ذخیره نمایید :


4D5A9000

بعد از تایپ این کدها در ستون وسط هگز ادیتور ، باید حتما در ستون سمت راست هگز ادیتور ، شاهد عبارت معروف  MZ باشید  .


+


خب ادامه ی درس را در پست بعدی ، ارائه می دهم .  در درس بعدی  قصد دارم در مورد  سایر عبارتهای  DOS HEADER ( هدر سیستم عامل داس )   توضیح داده و روش برنامه نویسی با کمک عناصر این ساختار را تشریح نمایم .


نکته : مهمترین عبارت موجود در هدر داس ، عبارت  e_ifanew  می باشد که بعد از این عبارت ، شما شاهد یک نرم افزار سازگار با سیستم عامل داس هستید  . درواقع در هدر داس که اولین بخش از معماری نرم افزارهای سیستم عامل ویندوز است ، شما یک نرم افزار سازگار با سیستم عامل داس را مشاهده می کنید که به شما می گوید:  این نرم افزار ویندوزی ( که دارید انرا در هگز ادیتور و با دست می سازید )   ، نمی تواند تحت سیستم عامل داس اجرا شود !!!!


یعنی یک نرم افزار داس در درون شکم تمام نرم افزارهای ویندوز ، از قبل جاساز شده است !!!!


این بیل گیتس هم واقعا یک موجود فرازمینی و غیرقابل درک است و کارهای عجیبی انجام داده که این کار بالایی یکی از شاهکارهای این نابغه است !!


سیستم عامل متنی در شکم سیستم عامل گرافیکی !!




اینجاست که یک تفاوت ظریف بین ویندوز و لینوکس دیده می شود :


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

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


چنین پیامی معنایش اینست که باید با  سیستم عامل داس خداحافظی کنید و به یک سیستم عامل کاملا گرافیکی ( ویندوز ) سلام کنید !!!


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


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


 حالا دیگه خودتان تصور کنید که چطوری می توان  تحت لینوکس با زبان ماشین (زبان سخت افزار ) ، برنامه نویسی کرد ؟؟؟!!!




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


خب تا بعد !


+

وحید محمدی . وبلاگ وحیدمی .