الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

لأول مرة دروس بالعربي فى الMASM 32

مغلق
بدأه neo في 21 أبريل 2005 · 12 رد · 1,932 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

أخوانى الكرام لاحظت أنه لاتوجد دروس باللغة العربية لبعض الأشياء المهمة مثل 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 سوف تجده فى هذه الوصلة

http://win32asm.cjb.net

وهذه وصلة لمنتديات MASM

http://board.win32asmcommunity.net/

بالأضافة الى الأداة المهمة جدا RADASM وهى بمثابة IDE رسمية للـMASM وهى شبية بالـVisual Studio

http://radasm.visualassembler.com/

أتمنى أن تستفيدوا من هذ الموضوع

الملف الملحق به مثال( سوف أشرحة بعد الدرس الرابع ) و به ملف DOC الموجود به الدرس

أسف ممكن يكون الأسلوب صعب شوية بس يريت تصححوا لى لو فى حاجة غلط

MASM 1.rar

Nothing to mention except that I am Muslim

Using your brain is not bad as you think

My Blog

logo.jpg

#2

السلام عليكم

اخى neo من قال انه لا توجد دروس فى masm32 المنتدى فيه العديد من الدروس انا كتبت بعض الدروس والاخ chik كتب العديد من الدروس ولكنها غير مثبته هناك تدرس واحد مثبت

/index.php?showtopic=47169

ولكن للاسف لم اجد التجاوب الكافى لذالك توقفت, وإذا وجد اعضاء مهتمين بالموضوع فلا مانع لدى من مواصلة الدروس.

والسلام

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#3

مكنتش أعرف أن الدروس ديه موجودة

Nothing to mention except that I am Muslim

Using your brain is not bad as you think

My Blog

logo.jpg

#4

ياريت يا شباب تحطوا رأيكم فى الموضوع

Nothing to mention except that I am Muslim

Using your brain is not bad as you think

My Blog

logo.jpg

#5

السلام عليكم

بارك الله فيك ، واستمر في عرض دروسك ، وإلا ما وجدنا عدة كتب تتكلم في شيء واحد ، لأن كل واحد له طريقة في عرض المادة العلمية.

استمر ، والله معك

ولكن لدي طلب صغير

لو جعلت هذه الدروس في ملفات pdf حتى نستطيع أن نقرأها بشكل أفضل.

والسلام عليكم.

System Engineer

Red Hat Certified Engineer

Red Hat Certificate Number

805010381752078

#6

أنا مع رأي اللأخ برق :)

==================================

#7

شكرا لكم و جاري كتابة الدرس الثانى :)

Nothing to mention except that I am Muslim

Using your brain is not bad as you think

My Blog

logo.jpg

#8

كما يقول الأخ برق عليك باستكمال موضوعاتك حتى لو كان الموضوع مكرر لأن كل واحد له طريقته في القاء الموضوع وفي كل فائده للقارئ

و بعدين واضح انك حتلقي الموضوع من وجهة نظر مختلفه عن تعلم لغة برمجه لأول مره ,

يعني نقدر نقول مرحله متقدمه من البرمجه بالأسمبلي 32 بيت وفوائد من نوع تاني غير بناء تطبيقات اعتياديه

وجزاك الله خيرا على مجهودك في كتابة هذا الموضوع

ولكن يا ريت لو عندك معلومه عن الـ Protected mode والبرمجه عليه من وجهة نظرالمعالج و برمجة نظم التشغيل وليس من وجهة نظر التطبيقات على نظام تشغيل معين

لأن الصوره المرسومه لمن يتوجه الى تعلم الأسمبلي بيكون عمل الي مبيتعملش

يعني بييجي يتعلم سي مثلا فيلاقي بعض الدوال مبهمه عباره عن صندوق مغلق فيتجه الى الأسمبلي ( أقصد 16 بيت ) ليتعلم ويفتح هذه الصناديق, الى أن يقترب من نظام التشغيل الذي يعمل عليه.

فاذا كان 16 بيت (المنقرض حاليا) فانه يتعامل معه كأنه برنامج خاص به كتبه بنفسه ويستطيع تعديل أي جزء فيه ,لأن مفيش حاجه اسمها ممنوع

أما اذا كان 32 بيت فهنا يتم اغلاق كل الأبواب ويتجه الى معرفة ما يسمح به النظام الى المستخدم وما يحرمه منه ويلجأ الى معرفة الــ API الخاصه بنظام التشغيل , ولا يقترب من الأماكن المحظوره عليه والا فعليه باعادة تشغيل الجهاز أو البرنامج على الأقل لأن أحدهما توقف والشاشه المعروفه ظهرت.

على سبيل المثال في الدوس كان بامكانك استخدام دوال الادخال والاخراج مع المنافذ دون مانع

مثل in,out

وفي نظام windows 9x يسمح لك بهذه الوظيفه مع انه 32 بيت , ولكن في أنظمة NT مثل XP , 2k لا يسمح بهذا ولا تعرف السبب

لذلك اعتقد ان تعلم الأسمبلي من وجهة نظر المعالج نفسه وبرمجة نظم التشغيل تعتبر أكثر أهميه من تعلمها من وجهة نظر نظام تشغيل معين بالصلاحيات التي يعطيها للمستخدم.

لأن الهدف من تعلم الأسمبلي في الغالب يكون لتسوية امور تعجز عن القيام بها في لغه غيرها , كما أنها تكون من باب حب الاطلاع , وليست كلغه برمجه أساسيه للتنفيذ مشروعات كبيره مثل مشاريع قواعد البيانات أو مشاريع تعتمد في كثيرمن عملها على الرياضيات والعمليات الحسابيه والتحويل من نوع من البيانات الى نوع آخر

كان لي تعليق أرجوا أن تقبله

اقتباس
MASM 32 Example

invoke MessageBox 0,"Hi people I am here to help you","Example",0

mov EAX,ReSuLT

لن يقبل الأسمبلر منك هذا المثال لسبب بسيط وهو أن الدوال لا تأخذ نصوص وانما تأخذ عنوان هذه النصوص في الذاكره

لاحظ ان الداله تأخذ 4 باراميترات ,كل باراميتر بطول 4 بايت فقط ,أي أن الداله تتعامل مع 16 بايت فقط كــ باراميترات

1 - قابض النافذه

2 - موقع نص الرساله في الذاكره وليس النص نفسه

3 - موقع عنوان الرساله (Titale) في الذاكره

4 - مواصفات الرساله كما اوضحت

الطريقه التي يعمل بها الأسمبلر بهذا الشكل

eMsg db "Hi people I am here to help you",0
eTit db "Example",0

invoke	MessageBox,hWnd,ADDR eMsg,ADDR eTit,MB_OK
mov EAX,ReSuLT

أما في السي فالمترجم هو المسؤل عن وضع النصوص في الذاكره و تمرير عناوينها الى الدالة التي تحتاجها

بالتوفيق

#9

أنا أعرف أن الدوال الـAPI الموجودة فى النظام يتم التعامل معه عن طريق العنوان وليس السلسة الحرفية و لكني تعمدت تركها كذلك حتى يكون هناك نوع من أنواع التحدي للمدتئين فى أكتشاف المشكلة و معرفة الخطأ

بالأضافة الى أن هناك الكثير فى البداية هناك ثالثة دروس على الأقل للبدء

ثم فى نهاية هذه الدروس سوف نتحدث عن ( Debugers , PE structure , ODBC , VXD ) بأستفاضة

و طرق عمل البرنامج يقبل الـPlug-ins و هاكذا

و لكن كل شئ محتاج الى وقت لذلك علينا التروى :)

وشكرا لأهتمامكم

Nothing to mention except that I am Muslim

Using your brain is not bad as you think

My Blog

logo.jpg

#11

السلام عليكم و رحمة الله و بركاته

أخي الكريم نيو

حقيقة أنا لست مبرمجاً متخصصا في هذا المجال و لكني أقول لك حقيقة هذا الموضوع أكثر من رائع و أكثر من مهم فأنت بهذا الموضوع تلمس صلب البرمجة في الحاسب الألى لأن لغة الأسمبلي من اللغات المهمة جداً فأرجوا منك الأستمرار و عدم الفتور لعدم وجود تجاوب من السادة القراء ، و أنا أقترح أن يتم ترجمة الــ help الخاص ببرنامج masm 32 مع النزول أكثر لمستوى المبتدئين و أرجو من الله أن يساعدك فيما تقوم به و جزاك الله خيراً عن ما تفعله و يا رب تكمل

و شكراً

و السلام عليكم و رحمة الله و بركاته

itasmallbanner.png
#12

أن شاء الله سوف أكمل الموضوع لانى كل لما بكتب حاجة بتعلم منها المهم أن شايف أن بدل ما نبدأ ببرنامج Hello world الى كل الدنيا بتبدئ بيه أن نبدأ بداية قوية تخلي القراء يتلهف لمعرفة المزيد و زيادة الرغبة فى التعلم لذلك بعد الدرس الثالث و الذى نكون به غطينا أساسيات برامج الويندوز سوف أضع أمثلة ثقيلة للأستفادة الحقيقية

Nothing to mention except that I am Muslim

Using your brain is not bad as you think

My Blog

logo.jpg

#13

السلام عليكم

بحييك اخي Neo على المبادره والشرح ,,

ان شاء الله رح اكون من متبعين دروسك فاني طموح في تعلم الاسمبلر 32 ...

تحياتي ,,

هذا الموضوع مغلق.

مواضيع مشابهة