به نام خدا


برنامه نویسی با هگز ادیتور بخش 5



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



در بخش چهارم این دوره ، در ابزار pe info واقع در نرم افزار قدرتمند c32asm   ، قرار بر این شد که فیلد  SizeOfCode را با دست ، مقداردهی نماییم . 


برای اینکار مطابق درس قبلی ، در برنامه ی c32asm  از منوی View روی   pe info  کلیک کنید تا  پنجره ی  properties که معماری نرم افزارهای ویندوز را به شما نشان می دهد در سمت راست نرم افزار c32asm ظاهر شود . 


خب حالا روی مربع کنار عبارت  Optional Header  ( هدر اختیاری )  کلیک کنید . حالا روی عبارت SizeOfCode دابل کلیک کنید تا کد هگز مربوطه در ستون وسط هگز ادیتور ، هایلایت شود . 


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


در آدرس 0000009C  کد هگز 00340200 را با دست تایپ کرده و کارتان را ذخیره نمایید . 


بدین ترتیب ، شما مقدار 00340200 را برای فیلد SizeOfCode  تعیین نمودید


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


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


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



به همین روال پیش می رویم :


حالا روی عبارت SizeOfInitializedData دابل کلیک نمایید . در آدرس 000000A0  یعنی در ستون وسط هگز ادیتور ،  کد  003A0000  را با دست تایپ کرده و نتیجه را ذخیره نمایید .  به توضیحات زیر این فیلد نگاه کنید . 


نکته :


برای رفع ابهام ، می توانید به پست  pe.txt در وبلاگ وحیدمی مراجعه فرمایید .


https://vahidmy.blog.ir/post/pe-txt



ادامه :


حالا روی فیلد SizeOfUninitializedData  دابل کلیک کنید . 


در آدرس  000000A4 کد هگز 00000000 را با دست تایپ و نتیجه را ذخیره نمایید . 


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

+

+


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


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


لذا در ادامه ی این پست ، فقط چند فیلد را معرفی می کنم و بقیه ی فیلدها را به پست بعدی موکول می نمایم .


+



ادامه ی درس :


حالا روی فیلد  AddressOfEntryPoint   دابل کلیک کنید تا کد هگز درون ستون وسط هگز ادیتور ، هایلایت شود . 


حالا در آدرس 000000A8  کد EE080100  را با دست تایپ نمایید و نتیجه را ذخیره کنید . 


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


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


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




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


اگر باور نمی کنید کافیست از یک دیباگر مثل ollydbg استفاده کنید تا شاهد این موضوع باشید که نقطه ی شروع اجرای نرم افزار، هرگز اولین بایت سکشن کد ؛  نیست !!


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


من روی این فیلد حساس و مهم ، خیلی حرفها برای نوشتن دارم که خواهم نوشت . 


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


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



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


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


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



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



در همین انجمن زبان اسمبلی ، شاهد بودم که کاربر دیگری مدعی بود که وجود میلیونها کد هگز 00 در  لابلای سکشن ها امری ضروری است و نوعی مرزبندی می باشد و باعث اجرای سریعتر برنامه می شود !!!


اما این حرف نیز کاملا غلط است . 


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


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


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


من تجربه دارم :


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


این استراتژی ( بهینه سازی معماری نرم افزارها ) چند کار برای شما انجام می دهد :


1- از حجم باینری نرم افزار می کاهد و یک نرم افزار کوچک و فشرده را ایجاد می کند . 


2- امکان برنامه نویسی دستی با هگز ادیتور را فراهم می کند . این مرزبندی ها و سکشن های اضافی و میلیونها کد هگز 00 در لابلای سکشن ها ، فرایند آموزش برنامه نویسی با هگز ادیتور را هم برای من و هم برای شما ، بسیار دشوار و خسته کننده می کند . 


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


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




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



4-  کاربر را از شر تمام کامپایلرهای زبانهای سطح بالا و سطح پایین خلاص می کند 


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


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




6- حافظه ی رم آزاد می شود و ویندوز بسیار سریعتر و قویتر و ایمن تر می شود 


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


این تجربه ی شیرین را هرگز فراموش نمی کنم و می توانم آنرا روی ویندوز 10 و 11 و ویندوز سرور 2022 نیز تکرار کنم . 




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


8- پس از حذف کدهای 00 اضافی و ادغام کردن سکشنها در یک سکشن ، و حذف پدینگ و مرزبندی و  با یک آدرسدهی ساده  در اجزای این سکشن فشرده و کوچک ،  مجددا می توانیم نرم افزار را اجرا کنیم . من در این مورد ، تجربه دارم . بنابراین از روی باد هوا و بدون سند ، حرف نمی زنم . 


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



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


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


این فیلد ( نقطه ی ورودی )  ،  بسیار بسیار مهم و کاربردی و حساس است . 


من در مورد این فیلد در پستهای بعدی توضیحات کاملی ارائه می کنم . انشاا...