programming by hex editor part  2


بنام خدا


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


در ادامه ی بحث ، تعدادی از کدهای هگزادسیمال زبان ماشین را رمزگشایی می کنم .


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


  همانطور که در پست قبلی دیدید من از مبنای هگزادسیمال یعنی کدهای جدول  00  تا  FF  استفاده می کنم.


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


کدهای زبان ماشین با تمامی کاراکترها مطابق هستند . بنابراین زبان ماشین تنها زبان برنامه  نویسی نیست بلکه زبان تولید کاراکتر و تولید فایل و .... نیز می باشد .


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


همچنین برخی کارکترها نیز با کلیدهای ترکیبی مثل  CTRL  ،  SHIFT  یا  کلید  SPACE  یا  ENTER  مطابق هستند. یعنی اگر یکی از این کلیدها را فشار دهید ان کاراکتر در محیط هگز ادیتور تایپ می شود و شما می توانید انرا ببینید !


خب اینها را  فعلا  به خاطر بسپارید:


سمت چپ:  کد زبان ماشین . وسط : کد زبان اسمبلی  . سمت راست : توضیح


MACHINE        ASSEMBLY           COMMENTS

===========================


75         JNE     ; JUMP IF ZF IS 0  . NOT EQUAL.


55       PUSH EBP     ;  STACK  FRAME  (RAM)

89E5       MOV EBP , ESP   


837D0C01     CMP  DWORD[EBP+12] , 01  

 

 ;  If  MESSAGE = &WM_CREATE

 






به کد آخری و توضیحاتش با دقت نگاه کنید . چه می بینید ؟؟؟؟


با یک نگاه  براحتی می توان فهمید که  کد  837D0C  با  دستور اسمبلی CMP    مطابقت دارد . یعنی  دو چیز را با یکدیگر  مقایسه می کند .  CMP مخفف  COMPARE است . یعنی مقایسه .


البته اگر بخواهم دقیقتر بگویم باید بگویم:  کد  837D0C  با عبارت                            CMP  DWORD   [EBP+12]

مطابقت دارد .

در زبان اسمبلی ، بجای if از  CMP  استفاده می شود .




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


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



حالا این  [EBP+12]  دقیقا چیست ؟؟


 عبارت EBP+12   با     MESSAGE    مطابقت دارد .  منظور از  MESSAGE در اینجا  همان پیام هایی است که وارد پنجره ی اصلی نرم افزار ویندوزی می شوند.


پیام ؟؟؟


پنجره ؟؟؟



پیام  یعنی همان رویداد .  یعنی  چیزی شبیه به  رویداد  FORM_LOAD در زبان ویژوال بیسیک 6 


در اینجا  پیام  WM_CREATE  در زبانهای ماشین  و اسمبلی   با   رویداد   FORM_LOAD  زبان ویژوال بیسیک 6  مطابقت دارد !!


جالب است . نه ؟؟؟



خلاصه :


837D0C01 =  CMP  DWORD[EBP+12] , 01  =;  If  MESSAGE = &WM_CREATE



 در عبارت بالا براحتی توانستیم  کد 837d0C01  را رمزگشایی نماییم . ابتدا آنرا به کد  cmp dword[ebp+12] , 01  ترجمه کردیم و سپس این کد که  به زبان اسمبلی می باشد را به کد  If message=&WM_CREATE  ترجمه کردیم .


به همین راحتی توانستیم باینری را رمزگشایی نماییم .


+


در ویندوز حدود  255  رویداد با  پیشوند  WM    وجود دارد که کمک می کند تا در زبانهای  ماشین و اسمبلی از برنامه نویسی رویدادگرا  و شیئ گرا  (شبیه به ویژوال بیسیک و سی پلاس پلاس  )  استفاده کنیم .


مثلا  پیام  WM_MOUSEMOVE  در زبانهای ماشین و اسمبلی  همان  رویداد  MOUSEMOVE  در زبانهای  سطح بالا ( سی، سی پلاس پلاس  ، پاسکال ، بیسیک و ...)  می باشد .


WM  مخفف  عبارت    Window Message ( پیام ِ پنجره = رویداد ) می باشد .


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



در زبانهای ماشین و اسمبلی   بجای رویداد  از لفظ  پیام یا  MESSAGE  استفاده می شود .


پس فهمیدید که عبارتهایی شبیه به عبارت  EBP+12  هرکدام با یکی از عناصر سازنده ی پنجره ی اصلی  نرم افزارهای سیستم عامل ویندوز  مطابقت دارد .


از این به بعد در دیس اسمبلی نرم افزارهای ویندوز حتما به دنبال عبارتهایی شبیه به EBP+12  یا   EBP+0C  یا  EBP+8  و  امثالهم  بگردید . هرکدام یکسری از اسرار مخفی درون سیستم عامل ویندوز را برایتان بازگو می کنند.


برای اینکار لازمست که شما حتما  اسمبلر  RosAsm  را دانلود کرده باشید و با ان کار کرده باشید  و  ماکروهای سورس  برنامه هایش را نیز   unfold کنید  تا دقیقا متوجه شوید که هر ماکرو با کدامیک از این کدها  مطابقت دارد . 


اینها همگی عناصر سازنده ی پنجره ی اصلی نرم افزارهای ویندوز می باشند .


حالا که  معنای پیام و عبارتهای دارای پیشوند  WM  را فهمیدید  وقت ان رسیده که  به مفهومی دیگر بپردازم:

پنجره .


بله  پنجره . ویندوز یعنی  پنجره ها (Windows) :


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


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


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


یکی از دلایل اصرارم  مبنی بر احیای زبانهای ماشین و اسمبلی دقیقا  رمزگشایی از همین معما می باشد .


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


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


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

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


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


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



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

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


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


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


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


با  مطالعه ی دیس اسمبلی  کرنل ویندوز یعنی فایلهای زیر براحتی می توان فهمید که هیچ چیز ویندوز از مک  یا  لینوکس  اقتباس و کپی نشده است :


USER32.DLL

KERNEL32.DLL

NTDLL.DLL

ADVAPI32.DLL

SHELL32.DLL


به بحث اصلی ام باز می گردم :


عبارتهایی همچون  [ EBP+12] و بطور کلی هر عبارتی که در کروشه و همراه با  رجیستر   EBP  باشد و شما احتمالا در دیس اسمبلی نرم افزارهای ویندوز مشاهده کرده اید  معمولا  با یکی از این  انواع داده  مطابقت دارد :

[EBP+12]    =  MESSAGE        


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


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


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

 

این روش ِ من برای رمزگشایی زبان ماشین   است .    البته برنامه ی قدرتمندی همچون   Ollydbg  نیز می تواند در این مسیر به شما کمک کند . 


لینک دانلود نرم افزار قدرتمند  C32asm (هگز ادیتور و ری اسمبلر) :




http://bayanbox.ir/download/8321732658963774080/c32asm.rar





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


در پست بعد می خواهم   معماری  یک نرم افزار ویندوزی را برایتان  انالیز کرده و بصورت دستی و روی کاغذ (وبلاگ)  و با کمک کدهای زبان ماشین   توی همین وبلاگ برایتان یک نرم افزار بسازم !


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


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

پس هر نوع تغیراتی را کافیست  فقط  ذخیره  کنید : Save  .




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



ادامه دارد....

+


موضوعات وبلاگ وحیدمی :

من  در تمامی پستهای وبلاگ وحیدمی ، سعی می کنم لااقل یک اشاره ای به موضوعات این وبلاگ داشته باشم . به همین دلیل برای تمامی پستهای این وبلاگ ،  تمام جعبه های موضوعات  وبلاگ  شامل  Idea ،  Assembly  ،  vahidmy  ، Music  ، Binary ، OS ، Weblog ، IT   ؛  را تیک می زنم که البته در دنیای وبلاگنویسی،  این رفتار ؛   کاری مضحک  و بی معنا و غیرحرفه ای محسوب می شود  ولی من به این قواعد و استانداردهای وبلاگنویسی اهمیت نمی دهم و دوست دارم هرطور که دلم می خواهد وبلاگنویسی نمایم و آزاد باشم . لذا  همینقدر که یک اشاره ی کوچک به این موضوعات در همین پاراگراف شد ،  از نظر خودم ، کافی است !!

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

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

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


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


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


+



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


https://vahidmy.blog.ir