بسم الله الرحمن الرحيم
أخوانى الكرام لاحظت أنه لاتوجد دروس باللغة العربية لبعض الأشياء المهمة مثل MASM-32 أو بطريقة أوضح Micro Assembler 32 bit أى لغة التجميع لأنظمة الـ32 بت و هذا على ما أظن السبب فى تباطئ الحركة فى بعض الدروس الأخرى الخاصة بالحماية و أكتشاف الثغرات.
الأن لابد معرفة ما الأستفادة التى سوف نجنيها من درستنا للغة كهذه أو هذا الأمتداد للغة التجميع و معرفة بعض المزايا و العيوب.
يمكن القول بأن لغة التجميع 32 بت ( للعمل الأخلافات ليس كبيرة جدا بين 16 بت و الـ32 بت سوف يتم التوضيح بعد قليل ) كما هو معروف أن لغة التجميع تبقى من أقوى اللغات و لكن هناك مشكلة دائمة ملازمة للغت التجميع و هي الصعوبة فى التعامل معة و لكن هذه المشكلة أنتهت و الأن أصبحت برمجة الأسيمبلى للـ32 سهله مثل سهولة السي و سوف أضرب مثل لأستدعاء الدالة MessageBox قى الـMASM 32 و فى لغة الـC
C Example
int ReSuLT;
ReSuLT = MessageBox (0,"Hi people I am here to help you","Example",0);
MASM 32 Example
invoke MessageBox 0,"Hi people I am here to help you","Example",0
mov EAX,ReSuLT
ماذا تلاحظ أختلاف بسيط جدا وهو أن عائد الدوال يتم وضعة فى المسجل EAX و هذه نقطة مهمة و لابد من أخذها فى الأعتبار فمثلا فى المثال السابق بعد أن قمنا بأستدعاء الدالة قمنا بوضع الناتج فى متغير ما لأستعمالة بعد ذلك حسب ما نريد و الأن لنبدأ الدرس الأول فى دروس الـMASM.
للعلم هناك أكثر من 60 درس فى جميع أنواع البرامج التى من ممكن أن تتخيلوها لذا قررت أننى سوف أقوم كل أسبوع بكتابة درس مما يتيح فرصة جيدة للتطبيق + أن الوقت بالنسبة لى ضيق جدا و الأن لنبدأ
أولا متطلبات هذا الدرس أو الدروس القادمة بشكل عام معرفة بلغة التجميع .
تعمل برامج WIN32 تحت النظام المحمي أو Protected mode و هذا النظام يمنع تداخل البرامج فى الذاكرة بين بعضها البعض يعني بمعنى أصح "محدش يمد أيدة فى طبق الى جنبة (الكلام ده لو أحنا قاعدين بناكل)" و النظام المحمى أو الـProtected mode موجود منذ فترة كبيرة و معروف منذ وجود المعالجات 80386 و الذي بني على بنائة الكثير من المعالجات و التى وصلت حتى P4 .
يقوم نظام التشغيل بتشغيل كل برنامج على حدا و لكل كل برنامج الحرية فى أستعمال عناوين بطول 32 بت أى 4 جيجا بايت عناوين و ليس معنى هذا أن لكل برنامج 4 جيجا فعليه على القرص الصلب بمعنى أصح نحن نتكلم عن نطاق العنوان الخاص البرنامج و الذي سوف يوضح بعد عدة دروس.
أما بالنسبة لتحديد نوع الذاكرة فى البرنامج فأصبح الأن غير ضروري لان نوع الذاكرة أصبح موحد و هو flat فى السابق كان هناك tiny,small, و هاكذا باأضافة الى أنك لست محتاج للتعامل مع الـSegment Register و يمكن أستعمال الـ الـsegment register للوصول الى أى عنوان فى الذاكرة فى نظاق البرنامج هذا سوف يجعل من البرمجة بلغة التجميع عملية سهله مثل سهولة لغة السي أنا لا أقصد بذلك أن البرمجة بالسي فى الأصل سهلة
هناك بعض القواعد التى لابد و ان تحفظها عن ظهر قلب, يستعمل الويندوز المسجلات esi,edi,ebp,ebx داخليا لذلك لا يتوقع الويندوز تغيير هذه المسجلات لذا عليك أعادة قيم هذه المسجلات فى حالة أستعمالها و ذلك بطريقة بسيطة جدا و هى أخذ نسخة من قيم هذه المسجلات و وضعها فى متغيرات و قبل أغلاق البرنامج فقط قم بأعادة تلك القيم الى المسجلات بذلك تتجنب أحتمال حدوث مشكلة عن أغلاق البرنامج.
هناك نقطة أخرى و هى أنه لا يوجد مجال لتداخل البرامج مع بعضها بمعنى أنه لا يمكن لبرنامج أن يقوم بتعديل جزء من الذاكرة الخاص ببرنامج أخر. و لكن هناك طريقتان (Backdoor ) يمكننا عن طريقها التعديل و عرض و التحكم كما نريد فى البرامج الموجودة فى الذاكرة و الطريقة الأولى هو أستعمال تعليمات الأمتيازات (privilege instruction ) و التى تستخدم فى بعض الأغراض الخاصة بالنظام سيتم توضيح هذه النقطة بعد قليل. أما الطريقة الثانية هى فتح البرنامج تحت نظام التنقيح و يتم هذا عن طريق الكثير من دوال API المخصصة للـhook و سيتم توضيح عملية الـhook فى الدروس القادمة بأذن الله و لكن هذا الموضوع محتاج لكثير من المعرفة حول الـمعالجات processes و أدارة الذاكرة memory management و الـThreading .
لنكمل موضوعنا هو كيفية كتابة برامج بالـMASM32 أولا لبد من معرفة و فهم هيكل البرنامج و هو بسيط و سيتم شرحة بالتفصيل و اليكم البداية الحقيقية للموضوع.
.386
.MODEL FLAT, STDCALL
.DATA
تعريف و تحديد متغيرات البرنامج التى تحتوى على بيانات مع بدء البرنامج
.DATA?
تعريف متغيرات التى سيتم أستعمالها فى البرنامج
.CONST
تعريف و تحديد ثوابت البرنامج
.CODE
< عنوان >
شفرة البرنامج
end <عنوان>
و الأن لنبداء تحليل الهيكل الاولى للبرنامج
.386
أحدى محدادات المجمع (Assembler directive) و الذي يخبر المجمع بأننا سوف نستعمل تعليمات معالج من نوع 386 يمكن أيضا أستعمنال تعليمات معالجات أخري مثل
.286 / .486 / .486p / .586 / .586p
و للكن من باب الأمن و تجنب المشاكل نستعمل .386 و لكن قبل أن نبدأ هل لاحظ أحدكم أن أنواع المعالجات منقسمة الى قسمين البعض ملحق بـp و الببعض الأخر غير ملحق بـp المهم المقصود بهذه الاحقة هو أن هذا النوع يقوم بفتح بعض الخواص و التى تسمى privileges mode و يسمح هذا النظام بظهور مسجلات لا يتم التعامل معها الا عن طريق نظام التشغيل أو هذا النوع من البرامج و تستخدم privileges mode فى صناعة برامج مثل سوقات الوحدات التخيلية Virtual Device Driver و من هنا يمكنك الوصول الى أى مكان فى الذاكرة بمعنى الكلمة أى أنه يمكنك التحكم فى بقية البرامج حتى نظام التشغيل نفسة.
.MODEL FLAT, STDCALL
.model هو أحدى محدادات المجمع (Assembler directive) و هو الذي يحدد نوع الذاكرة ( فى win32 لا يوجد غير توع واحد و هو flat ) , أما بالنسبة اـSTDCALL فهى التى تحدد طريقة التعامل مع المدخلات الدوال (Parameter) . قيل هذه النقطة لبد من توضيح شئ صغير وهو كيفية التعامل مع الرصة (Stack)
تعمل الرصة stack بشكل معاكس للبيانات بمعنى أنه كلما ذادت البيانات فى الـStack يقل الـStack pointer أو مؤشر الرصة بعدد الحروف التى ذدات أى أنه أذا قمت بدفع 15 كلمة أى 30 حرف و كان الـstack pointer قبل العملية 550 سوف يصبح المؤشر بعد العملية 520 و كلما زادت البيانات المدفوعة داخل قل الـStack pointer و لذلك نجد أن الرصة دائما تكون موجودة فى أخر الذاكرة و هذا لمنع تضارب منطقة البيانات مع البيانات المدفوعة الرصة.
النقطة الثانية هى كيفية تبادل البيانات بين البرنامج و دوال الـAPI يتم ذلك عن طريق الرصة Stack بالنسبة لأرسال متغيرات للدالة أما بالنسبة للعائد من الدالة فيتم وضعه فى الـEAX
و للعمل يجب التفرقة بين قيمة متغير و عنوان متغير لاننا فى حالة أستعمال الـنصوص نتعامل مع عنوان النص وليس النص نفس و اليكم مثال لتوضيح ما أقصدة
Push 0
Push 0f154f2
Push 0f154f2
Push 0
Call MessageBox
الدالة MessageBox دالة بسيطة جدا تقوم بأظهار رسالة للمستخدم و أظن أن 100% من الذين يقرؤن هذا الموضوع تعرضوا لهذه الدالة تتكون الدالة من أربع متغيرات الأول رقم النافذة الأب أى النافذة التى سوف تتبعها الرسالة (Handle of parent window) أما المتغير الثانى يحمل عنوان السلسلة النصية التى سيتم عرضهاText , المتغير الثالث يحمل عنوان السلسة النصية الخاصة بعنوان الرسالة Title , المتغير الرابع يكون به حالة الرسالة ( شكل الرمز Icon و نوع الأزرار- YesNo – OK)
و عند الأنتهاء من ذلك يتم أرجاع أى زر تم الضغط عليها فى المسجل EAX.
الأن لنعود مرة أخرى الى موضوعنا كنا قد وقفنا عند STDCALL و هذا المحدد يقوم بتحديد كيفية التعامل مع الدوال من ناحية كيفية تبادل المتغيرات Handeling function arguments فمثلا فى لغة السي يكون أدخال المتغيرات من اليمين الى اليسار و اليكم مثال توضيحي
TestFunc (int arg1, int arg2, int arg3);
Push arg1
Push arg2
Push arg3
Call TestFunc
Add sp, 12
كما تلاحظون هنا كيفية أرسال المتغيرات و لكن هناك شئ هو أننا قمنا بأضافة 12 الى مؤشر الرصة هذا مهم جدا لضبط توازن الرصة لاننا قمنا بدفع 3 متغيرات بطول 4 حروف
فى لغة السي يجب ضبط توازن الرصة بعد دفع المتغيرات و النداء على الدالة و لكن المبرمج لا يقوم بذلك , كل هذا يقوم به المترجم لنرا مثال أخر فى لغة البسكال يتم أدخال المتغيرات من اليسار الى اليمين
Push arg3
Push arg2
Push arg1
Call TestFunc
نلاحظ هنا عدم وجود تعليمة ضبط الرصة و هذا لان المترجم فى البسكال يقوم بوضع تعليمة الضبط فى الدالة نفسها, و لكن أحسن طريقة لتبادل المتغيرات عى طريقة السي لانها تمكنك من أستقبال عدد غير محدود من المتغيرات و لكن مشكلتها فى ضبط الرصة, فى الـMASM يستعمل طريقة لغة السي و لكن بدون الأحتياج الى ضبط الرصة.
.Data
.Data?
.Const
.Code
هذه الموجهات الأربعة تسمى المقاطع Section , يمكنك تقسيم العناوين الى مقاطع منطقية للتعامل معها Logical setion , بداية مقطع تحدد نهاية مقطع أخر و نهاية مقطع تحدد بداية مقطع أخر, هناك مجموعتان من المقاطع 2 groups of sections البيانات و الشفرة Code & Data .
مجموعة البيانات مقسم الى ثلاثة مقاطع
.Data
تحتوى على اللمتغيرات التى تحتوى على بيانات و التى يتم ضبطها فى بداء تشغيل البرنامج initialize value
.Data?
تحتوى على اللمتغيرات التى تستخدم داخل البرنامجuninitialized value
.Const
تحتوى على ثوابت و التى يتم ضبطها فى بداء تشغيل البرنامج
لست مضطر الى أستخدم و أشغال كل المحدادات directive أستخدم ما تشاء و أترك ما تشاء
.Code
يوجد مكان واحد للشفرة code و هى تحت الموجه .CODE و لابد أن يلحق بـLabel و ان ينتهر الكود بـend <label> .
هناك بعض الادوات التى سوف نحتاجها لتطبيق الدروس و هى
MASM32 وهو المجمع و المربط LINKER and Assembler سوف تجده فى هذه الوصلة
وهذه وصلة لمنتديات MASM
http://board.win32asmcommunity.net/
بالأضافة الى الأداة المهمة جدا RADASM وهى بمثابة IDE رسمية للـMASM وهى شبية بالـVisual Studio
http://radasm.visualassembler.com/
أتمنى أن تستفيدوا من هذ الموضوع
الملف الملحق به مثال( سوف أشرحة بعد الدرس الرابع ) و به ملف DOC الموجود به الدرس
أسف ممكن يكون الأسلوب صعب شوية بس يريت تصححوا لى لو فى حاجة غلط

