به نام خدایی که باینری را آفرید 


Bitwise


ماسک گذاری روی بیت های 0 و 1 زبان ماشین 


برنامه نویسی در سطح بیت های منفرد 


اثبات این حقیقت که کوچکترین واحد حافظه در کامپیوترها ،  بیت (Bit) می باشد . 




برخلاف تصور رایج ، کوچکترین واحد حافظه در کامپیوترها  خصوصا در حافظه و پردازنده ، بایت(Byte) نیست . بلکه بیت (Bit) است . 


Bit= Binary Digit= رقم دوتایی 


باینری = دوتایی = زوج = نر و ماده = درست و غلط = 0 و 1 



گرچه ما نمی توانیم هنگام برنامه نویسی با هگز ادیتور (hex editor ) ، تک تک بیت های هشتگانه ی سازنده ی یک بایت را با دست تایپ کنیم اما می توانیم با کمک فرایندی بنام Bitwise  تک تک بیت های درون یک بایت را اصطلاحا ماسک گذاری نماییم . 


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


در پاسخ باید بگویم که بله ظاهرا نمی توانیم تک تک بیت ها را در یک hex editor  با دست تایپ و ویرایش کنیم اما لااقل می توانیم در همین محیط هگز ادیتور ، بصورت کاملا مستقیم ، تک تک بیت ها را دستکاری کنیم . یعنی بیت 0 را به 1 و بیت 1 را به 0 تبدیل نماییم . 


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


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


توجه داشته باشید که اینجا ، من رئیس هستم و شما باید حرفهای مرا حتی اگر غلط و اشتباه هستند بپذیرید و سکوت نمایید !!!


خب از شوخی بگذریم ...



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


از طرفی دیگر ، ما در برنامه هایی مثل ollydbg می توانیم دستورات اسمبلی را طوری بازنویسی و اصلاح و اجرا کنیم که محتویات رجیسترهای پرچم که فقط حاوی ارقام 0 یا 1 می باشند  ، به دلخواه ما  ؛  تغییر نمایند . 


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

یعنی مقادیر درون این رجیسترها را از 1 به 0 یا از 0 به 1 تغییر دهد . 



بنابراین همین که من بعنوان برنامه نویس زبانهای ماشین و اسمبلی می توانم حتی تک تک بیت های درون رجیسترهای پرچم را بصورت دستی یا اتوماتیک تغییر دهم نیز ثابت می کند که کوچکترین واحد حافظه  در کامپیوترها ، بیت می باشد یعنی 0 یا 1 


رجیسترهای پرچم بهترین دلیل است که ثابت کنیم می توانیم تک تک بیت های 0 و 1 را نیز به همان خوبی بایت ، ویرایش نماییم . 


بنابراین ، رجیسترهای پرچم نیز ثابت می کنند که کوچکترین واحد حافظه در کامپیوترها ، بیت یعنی 0 و 1 می باشد . 


خب فکر نکنم دیگه نیازی باشد این واقعیت محض را اینقدر پشت سرهم تکرار نمایم !!


 


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


بیت = باینری دیجیت = رقم باینری = 0 یا 1 


بایت = مجموعه ی ای از هشت بیت یعنی هشت رقم 0 یا 1 



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


به این عملیات اصطلاحا  بیتوایز  (Bitwise) یا ماسک گذاری روی بیت ها ،  گفته می شود . 


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


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


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


در زبان ماشین یا هگز ادیتور (hex editor )، عملیات  ماسک گذاری روی بیت ها بصورت کاملا دستی و کاملا مستقیم و با دقت بسیار بسیار زیاد انجام می شود . بسیار دقیقتر و بهتر و مستقیم تر از زبان اسمبلی . 


یکی از ابزارهای قدرتمند برنامه نویسی با  هگز ادیتور که اتفاقا ابزار  مخصوص ماسک گذاری روی بیت ها را نیز در اختیار ما قرار می دهد  ، Tiny hexer می باشد . 


شما می توانید تاینی هگزر را از وبلاگ وحیدمی  به آدرس vahidmy.blog.ir   دانلود نمایید . البته شاید بعدا در وبلاگ باینسم نیز  لینک دانلود این هگز ادیتور قدرتمند را قرار بدهم . 


من فرض می کنم که شما نرم افزار Tiny hexer را از آرشیو وبلاگ وحیدمی و یا از وب  خارجی ، دانلود و نصب کرده اید . 


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


1-  در نرم افزار  mirkes.de Tiny Hexer   از منوی Tools روی عبارت   Value editor کلیک می کنیم . یک کادر با همین عنوان باز می شود .


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


2- در جعبه ی Radix (مبنا )  عدد 8 را انتخاب می کنیم زیرا فعلا قصد داریم فقط روی 8 بیت یعنی 1 بایت ، عملیات را انجام دهیم . 


3- در فیلد  Value  باید کد هگز درون ستون وسط هگز ادیتور را  که قصد داریم ویرایش کنیم ، بنویسیم . مثلا 74  . 



در جعبه ی Bits  با هشت جعبه ی کوچک مواجه می شویم که با اعداد  0 تا 7  شماره گذاری شده اند . 


حالا به دلخواه خودمان  می توانیم هرکدام از این  مربع های کوچک که معادل با یک بیت یعنی یک 0 یا یک 1 هستند را تیک بزنیم یعنی با ماوس روی این مربع های کوچک  کلیک می کنیم . 


ما می توانیم تمام یا فقط یک یا چند مربع را تیک بزنیم . 


بسته به تعداد مربعهایی که انتخاب می کنیم ، کد هگز درون ستون وسط هگز ادیتور که معادل با یک بایت است ، تغییر می کند . 



4-  حالا روی دکمه ی  Apply changes کلیک می کنیم تا تغییراتی را که در سطح bit انجام داده ایم بطور  کاملا مستقیم در درون فایل ، اجرا شود . 



در مثال بالا  ، کد هگز  74  که معادل با دستور je در زبان اسمبلی اینتل می باشد بدین شکل بود که بیتهای شماره ی 2 تا 5 از قبل تیک خورده و خاکستری شده بودند . 


حالا ما با خاکستری کردن بیت های شماره ی 0 ، 2 ، 3 ، 4 ، 5  ،  شاهد تغییر کد هگز 74 به کد هگز  75 می شویم . 


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


خب حالا روی دکمه ی Apply changes  کلیک می کنیم تا نرم افزار مورد نظرمان را مستقیما از طریق هگز ادیتور و با کمک ماسک گذاری روی بیت های انفرادی ،  هک و رایگان نماییم !!



اگر بخواهیم  بجای کدهای زبان ماشین ،  کاراکترهای درون ستون سمت راست هگز ادیتور را هک نماییم باید بجای Byte از عبارت  CHAR که او نیز معادل با  8 بیت است استفاده نماییم . 


اما من توصیه می کنم که همیشه از  بایت  یعنی Byte  برای برنامه نویسی و  هک  استفاده کنید تا قدرت بیشتری به دست بیاورید . 

استفاده از CHAR  موجب می شود که شما ناخواسته به سمت زبانهای سطح  بالا  منحرف شوید و از قدرت بی انتهای زبان ماشین  غافل شوید !!


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


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


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


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


لذا کاربرها خیال می کنند که هگز ادیتورها محیطهایی مرده می باشند !!!


بله شاید اینطور به نظر برسد ولی هگز ادیتورها  ،  قبرستان و گورستان زبانهای سطح بالا و زبان اسمبلی ، محسوب می شوند اما زنده هستند و نفس می کشند !!!


لینک مربوط به  Bitwise  در ویکی پدیا انگلیسی :


Bitwise operation - Wikipedia



در زبان اسمبلی ، از دستورات زیر برای عملیات بیتوایز ( ماسک گذاری روی بیت ها ) بصورت غیرمستقیم استفاده می شود :


AND

OR

XOR

NOT

NEG

NAND


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


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


اگر قدرت و سرعت و دقت و هوشمندی و استراتژی و آزادی و انعطاف پذیری و اصالت و امنیت را می خواهید و دوست دارید یکجا از تمام این صفات خوب انسانی برخوردار شوید ،  منحصرا با هگز ادیتور (= hex editor = زبان ماشین =باینری) برنامه نویسی نمایید . 



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



وحید محمدی - مبلغ زبان برنامه نویسی ماشین (باینری)