به نام خدا
programming-by-hex-editor-part-4
برنامه نویسی با هگز ادیتور - قسمت 4
کاربران عزیز . سلام . امیدوارم که حالتان خوب باشد .
طبق قولی که در پست قبلی دادم قرار شد بدون مقدمه چینی ، مراحل برنامه نویسی با هگز ادیتور ( برنامه نویسی با زبان ماشین ) را آموزش دهم .
شروع تدریس :
من در پست قبلی ، درباره ی اولین بخش از معماری نرم افزارهای ویندوز یعنی هدر سیستم عامل داس صحبت کردم .
حقیقت اینست که متاسفانه در بسیاری از منابع آموزشی اعم از مستندات شرکت مایکروسافت یا فایلهای هدر ویندوز ( فایلهای با پسوند h در زبان سی پلاس پلاس و فایلهای با پسوند inc در زبان اسمبلی ) و همچنین فایلهای pdf آموزشی و نرم افزارهای مهندسی معکوس و ابزارهای مختلف برنامه نویسی ، هیچ توضیح کامل و واضح از تک تک اجزای تشکیل دهنده ی هدر داس داده نشده است .
لذا اطلاعات اینجانب محدود به همین فایلها می باشد و اگر اشتباه یا نقص در نوشته های اینجانب مشاهده نمودید باید بدانید که من بی تقصیر هستم زیرا عینا همان چیزی را به شما آموزش می دهم که مستندات رسمی به من یاد داده اند و من هرگز نمی توانم از پیش خودم چیزی در بیاورم .
درواقع، شرکت مایکروسافت هیچوقت تمام اسرار ویندوز را فاش نکرده و نخواهد کرد . معماری نرم افزارهای ویندوز نیز جزو اسرار این شرکت است .
فقط این را بدانید که چیزهایی مثل هدر داس ، درواقع ؛ ساختار یا استراکچر می باشند
ساختارهای ویندوز در زبانهای برنامه نویسی مختلف به شکلهای مختلف نوشته می شوند .
من شکل کلی و عمومی ساختار هدر داس و محتویات اش را اینجا با دست می نویسم :
structure DOS HEADER
e_magic ; Magic Number =4d5a=MZ
e_cblp ; Bytes on last page of file
e_cp ; pages in file
e_crlc ; reallocations
e_cparhdr ; size of header in paragraphs
e_minalloc ; minimum extra paragraphs needed
e_maxalloc ;maximum extra paragraphs needed
e_ss ;initial (relative) ss value
e_sp ;initial sp value
e_csum ; checksum
e_ip ; initial ip value
e_cs ; initial (relative) cs value
e_ifarlc ; file address of relocation table
e_ovno ; overly number
خب ، حالا اگر این ساختار را از درون برنامه ی c32asm مشاهده می کنید ، باید با یک علامت مربع مواجه شده باشید . روی علامت مربع ، کلیک کنید تا منوی کشویی باز شود .
ادامه ی اجزای ساختار هدر داس :
عبارت کنار علامت مربع ، e_res می باشد :
1 ; reserved words array 1
2 ; reserved words array 2
3 ; reserved words array 3
4 ; reserved words array 4
e_oemid ; oem identifier (for e_oeminfo)
e_ominfo ; oem information ; e_oemid specific
نکته : این دو مورد آخری ، عملا نوعی ابزار جاسوسی و جمع آوری اطلاعات می باشد . حالا فرقی نمی کند که اطلاعات کاربران خانگی را جمع اوری کند یا اطلاعات همکاران خود مایکروسافت را !!
بهرحال، ابزار جاسوسی محسوب می شوند . این ثابت می کند که ویندوز از همان روز اول ، یک جاسوس افزار بوده و با اهداف جاسوسی و تخلیه ی اطلاعاتی ، ساخته شده است .
روی مربع کنار عبارت e_res2 کلیک کنید تا محتویاتش آشکار شوند:
1 ; reserved words array 1
2 ; reserved words array 2
3 ; reserved words array 3
4 ; reserved words array 4
5 ; reserved words array 5
6 ; reserved words array 6
7 ; reserved words array 7
8 ; reserved words array 8
9 ; reserved words array 9
10 ; reserved words array 10
خب اینها همانطور که نوشته شده است ،آرایه ای از کلمات رزرو شده می باشند .
نکته ی مهم : برای فهم بهتر و دقیقتر کاربرد عناصر این ساختار و سایر ساختارهای سیستم عامل ویندوز و برای رسیدن به یک درک کلی از کلیت معماری و ساختمان و هویت و عملکرد سیستم عامل ویندوز ، توصیه می کنم ، فایلهای هدر ویندوز را مطالعه نمایید . این فایلها با پسوند H در زبانهای سی و سی پلاس پلاس و یا پسوند inc در زبان اسمبلی مشخص شده اند .
فایل Windows.inc در پکیج Masm32 اطلاعات خوبی در اختیارتان قرار می دهد .
تمامی فایلهای با پسوند inc در تمامی کامپایلرهای زبان اسمبلی ( خصوصا Masm32 و Fasm ) که غالبا در فولدر inc یا include قرار دارند منابع ارزشمندی محسوب می شوند که توصیه می کنم حتما محتویات این فایلها را مطالعه نمایید .
فایلهای زیر در فولدر RosAsmFiles در اسمبلر RosAsm نیز اطلاعات خوبی را در مورد ساختارها و ثابتها و توابع ویندوز در اختیارتان قرار می دهند :
Structures.str
Functions.api
Equates.equ
DX9.str
DirectShow.gud
B_U_Asm.EXE
همچنین در پکیج FasmFull نیز می توانید با صدها فایل کتابخانه ای و هدر آشنا شوید و چیزهای بسیار ارزشمندی را در مورد ویندوز ، کشف کنید .
این پکیج را می توانید از وبلاگ وحیدمی با پستی با همین نام ، دانلود نمایید .
+
در مجموع ؛ برنامه نویسی با هگز ادیتور ، کاری بسیار خسته کننده و حوصله سوز و اعصاب خرد کن است و عملا شما را از برنامه نویسی بیزار می کند و حتی ممکن است به مغز و سیستم اعصاب تان آسیب جدی برساند . زبان اسمبلی عملا زحمت شما را کم می کند و خودش تمام کارها را انجام می دهد و وقت شما را هدر نمی دهد .
برنامه نویسی با هگز ادیتور ، فقط برای سیستم عاملهای ساده و کوچک ، کاری آسان و راحت است اما برای سیستم عاملهای بزرگ و مدرن که معماری بسیار بزرگ و تو در تو و پیچیده دارند ، برنامه نویسی با هگز ادیتور واقعا خسته کننده و حوصله سوز و کسالت بار است .
+
+
+
ادامه ی بحث اصلی :
من عینا این عبارات را می نویسم زیرا من چیزی بیشتر از آن مقدار که مستندات مختلف در اختیارم قرار می دهند نمی دانم و قطعا نمی توانم خیالبافی و رویاپردازی نمایم و باید اطلاعات بسیار دقیق و مستند و علمی به کاربران تحویل دهم .
من چیزی بیشتر از مستندات ، نمی دانم و نمی توانم از پیش خودم چیزی به زبان بیاورم .
دنیای مهندسی ، جایی برای تخیلات و توهمات و رویا پردازیهای کارگردانهای سینما نیست . در دنیای مهندسی همه چیز دقیق و عینی و مستند و معتبر می باشد .
حالا به آخرین و مهمترین بخش از ساختار هدر داس یعنی عبارت e_ifanew می رسیم :
روی عبارت e_ifanew در کادر مربوطه در برنامه ی c32asm کلیک نمایید :
e_ifanew ; file address of new exe header
طبق توضیح بالا ؛ این عبارت ، آدرس هدر جدید فایل اجرایی می باشد یعنی ادرس شروع هدر فایل را به ما نشان می دهد . این عبارت خیلی مهم و کاربردی است و عملا معکوس آدرس مجازی منتسب به شروع هدر بعدی فایل اجرایی ( هدر فایل ) را به ما نشان می دهد .
اگر این آدرس را که در ستون وسط هگز ادیتور ، بصورت 80000000h نمایش داده شده است را از حالت معکوس به حالت عادی برگردانیم به عدد 00000080h می رسیم که اگر این آدرس را در هگز ادیتور جستجو نماییم ، به این کد زبان ماشین ، در ستون وسط هگز ادیتور برخورد می کنیم:
80000000h
البته آدرس 00000080h را نمی توان در درون فایل دید اما می توان در نوار پایین هگز ادیتور مشاهده نمود . ( باید به تسکبار پایین هگز ادیتور نگاه کنید . جلوی عبارت address یا offset) .
این کد ، درواقع آدرس جایی است که هدر جدید فایل یعنی File header شروع می شود
در این آدرس ما با کد هگز معتبر و معروف 50450000 در ستون وسط هگز ادیتور و دقیقا بعد از برنامه ی داس ، برخورد می نماییم که معادل با کاراکتر PE ( در ستون راست هگز ادیتور ) می باشد و عملا امضای فایلهای PE محسوب می شود و ثابت می کند که فایل مورد نظر ما یک نرم افزار قابل حمل ویندوزی می باشد .
خب ، از عبارت PE که می توانیم انرا بعد از پیام متنی برنامه ی داس ، ببینیم ، هدر فایل شروع می شود .
هدر فایل یا بهتر است بگویم ساختار فایل هدر را در جلسه ی بعد تشریح و رمزگشایی خواهم کرد . انشاء ا...
+
همانطور که در بالا گفتم ، متاسفانه بسیاری از فایلهای آموزشی و مستندات رسمی و غیررسمی و حتی فایلهای هدر ، اطلاعات اندکی را بصورت مبهم در مورد تک تک اجزای ساختار هدر داس به ما ارائه می دهند .
لذا عملا نمی توانم چیز زیادی در مورد هدر داس در اختیارتان قرار بدهم . جز اینکه بگویم که شما در برنامه نویسی با هگز ادیتور می توانید خیلی راحت ، هدر داس را از یک برنامه به برنامه ی دیگر ، کپی کنید .
بله با یک کپی ساده ی کل هدر داس از نرم افزارهای ویندوز به نرم افزار مورد نظرتان ، بخش اولیه ی نرم افزارتان خودبخود ساخته شده و کافیست آنرا Save نمایید .
درواقع ، هیچکدام از عناصر هدر داس ، در هیچ نرم افزار یا درایور یا کتابخانه ی ویندوزی ، هیچ تفاوتی با هم ندارند یا اگر هم داشته باشند این تفاوت اندک و قابل چشم پوشی است .
بنابراین برای برنامه نویسی با زبان ماشین ، کافیست هدر داس را از درون یکی از نرم افزارهای ویندوز به درون نرم افزارتان کپی نمایید زیرا تقریبا ثابت است و چیز زیادی برای رمزگشایی ندارد .
+
کار اصلی ما از هدر فایل و البته هدر اختیاری شروع می شود .
البته هدر فایل و هدر اختیاری را نیز می توانید با یک کپی ساده از درون یک نرم افزار ویندوزی به درون نرم افزارتان ، بسازید و فقط کافیست یکسری تغییرات کوچک ایجاد کنید که من در پستهای بعدی ، این تغییرات کوچک را توضیح خواهم داد .
+
در مجموع ، برنامه نویسی با هگز ادیتور ؛ آنقدر هم که خیال می کردید سخت و دشوار و خسته کننده نیست و می توان حتی با یک کپی ساده از کل معماری نرم افزارهای ویندوزی ، نرم افزار خودمان را بسازیم !!!!!
البته اینکار ، خلاف شرع و خلاف قانون است و یک بی اخلاقی بزرگ محسوب می شود و عملا اعتبار زبان ماشین را زیر سوال می برد .
اما اگر بخواهید بصورت بایت به بایت ، یک نرم افزار ویندوزی را با دست بسازید به چند چیز مهم و ضروری نیاز دارید :
1- صبر و حوصله ی بسیار بسیار زیاد
2- انرژی بسیار زیاد
3- علاقه ی شدید به مباحث مهندسی معکوس
4- علاقه ی شدید به باینری و معماری نرم افزارهای ویندوز
5- علاقه ی شدید به زبان اسمبلی
6- مطالعه ی مستندات مربوط به معماری نرم افزارهای ویندوز
7- علاقه ی شدید به زبان ماشین
8- علاقه ی شدید به هگزادیتورها
9- کنجکاوی شدید
10- علاقه ی شدید به رمزگشایی
11- علاقه ی شدید به توابع API و ساختارها و ثابتهای سیستم عامل ویندوز
12- علاقه ی شدید به تمامی کامپایلرهای زبان اسمبلی
13- علاقه ی شدید به مطالعه ی فایلهای هدر سیستم عامل ویندوز
14- تمرکز محض روی زبانهای برنامه نویسی سطح پایین ( ماشین و اسمبلی )
15- نفرت شدید از زبانهای سطح بالا خصوصا زبانهای سی و سی پلاس پلاس
16- سابقه ی برنامه نویسی حرفه ای با زبان اسمبلی تحت ویندوز
17- نفرت شدید از ویژوال استودیو و دلفی و فریم ورک دات نت
18- نفرت شدید از سیستم عاملهای ابری مثل ویندوز 365
19- علاقه ی شدید به سخت افزار و برق و الکترونیک
20- علاقه ی شدید به مباحث مربوط به تزریق کد و هک ویندوز
21- علاقه ی شدید به نسخه های قدیمی و اصیل سیستم عامل ویندوز ( از ویندوز 3 تا ویندوز XP )
22- نفرت شدید از نسخه های جدید و غیراصیل ویندوز ( از ویندوز ویستا تا ویندوز 11 و 365 )
23 - برنامه نویسی همزمان با چندین کامپایلر زبان اسمبلی
24- بازنویسی دستی تمام هدرها و کتابخانه های زبان سی و سی پلاس پلاس به زبان اسمبلی در جهت سهولت برنامه نویسی حرفه ای با زبان اسمبلی
23- بازنویسی دستی تمامی اجزای MSDN برای زبان اسمبلی و پرهیز کامل از زبانهای سی و سی پلاس پلاس
24- عضویت در انجمنهای زبان اسمبلی ( مثل انجمن فلت اسمبلر )
25- غیرت داشتن روی زبانهای واقعی کامپیوتر ( ماشین و اسمبلی )
26- دور ریختن تمام زبانهای سطح بالا البته بجز مستندات و کتابخانه ها و هدرهایشان .
مستندات و کتابخانه ها و هدرهایشان را برای بازنویسی برای زبان اسمبلی ، حتما روی هارد نگه دارید .
27- بازنویسی دستی تمام منابع اموزشی Windows 10 SDK برای زبان اسمبلی
28- استفاده از ابزارهای مهندسی معکوس رایگان و نامحدود در جهت رمزگشایی از زبانهای سطح بالا و ویندوز و پلتفرم دات نت و سپس بازنویسی تمام اینها برای زبان اسمبلی و ماشین .
29- جستجوی وب برای لغاتی همچون pe file format یا pe file structure
30 - کار مداوم با انواع و اقسام هگز ادیتور . شما در تمام موارد ، به هگز ادیتور نیاز دارید . هگز ادیتور مهمترین و اصلی ترین ابزارتان می باشد .
31- دانلود کردن تمام نرم افزارهای موجود در انجمنهای زبان اسمبلی و مطالعه ی سورس کد و باینری این نرم افزارها .
اگر این خصوصیات فنی و اخلاقی را داشته باشید و البته جوان و پرانرژی و با حوصله نیز باشید انوقت است که می توانید کار نیمه تمام مرا تمام کنید و به خودتان ببالید و افتخار کنید و به خدای فناوری تبدیل شوید .
+
بهتر است واقع بین باشیم ! برنامه نویسی با هگز ادیتور ، گرچه برنامه نویسی بدون باگ ، محسوب می شود و شما را با اسرار هگز ادیتورها آشنا می نماید اما عمر نوح و صبر ایوب و گنج قارون نیاز دارد که نه من و نه شما و نه هیچ انسان دیگری این چیزها را ندارد .
در برنامه نویسی با هگز ادیتور ، شما مدام با ادرس ها و آفستها و ادرسهای مجازی نسبی و البته معکوس ادرس مجازی نسبی و ساختارهای پیچیده ی ویندوز و سایر چیزهای پیچیده و دیوانه کننده ، سروکله می زنید که واقعا روان و اعصاب تان را داغون می کند .
برای اینکه بتوانید بطور واقعی با یک هگز ادیتور ، برنامه نویسی کنید ابتدا باید بتوانید با زبان اسمبلی خصوصا فلت اسمبلر (Fasm) برنامه نویسی نمایید و در توابع ویندوز و ساختارهایش و ثابتهایش غرق شوید !!!
چندین هزار تابع API ویندوز ، چندین هزار ثابت ویندوز (Constant)، چندین هزار دستورات زبان اسمبلی (Instraction) و ماشین ( میلیونها ترکیب مختلف از کدهای هگز 00 تا FF ) ، چندین میلیون کتابخانه و هدر و .... را باید بتوانید به حافظه تان بسپارید تا بتوانید با هگز ادیتور بصورت قانونی و شرعی و مجاز و البته کاملا دستی ، برنامه نویسی نمایید و البته عمر نوح و صبر ایوب را نیز باید داشته باشید !!!
شوخی نمی کنم . کاملا جدی حرف می زنم . برنامه نویسی با هگز ادیتور نهایت مازوخیسم و خودآزاری محسوب می شود ( مگر اینکه تقلب کنید و محتویات درون نرم افزارهای دیگران را به درون نرم افزارتان کپی کنید که در اینصورت شما اصلا برنامه نویسی نکرده اید بلکه صرفا کپی کرده اید . ) .
اما زبان اسمبلی عملا زحمت شما را کم می کند .
حالا این وسط باز دوباره مباحثی همچون اختلافات گرامری کامپایلرهای زبان اسمبلی و ناسازگاری این کامپایلرها پیش می آید و ...
+
من این یکی دو روز از بس در مورد روش تدریس برنامه نویسی با هگز ادیتور در وبلاگ ام ، فکر کردم که سرگیجه گرفتم و حالم بد شد و دیدم واقعا مغزم کشش ندارد که این کار دشوار را انجام دهم .
مغزم داشت می ترکید .
الان نیز حس می کنم که دارم یک کار بیهوده را انجام می دهم . زیرا هیچکس را ندیدم که از هگز ادیتور برای برنامه نویسی استفاده نماید !!
+
اما با همه ی این سختیها و دشواریها و درگیریهای ذهنی ، سعی می کنم در پستهای بعدی در مورد سایر اجزای معماری نرم افزارهای ویندوز کمی توضیح بدهم و بحث را تمام کنم .
+
من پیشنهاد می کنم شما همان زبان اسمبلی را بکار گیرید و خودتان را خلاص کنید .
حالا هر اسمبلر که باشد فرقی نمی کند .
اصلا بگذارید شما را خلاص کنم و خیال خودم و شما را راحت کنم :
پست بعدی ، فقط یک شرح مختصر از معماری نرم افزارهای ویندوز می باشد و من پرونده ی برنامه نویسی با هگز ادیتور را برای همیشه می بندم و به همان زبان اسمبلی برمی گردم .
حالا اگر سوال کنید از کدام کامپایلر زبان اسمبلی استفاده نماییم که بیشترین نزدیکی و قرابت و سازگاری را با هگز ادیتور و زبان ماشین داشته باشد ؟؟؟ ، می گویم : فلت اسمبلر ( Fasm ) .
بله شما در فلت اسمبلر (Fasm) می توانید تمام کدهای هگزادسیمال درون شکم یک نرم افزار کامل و حرفه ای را به درون سورس برنامه تان کپی کنید سپس با فشردن کلید F9 ، یک نرم افزار ویندوزی کامل و قابل اجرا بسازید که البته پسوندش بصورت BIN می باشد ولی نگران نباشید زیرا می توانید پسوند ش را به exe تغییر دهید و بعد انرا با خیال راحت ، تحت ویندوز اجرا نمایید !!!
البته اینکار ( نوشتن کل بایتهای تشکیل دهنده ی نرم افزار ویندوزی ) بصورت دستی نیز امکان پذیر است اما برای نرم افزارهای ساده و کوچک ، کاری آسان می باشد نه نرم افزارهای بزرگ و غول پیکر !
نوشتن دستی یک نرم افزار غول پیکر و تجاری ، هفت تا عمر نوح لازم دارد !
کافیست به انجمن فلت اسمبلر مراجعه کنید تا با این شیرین کاریهای برنامه نویسان زبان اسمبلی آشنا شوید . البته انها نرم افزارهای ساده و کوچک را بطور کامل با دست و در محیط فلت اسمبلر می نویسند و کامپایل می کنند !
+
بهرحال زبان ماشین یک زبان همه منظوره است و صرفا زبان برنامه نویسی نیست اما برنامه نویسی با زبان ماشین ( هگز ادیتور ) همانطور که گفتم عمر نوح و صبر ایوب و گنچ قارون لازم دارد که هیچکدام از ما این سه خصوصیت را نداریم !
+
موضوع پست بعدی وبلاگ وحیدمی ، فایل هدر و اوپشنال هدر و سکشن تیبل می باشد . داس هدر چیز خاصی برای گفتن ندارد . با یک کپی ساده ، خودتان را خلاص کنید !! فایل هدر و اوپشنال هدر و سکشن تیبل نیز قابل کپی هستند !! تنها بخشی که قابل کپی نیست و باید با دست نوشته شود ، سکشن فلت می باشد که روش ساخت این نوع سکشن را به شما اموزش خواهم داد و مابقی اجزای نرم افزار را با دست می نویسم و تمام می کنم . . . در مجموع ، طی چند پست ، پرونده ی هگز ادیتور و زبان ماشین را می بندم . انشاء ا... .
+
+
وحید محمدی - وبلاگ وحیدمی