Pure Assembly



بنام خدا


عنوان پست


اسمبلی خالص (ناب):


آدرس پست


https://vahidmy.blog.ir/post/38




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

این برنامه درواقع همان نرم افزار مشهور  Hello world است اما بصورت  اسمبلی خالص و ناب (اسمبلی سطح پایین).

ضمنا این نرم افزار فقط یک سکشن دارد و این یعنی اینکه  دارای کوچکترین سایز برحسب کیلوبایت می باشد و از معماری فشرده ای برخوردار است.  حجم این نرم افزار ویندوزی که بطور کامل با زبان اسمبلی ساخته شده است فقط  1 کیلوبایت یعنی دقیقا  1024 بایت می باشد  .


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


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


; Example of making 32-bit PE program as raw code and data  similar to Machine code programming style.
; Example of tiny (one section) Win32 program .


format PE GUI


; no section defined - fasm will automatically create .flat section for both  code and data, and set entry point at the beginning of this section.


        push    0      ; 0 = MB_OK
        push    caption
        push    message
        push    0
        call    [MessageBoxA]

        push    0
        call    [ExitProcess]


caption db 'Win32 assembly program',0
message db 'Hello World!',0




;  Linker :


data import

  dd 0,0,0,RVA kernel_name,RVA kernel_table

  dd 0,0,0,RVA user_name,RVA user_table
  dd 0,0,0,0,0

  kernel_table:
    ExitProcess dd RVA _ExitProcess
    dd 0
  user_table:
    MessageBoxA dd RVA _MessageBoxA
    dd 0

  kernel_name db 'KERNEL32.DLL',0
  user_name db 'USER32.DLL',0

  _ExitProcess dw 0
    db 'ExitProcess',0
  _MessageBoxA dw 0
    db 'MessageBoxA',0


end data




توضیح : 


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

بطور کلی در زبان اسمبلی برای برنامه نویسی تحت محیط سیستم عاملهای مدرن مثل ویندوز ، لینوکس , مک ,  اندروید  و ......  باید از عبارت  format استفاده شود .  کاملا واضح است که منظور از  format چیست :  فرمت یا قالب  یا نرم افزار یا همان  معماری نرم افزار .


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


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


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


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


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


یکی از مزایای زبان اسمبلی اینست که بشدت انعطاف پذیر و قابل سفارشی شدن است یعنی ما می توانیم  حتی  لینکر  زبان اسمبلی را شخصا  با دست نوشته و به صلاحدید خود آنرا  سفارشی کنیم.  دستی بودن لینکر زبان اسمبلی قابلیت حمل این زبان روی انواع  سیستم عاملها  را   امکان پذیر می کند.  در واقع , زبان اسمبلی مثل موم  در دستان برنامه نویس ,  تغییر شکل می دهد. 


 زبان اسمبلی این توانایی را دارد که سورس برنامه را  تنها با فشردن یک کلید (کلید F9مستقیما به فایل باینری نهایی (exe یا dll  یا  sys) تبدیل کند . یعنی تمامی مراحل مربوط به compile  ،  Build  ،  Run   در زبان اسمبلی در کمتر از 1 ثانیه و تنها با فشردن یک کلید   انجام می شود و زحمت برنامه نویس را کم می کند  و در وقت صرفه جویی می کند .  


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



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




عبارت  RVA    که  در بخش لینکر می بینید مخفف این عبارت است :

Relative virtual address


یعنی آدرس مجازی رابطه ای .


شما در هنگام برنامه نویسی با زبان ماشین  در محیط هگز ادیتور  ، با این  RVA  زیاد سروکار خواهید داشت .

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


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


سطح پایین ترین حالت ، زمانی است که شما تمامی کدهای هگزادسیمال درون یک نرم افزار را مستقیما به درون  زبان اسمبلی  کپی کرده و بعد کلید F9 را فشار دهید .  اتفاق جالبی رخ می دهد و اون نرم افزار با پسوند  bin  مجددا بازتولید می شود که بعد می توانید با دست  پسوند اش را به  exe یا  dll  یا  sys  تغییر دهید . 



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


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



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

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



شاید از اینکه مجبور باشید نام  هر تابع ویندوزی را  بجای یکبار  چندین بار بنویسید  معذب باشید . ولی خب کم کم به مرور زمان  به این وضع عادت می کنید !!!


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


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

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


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


من عادت دارم از درون خودم انرژی بگیرم  بنابراین به تشویق  مردم و انگیزه و روحیه    نیازی ندارم  ( من یک انسان  درونگرا  هستم  .  ما درونگراها  انرژی لازم را از درون روح و جسم خودمان بدست می اوریم . بنابراین به تشویق مردم و حمایت جامعه  و مسئولین  و  روحیه و انگیزه  و......  نیاز نداریم  و کاملا  خودکفا هستیم .   خودمان  ،  خودبخود شارژ می شویم  )   .  به همین جهت در تنهایی و خلوت  و سکوت ،  انرژی از دست رفته را مجددا به جسم و روح و مغزم برمی گردانم و مجددا  شارژ  می شوم .  درست مثل یک باطری که بدون نیاز به برق ؛   خودش ، خودش را شارژ کند !!

+

+

+

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


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


خب . حرف دیگه بسه .  

 


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


لینک دانلود فایلهای  باینری و سورس نرم افزار  PureAssembly  :




http://bayanbox.ir/download/1536509506773062511/PureAssembly.zip



آخرین نکته:

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


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

+


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

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

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

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

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


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


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


+



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



https://vahidmy.blog.ir




بروزرسانی

براثر حملات سایبری به وبلاگ وحیدمی ؛ تمام کامنت های کاربرها و پاسخ های من به کاربرها  ؛ حذف شدند 


لعنت خدا و نفرین ملائکه بر هکرها و اتکرها و مجرمان سایبری . 


تاریخ بروزرسانی 


یکشنبه مورخ  29 مرداد 1402 خورشیدی 


نکته : 

آدرسهای  آخرین پست وبلاگ وحیدمی را در زیر مشاهده می فرمایید . 




در پناه خداوند متعال عظیم الشان باشید 

ِ

الهم  عجل  لولیک الفرج . 



امضای همیشگی اینجانب  در جهت تایید صحت و درستی مطالب وبلاگهایم   : 


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


https://vahidmy.blog.ir





https://vahidmy.blog.ir/archive


https://vahidmy.blog.ir/post/764