به نام خدا
programming-by-hex-editor-part 5
برنامه نویسی با هگز ادیتور - قسمت 5 .
File header
ساختار هدر فایل
کاربران عزیز . سلام . امیدوارم که حالتان خوب باشد . طبق قولی که در پست قبلی دادم قرار شد هدر فایل را تشریح و رمزگشایی نمایم .
برای شروع کار ابتدا سعی کنید جدیدترین نسخه ی فلت اسمبلر (Fasm) را از سایت رسمی اش دانلود نمایید .
جدیدترین نسخه ی فلت اسمبلر را از لینک زیر دانلود نمایید :
https://flatassembler.net/fasmw17327.zip
سپس فایل fasmw17327.zip را اکسترکت نمایید .
سپس وارد فولدر fasmw17327 شوید .
سپس روی فایل FASMW.EXE دابل کلیک نمایید تا فلت اسمبلر اجرا شود .
سپس از منوی File روی گزینه ی Open کلیک نمایید و به فولدر EXAMPLES وارد شوید .
حالا فولدر BEER را باز نمایید و روی فایل BEER.ASM کلیک کرده و سپس روی دکمه ی Open کلیک نمایید تا این فایل باز شود . سپس بلافاصله در محیط فلت اسمبلر ، کلید F9 را فشار دهید .
نرم افزار ، کامپایل و بیلد و ران می شود و یک پیام ظاهر می شود که از شما یک سوال می پرسد .
شما به او پاسخ مثبت (yes) بدهید . به محض پاسخ مثبت ، درایو سی دی رام کامپیوترتان باز می شود . درایو را با استفاده از دکمه ی مربوطه ببندید .
حالا ، یک نگاه به سورس برنامه بیاندازید .
با این کلمه در متن بالای سورس برنامه مواجه می شوید :
; Beer - example of tiny (one section) Win32 program
; no section defined - fasm will automatically create .flat section for both
; code and data, and set entry point at the beginning of this section
عملا فلت اسمبلر ، نرم افزار مورد نظر را در قالب یک فایل فشرده که فقط یک سکشن دارد تولید و اجرا کرد .
نام ان سکشن ، flat می باشد . flat معانی مختلفی دارد از جمله :
ساده - تخت - یکپارچه - پهن -
اما در فلت اسمبلر ، لغت فلت به معنای ساده و یکپارچه می باشد . در اینجا نیز فلت اسمبلر یک سکشن فلت ساخته است یعنی کل فایل اجرایی فقط یک سکشن دارد و این یک مزیت بزرگ است که متاسفانه سیستم عامل ویندوز از این مزیت محروم است زیرا ویندوز هرگز توسط فلت اسمبلر ساخته نشده است بلکه توسط زبانهای سطح بالا ساخته شده که دهها سکشن اضافی و بیهوده و متورم را در معماری نرم افزارهای ویندوز ، ایجاد می کنند و امینت ویندوز را به خطر می اندازند .
خب ، فلت اسمبلر با کمک یک رهنمود قدرتمند ، اینکار را انجام می دهد . به بخش پایانی سورس برنامه نگاه کنید . ببینید چه چیزی دیده می شود ؟؟؟
شما با این دو لغت در ابتدا و انتهای بخش پایانی سورس برنامه مواجه می شوید :
لغت data import قبل از سکشن ورودی و لغت end data بعد از سکشن ورودی .
این دو لغت باعث ادغام سکشنها با یکدیگر شده و یک سکشن فشرده و یکپارچه و ساده تحت عنوان سکشن فلت را تشکیل می دهند لذا حجم فایل اجرایی به شدت کاهش می یابد .
حالا که حجم فایل اجرایی به شدت کاهش یافته و فقط 1 کیلوبایت حجم دارد فلت اسمبلر را می بندیم و برنامه ی C32asm را اجرا می کنیم تا بتوانیم معماری فایل beer.exe را بررسی نماییم .
از طریق برنامه ی c32asm فایل beer.exe را که توسط فلت اسمبلر ساخته شده است را باز می نماییم :
(نکته ی مهم : چنانچه فایل beer.asm را که فقط یک سکشن دارد در این نسخه (fasmw17327) پیدا نکردید می توانید انرا در پکیج FasmFull و در پوشه ی زیر پیدا نمایید :
می توانید این فایل را در نسخه ی قدیمی یعنی 16950 و از مسیر زیر پیدا کنید و توسط هرکدام از نسخه های فلت اسمبلر ، فایل beer.asm را کامپایل و بیلد و اجرا نمایید :
FasmFull\FASMW64\fasmw16950\EXAMPLES\BEER
هرچیزی که در نسخه های جدید فلت اسمبلر پیدا نکردید را می توانید در FasmFull که حاوی نسخه های قدیمی فلت اسمبلر می باشد ، پیدا کنید .
خوشبختانه تمامی نسخه های فلت اسمبلر ( قدیم و جدید ) با یکدیگر سازگار هستند و نرم افزارهای همدیگه را کامپایل و بیلد و اجرا می نمایند . از این بابت جایی برای نگرانی نیست . تمام نیازهای خود را می توانید از پکیج FasmFull دریافت نمایید . )
در برنامه ی c32asm از منوی view روی pe info کلیک می نماییم تا کادر مربوط به معماری نرم افزارهای ویندوزی ، باز شود .
خب ! حالا به سراغ File header می رویم :
اجزای ساختار File header :
Machine ; 014c = 80386
NumberOfSections ; 0001 = one section (.flat)
TimeDateStamp ; date and time that file is created
PointerToSymbolTable ; used for debugging
NumberOfSymbols ; used for debugging
SizeOfOptionalHeader ; Size of Optional Header
Characteristics ; Contains Flags for the File such whether this file is an exe or a dll or a sys .
خب حالا در برنامه ی c32asm و در ستون مربوط به pe info و در بخش File Header ، روی عبارت Machine دابل کلیک نمایید تا کد 4c01 در ستون وسط هگز ادیتور ، هایلایت شود .
این کد که در اصل به شکل 014c بوده است و به درخواست پردازنده ی اینتل و توسط کامپایلرها و اسمبلرها بصورت معکوس نوشته می شود ، کد اختصاصی پردازنده های نسل اینتل 80386 به بعد می باشد . یعنی این کد به پردازنده های پنتیوم و سلرون و کور اینتل تعلق دارد و روی همه ی آنها اجرا می شود . درواقع ، این کد باعث می شود که سیستم عاملهای داس و ویندوز و نرم افزارها و درایورهایشان براحتی روی تمام پردازنده های خانواده ی بزرگ X86 اجرا شود . بنابراین کد مربوطه که حالا بصورت معکوس یعنی 4c01 در داخل شکم فایل اجرایی نرم افزار قرار دارد براحتی روی کامپیوترتان اجرا می شود . زیرا این کد به تمامی پردازنده های خانواده ی اینتل x86 تعلق دارد . پس حتما روی کامپیوتر شما که مخاطب این وبلاگ هستید نیز اجرا می شود .
حالا روی عبارت NumberOfSections دابل کلیک نمایید تا عدد مربوط به تعداد سکشن های نرم افزار ، هایلایت شود .
می بینید که عدد 1 را به ما نشان می دهد که یعنی اینکه این نرم افزار ، فقط یک سکشن دارد ( سکشن فلت ) .
مهمترین بخش کار ما در برنامه نویسی با زبان ماشین دقیقا به همین سکشن فلت مربوط می شود که باید تمامی اجزا را با کمک آدرسهای مجازی معکوس رابطه ای ، با دست بسازیم و مدام ادرسدهی نماییم که کاری بسیار سخت و حوصله بر می باشد .
فعلا با سکشن فلت کاری نداریم .
خب خالا روی عبارت TimeDateStamp کلیک کنید تا روز و ساعت مربوط به ساخت نرم افزار را به زبان ماشین در ستون وسط هگز ادیتور به شما نشان دهد . من همیشه در برنامه نویسی با زبان ماشین ، از کد هگز 00000000 استفاده می کنم !!!
زیرا حقیقتا مهم نیست که فایل در چه تاریخ یا ساعت ساخته شده باشد . لااقل در مورد نرم افزارهایی که خودمان با دست می سازیم اهمیت ندارد که در چه ساعتی ساخته شده اند . لذا می توانید از کد هگز 0000000 استفاده نمایید . یعنی 8 بار کلید 0 را فشار دهید .
خب حالا روی عبارت PointerToSymbolTable دابل کلیک کنید تا با عدد 00000000 در ستون وسط هگز ادیتور مواجه شوید . این عبارت ، اشاره گر به جدول سمبولهای دیباگ می باشد . این سمبولها در درون فایلهای دیباگ قرار دارند لذا در خود نرم افزار هیچ اشاره ای به انها نمی شود لذا همیشه مقدار این عبارت برابر با عدد 00000000 خواهد بود .
فایلهای دیباگ را با پسوند DBG می شناسیم .
این فایلها اکثرا در زبانهای سطح بالا که از زبان اسمبلی و توابع ویندوز ، به شدت دور هستند ( مثل زبانهای سی پلاس پلاس و پاسکال و بیسیک و پایتون و .... ) بکار می روند وگرنه در زبانهای سطح پایین ( ماشین و اسمبلی ) که به زبان ماشین و توابع ویندوز به شدت نزدیک هستیم عملا خودمان با دست مستقیما محتویات درون این فایلها را می نویسیم لذا در زبانهای سطح پایین نیازی به فایلهای دیباگ نیست . زیرا سمبولهای دیباگ مستقیما توسط خودمان بکار می روند .
اینجا نیز نقطه ضعف بزرگ زبانهای سطح بالا نمایان می شود !
خب حالا روی عبارت NumberOfSymbols دابل کلیک کنید تا باز هم شاهد هایلایت شدن کد 00000000 در ستون وسط هگز ادیتور باشید !
این بخش ، به تعداد سمبولهای دیباگ ، اشاره می کند که عملا یک چیز بی معنا می باشد زیرا تعداد سمبولهای دیباگ انقدر زیاد است که قابل شمارش نیست .
بنابراین در این فیلد نیز باید کد هگز 00000000 را در ستون وسط هگز ادیتور و در ادرس مربوطه تایپ نماییم .
توجه داشته باشید که کدهای هگز مربوطه باید دقیقا در ادرس مربوطه در ستون وسط هگز ادیتور نوشته شوند و اگر جابجا نوشته شوند نرم افزار گرچه ساخته می شود اما اجرا نمی شود .
پس دقیقا طبق آدرس مربوطه و با کمک ابزار pe info ، کدهای هگز مورد نیاز را در ستون وسط هگز ادیتور تایپ کنید . ادرسها در زبان ماشین حرف اول و اخر را می زنند .
حالا روی عبارت SizeOfOptionalHeader دابل کلیک نمایید . این عبارت ، اندازه و حجم هدر اختیاری یا اوپشنال هدر را تعیین می کند که باید یک مقدار معتبر را وارد نمایید . معمولا در اکثر نرم افزارهای ویندوز از کد E000 در ستون وسط هگز ادیتور استفاده می شود .
حالا اینکه عبارت E000 که در اصل به صورت 00E0 بوده است دقیقا با کدام عدد دسیمال برابر است فعلا کاری نداریم !!
( فعلا حضور ذهن ندارم . بعدا مقدار این عدد را بصورت دسیمال می نویسم ) .
بروزرسانی : کد هگز E0 برابر با عددد دسیمال 224 می باشد . اگر از پایان هدر فایل ، یکی یکی بایتها را بشماریم قبل از رسیدن به جدول سکشن ، دقیقا تعداد 224 بایت شمرده خواهند شد .
بنابراین اندازه و حجم هدر اختیاری (Optional header) دقیقا برابر با 224 بایت می باشد .
این عدد باید همیشه همین 224 بایت باشد . اگر بیشتر باشد یعنی اینکه یک هکر ، اقدام به دستکاری هدر اختیاری نموده و یک کد مخرب را به درون نرم افزار تزریق کرده است .
بنابراین برای اطمینان از صحت و امنیت نرم افزارهای ویندوزی ، باید با کمک یک هگزادیتور ، انها را باز کرده و تعداد بایتهای هدر اختیاری را بشماریم که از 224 بایت بیشتر نشده باشد . اگر بیشتر باشد و یک سکشن اضافی در معماری فایل دیده شود یعنی اینکه ، نرم افزار به بدافزار یا ویروس آلوده شده است و باید توسط انتی ویروس پاکسازی شود .
هرچند که با کمک هگز ادیتور و بصورت دستی نیز می توان سکشن اضافی را حذف کرده و تعداد کدهای تشکیل دهنده ی هدر اختیاری را به همان 224 بایت برگرداند و فایل را از شر ویروس نجات داد .
فراموش نکنید که یکی از کاربردهای هگز ادیتور ، اصلاح و ترمیم معماری نرم افزارها می باشد و عملا هگز ادیتور در اینجا نقش یک انتی ویروس دستی را نیز بازی می کند و حتی بهتر از انتی ویروسهای تجاری ، کارش را انجام می دهد زیرا علاوه بر پاکسازی نرم افزارها از شر ویروسها ، اقدام به بازسازی و تعمیر فایلها نیز می نماید . کاریکه کمتر انتی ویروسی در دنیا انجام می دهد .
بهرحال یکی از راههای کشف ویروس ، شمردن تعداد بایتهای مربوط به حجم هدر اختیاری می باشد .
تعداد این بایتها همیشه باید 224 بایت باشد . هر کد هگز که می شماریم دقیقا برابر با یک بایت ، اندازه دارد .
معمولا حجم هدر اختیاری همیشه ثابت است . پس شما می توانید با خیال راحت در ادرس مربوطه و در ستون وسط هگز ادیتور کد هگز E000 را تایپ و سپس کارتان را ذخیره نمایید .
توجه : به دلیل اینکه فرایند برنامه نویسی با زبان ماشین ، بسیار بسیار وقتگیر است سعی کنید هر یک کلمه یکبار نتایج را روی هارد ذخیره نمایید (Save) تا اگر خدای ناکرده برق قطع شد یا دچار مشکل دیگری شدید زحمات تان برباد نرود .
و اما اخرین عضو هدر فایل :
روی عبارت Characteristics دابل کلیک کنید تا کد هگز مربوطه در ستون وسط هگز ادیتور ، هایلایت شود .
Characteristics یعنی خصوصیات و دقیقا خصوصیات فایل را تعیین می کند و مثلا تعیین می کند که این فایل یک نرم افزار است یا یک درایور یا یک کتابخانه .
برای هر نوع فایل یک عدد انحصاری درنظر گرفته می شود .
برای نرم افزارها ( فایلهای با پسوند exe ) باید در ستون وسط هگز ادیتور ، کد 0F01 را تایپ و سپس ذخیره نمایید .
برای فهم دقیق اینکه برای هر نوع فایل از چه کدی استفاده کنیم می توانید از ابزارهای مهندسی معکوس یا از فایلهای هدر یا فایلهای مربوط به معماری ویندوز ، استفاده نمایید . در این منابع و ابزارها دقیقا متوجه می شوید که مثلا برای فایلهای dll یا sys از چه کدی باید استفاده کرد .
+
+
+
خب ! رمزگشایی هدر فایل به پایان رسید . در پست بعدی ، هدر اختیاری یا اوپشنال هدر را رمزگشایی می نمایم . سعی کنید از همین برنامه ی beer.exe که فقط یک سکشن دارد و فشرده و کوچک است استفاده نمایید .
در پست بعدی ما دیگه به فلت اسمبلر نیاز نداریم و درعوض به برنامه های c32asm و tiny hexer نیاز داریم تا بتوانیم تمامی اجزای معماری فایل beer.exe را بایت به بایت تا به اخر رمزگشایی نماییم .
بعد از Section Header ما دیگه نمی توانیم از برنامه ی c32asm استفاده نماییم و عملا لازم است از یک برنامه ی کمکی مثل tiny hexer کمک بگیریم .
+
+
پست بعدی وبلاگ وحیدمی به اوپشن هدر اختصاص دارد .
+
+
وحید محمدی - وبلاگ وحیدمی