programming by hex editor part 2
https://vahidmy.blog.ir/post/29
بنام خدا
امیدوارم از بخش اول آموزش برنامه نویسی با زبان ماشین (برنامه نویسی با هگز ادیتور) استفاده کرده باشید و برایتان مفید بوده باشد .
در ادامه ی بحث ، تعدادی از کدهای هگزادسیمال زبان ماشین را رمزگشایی می کنم .
توجه داشته باشید که دانستن معنا و مفهوم این کدها به شما در برنامه نویسی با زبان ماشین در محیط هگز ادیتور، کمک بسیار بزرگی می کند . .
همانطور که در پست قبلی دیدید من از مبنای هگزادسیمال یعنی کدهای جدول 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 ؛ را تیک می زنم که البته در دنیای وبلاگنویسی، این رفتار ؛ کاری مضحک و بی معنا و غیرحرفه ای محسوب می شود ولی من به این قواعد و استانداردهای وبلاگنویسی اهمیت نمی دهم و دوست دارم هرطور که دلم می خواهد وبلاگنویسی نمایم و آزاد باشم . لذا همینقدر که یک اشاره ی کوچک به این موضوعات در همین پاراگراف شد ، از نظر خودم ، کافی است !!
من تافته ی جدابافته هستم و به سبک خودم وبلاگنویسی می نمایم و به استانداردهای دنیای وبلاگنویسی اهمیت نمی دهم و برایم مهم نیست که مخاطبان پشت سرم چه می گویند . من به اشتهای مردم غذا نمی خورم و نگران حرف و حدیثهایی که مردم پشت سرم در می آورند نیستم و بی خیال و خونسرد هستم .
من رسومات کهنه ی دنیای وبلاگنویسی و مرزهای علم را جابجا می کنم !!
از نظر من ضرورتی ندارد که محتویات یک پست با موضوع مربوطه همخوانی داشته باشد لذا مجبور نیستم در تمام پستها در رابطه با موضوعات وبلاگ ام ، مطلب بنویسم . همینقدر که در همین پاراگراف که در تمام پستها انرا کپی و الصاق می نمایم ، به این موضوع اشاره کردم از نظر خودم کفایت می کند !!
از نظر شما اینکار نوعی ترول گری و اسپم سازی است ولی من اهمیت نمی دهم که اینکار اسپم می باشد یا نه . می توانید پشت سرم هرچه قدر خواستید حرف بزنید و مرا مسخره کنید و به من بخندید ولی من اصلا اهمیت نمی دهم .
این پاراگراف در تمامی پستهای وبلاگ وحیدمی توسط خودم ، عینا الصاق و تکرار می شود .
+
وحید محمدی - وبلاگ وحیدمی
بروزرسانی:
براثر حملات سایبری به وبلاگ وحیدمی ؛ تمام کامنت های کاربرها و پاسخ های من به کاربرها ؛ حذف شدند .
لعنت خدا و نفرین ملائکه بر هکرها و اتکرها و مجرمان سایبری .
تاریخ بروزرسانی
یکشنبه مورخ 29 مرداد 1402 خورشیدی
نکته :
آدرسهای آخرین پست وبلاگ وحیدمی را در زیر مشاهده می فرمایید .
در پناه خداوند متعال عظیم الشان باشید
ِ
الهم عجل لولیک الفرج .
امضای همیشگی اینجانب در جهت تایید صحت و درستی مطالب وبلاگهایم :
وحید محمدی . وبلاگ وحیدمی
https://vahidmy.blog.ir/archive
https://vahidmy.blog.ir/post/764