به نام خدا 


binary1


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


بنابراین ؛ خیلی آرام و بی سر و صدا  وبلاگ وحیدمی را رها کردم و دیگه به اون وبلاگ سنگین و پرحاشیه و جنجالی و دردسر ساز ؛ هیچ کاری ندارم . 


من به اصل خودم برگشتم : 


دنیای هگز ادیتورها 


زبان ماشین 


باینری 


برنامه نویسی با هگز ادیتور 


زبان اسمبلی 


کاربردهای هگز ادیتور 


برنامه نویسی بدون باگ 


کاربردهای زبان اسمبلی


کاربردهای زبان ماشین 


این عبارات ؛ شاید سرفصل مطالب بعدی باشند که احتمالا در آینده منتشر شوند . 


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


binary 


این ترفند ؛ چند فایده دارد : 


1. عنوان تمام پست ها با موضوع و محتوای وبلاگ  همخوانی دارد 


2. آدرس تمام پستها از خوانایی لازم برخوردار خواهند بود 


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


4. شاید بتواند جلوی سو استفاده را بگیرد !!   البته شاید !! 



شروع درس : 


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


کم کم به مرور زمان ؛ اسمبلی را کنار می گذاریم و مستقیما با زبان باینری سر و کار خواهیم داشت . 


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


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


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


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


به هرحال ؛ زبانهای ماشین و اسمبلی هرگز از هم جدا نمی شوند زیرا همانند یک روح در دو بدن می باشند . 


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


چند نمونه از ابزارهای مهندسی معکوس : 


c32asm


hexplorer


winhex


spiro memory hacking


ollydbg


ida pro


x86dbg


x64dbg


hackman


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


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


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


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


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


خب برای شروع ؛ کدهای زیر را می نویسم


AAA

 



کد AAA  ؛  دستور زبان اسمبلی است که برای ایجاد تعدیل در عملیات جمع اسکی  بکار می رود . 


این کد فقط در رجیسترهای 16 بیتی پردازنده کاربرد دارد . رجیستر AL  . 


بنابراین ؛ فقط در سیستم عامل های 16 بیتی از قبیل داس کاربرد دارد . 

یعنی فقط بخش 16 بیتی پردازنده 32 بیتی یا 64 بیتی را بکار می برد . 


بنابراین در ویندوزهای امروزی از این کد استفاده نمی شود زیرا هیچ تاثیری ندارد . زیرا ویندوزهای 32 و 64 بیتی از مدل حافظه محافظت شده و  پردازنده های مدرن استفاده می نمایند . 


یعنی هیچ ارتباطی با ناحیه 16 بیتی پردازنده های 32 و 64 بیتی ندارند . 


بنابراین ،  کد  AAA  فقط برای مقاصد آموزشی بکار می رود . 


این کد ، حاصل جمع کدهای اسکی را تعدیل کرده و نتیجه را به درون رجیستر  AL  کپی می کند . 


عدد 37 ؛  کد زبان ماشین در  مبنای هگزادسیمال است . 


هگزادسیمال یعنی شانزده تایی 


یعنی ارقام 0  تا  9  و حروف   A تا F 


عدد 37 دقیقا با کد AAA  مطابقت دارد . 


بنابراین در  باینری تمام سیستم عامل های سازگار با  پردازنده ی intel  ؛   عدد 37  دقیقا  به معنای  کد  AAA  می باشد . 


کافی است از یک  hex editor  یا  disassembler  یا  debugger  استفاده کنید و به دنبال  عدد 37 بگردید . 


37=AAA


 این رابطه ی نظیر به نظیر بین زبانهای ماشین و اسمبلی ؛ موجب می شود که به محض تسلط بر اسمبلی  بتوانید  بر زبان ماشین نیز مسلط شوید . 


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


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


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


 عدد37 همانطور که در بالا نوشتم ؛ کد زبان ماشین در مبنای هگزادسیمال است و با کد AAA زبان اسمبلی کاملا مطابقت دارد . 



سوال : منظور از باینری چیست ؟؟ 


جواب : باینری بطور کلی به زبان ماشین اطلاق می شود . 

یعنی بجای اینکه بگویند کد زبان ماشین ویندوز ؛  می گویند : باینری ویندوز 


اما زبان ماشین  یک زبان عددی است و در چهار مبنا بکار می رود که معروفترین مبنا را  باینری می نامند یعنی از ارقام   00000000  تا  11111111 


 باینری در اصل ؛ همان صفر و یک معروف است . 


اما در عرف ؛ به زبان ماشین و صرف نظر از مبنا  ؛ اصطلاحا  باینری می گویند و خودشان را راحت می کنند!! 


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


در حالیکه باینری  در اصل  فقط شامل یکی از مبناهای زبان ماشین می شود یعنی مبنای دوتایی 0 و 1 


سوال : منظور از باینری در وبلاگ باینسم ، چیست ؟؟


جواب: در اصل ؛ منظور همان 0 و 1  است ولی علی الحساب ؛ برای سهولت نگارش کدها ؛  منظورم  زبان ماشین خواهد بود یعنی زبان ماشین در مبنای هگزادسیمال .


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


ضمنا  چهار عمل اصلی یعنی جمع و تفریق و ضرب و تقسیم ؛ در  مبنای دوتایی یعنی صفر و یک ؛ دقیقتر است و  هیچ اشتباهی رخ نخواهد داد 


ضمنا  مبنای  دوتایی ؛ با سیگنالها و ولتاژهای الکتریکی و جریان برق و مدارها و قطعات الکترونیکی و سخت افزار  ؛ رابطه ی مستقیم و دوطرفه و دقیق دارد . 


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


مابقی مباحث را به پست بعدی موکول می نمایم. 


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