بسم الله الرحمن الرحيم
اولا قبل أن تقرأ هذا الدرس قم بقرائة الدرس على الرابط التالي :
/index.php?showtopic=221036&st=0&p=1092210entry1092210
للأننا سنستعمله في آخر خطوة من هذا الدرس
حمل الملف المرفق و شغل البرنامج:
لدينا نافذة تحتوي على قائمة, إضغط على ReverseMe
ماذا حدث؟
لم يحدث شيئ, و ما سنقوم به في هذا الدرس هو إخراج صندوق رسالة عند الضغط على ReverseMe
الدرس سيكون على المراحل التالية:
1/ المرحلة الأولى :
*/ سنتعرف على نوعين من الرسائل التي ترسلها النافذة الى البرنامج
*/ سنرى كيف يقوم البرنامج المرفق بفحص مدخلات النافذة
2/ المرحلة الثانية من الدرس ستكون كالتالي :
*/ تحديد قفزة شرطية مناسبة نقفز بها الى عنوان فارغ إخترناه في البرنامج
*/ نقوم بالبرمجة العكسية للبرنامج و نحفظ التغييرات و نشغل البرنامج
1/ المرحلة الأولى
*/أنواع الرسائل :
WM_DESTROY : هذه الرسالة ترسلها النافذة الى البرنامج لتطلب منه أمر الإقفال عند الضغط على زر قفل
WM_COMMAND : هذه الرسالة ترسلها النافذة الى البرنامج عند الضغط على زر ما
(مثل : ReverseMe )
هناك الكثير من الرسائل التي ترسلها النافذة الى البرنامج, هاتين الرسالتين أكيد ستجدهم في أغلب البرامج
هذه الرسائل تقارن مع متقبل الرسائل إسمه UINT و في ollydbg ستجده دائما [ARG.2]
يعني عندما تراى في olly [ARG.2] إعرف أنه متقبل الرسائل
*/ كيف يقوم البرنامج بفحص المدخلات
افتح البرنامج في ollydbg ستجد أنه يوجد 3 اجرائات, الأول عند العنوان 401000
الثاني في 401031 و مايهمنا هو الثالث في 401118 وهو الذي يهمنا إذهب إليه
شاهد الصورة1:
ماذا لدينا:
1/ مقارنة [ARG.2] مع الرسالة 2 (2=WM_DESTROY) تتحقق عند الضغط على زر قفل
2/ قفزة شرطية تكون صالحة للقفز الى العنوان 40112A عندما لاتتحقق المقارنة (رقم 1 في الصورة)
3/ أن تحققت المقارنة (رقم 1 في الصورة) ينفذ البرنامج أمر الإقفال ثم يقوم بقفزة غير شرطية الى العنوان 40113F وهي نهاية الإجراء أو نهاية عملية فحص مدخلات النافذة
هذا المبدأ من عملية فحص المدخلات ستجده يتكرر في أغلبية البرامج
2/ المرحلة الثانية
*/ تحديد قفزة مشروطة مناسبة
سنبحث عن قفزة مشروطة و نغيرها الى بداية الكود الخاص بنا
بمأن هذا الإجراء فيه قفزة مشروطة واحدة فإنها هي التي نبحث عنها (رقم 2 في الصورة)
عنوانها : 40111F
ثم نختار بداية مكان فارغ في البرنامج لنحقن فيه الكود الصورة 2:
أنا سأختار العنوان 40119C
نقوم أولا بتغيير القفزة المشروطة الى عنواننا:
اذهب الى العنوان 40111F , كليك يمين , اختار Assembe , اكتب
Jne 40119c
*/ البرمجة العكسية
فكرة عن الكود الذي سنحقنه:
1/ مقارنة [ARG.2] مع الرسالة 111 (111=WM_COMMAND) تتحقق عند الضغط على زر ما (مثل : ReverseMe )
2/ إن لم تتحقق المقارنة يقفز الى 40112A مثل ماحصل في المقارنة السابقة (قفزة شرطية)
3/ إن تحققت المقارنة يخرج لنا صندوق رسالة ثم يقفز الى 40113F مثل ماحصل في المقارنة السابقة أيضا
ملاحظة : قبل كتابة الكود يجب معرفة عنوان [ARG.2] في الذاكرة لنجري المقارنة
إليكم ماذا سنفعل :
اذهب الى عنوان مقارنة [ARG.2] مع الرسالة 2 (رقم 1 في الصورة1)
الى من ضل الطريق, العنوان هو : 40111F
كليك يمين , إختار Assemble
و انسخ عنوان [ARG.2] في Notepad لنستعمله شاهد الصورة3:
أنا أعرف أن هناك من لم يعرف إستخراج عنوان [ARG.2] لكن لا مشكلة سوف تجده في الكود الذي سأقدمه لمن يحب الإستهلاك فقط
إذهب الى عنواننا الذي إخترناه و هو : 40119C و اكتب الكود
الكود النهائي بالأسمبلي :
CMP DWORD PTR SS:[EBP+C],111
JNE 40112A
كود الرسالة
Jmp 40113F
كود الرسالة هو تمارين موجه لك و هو يتضمن :
الكتابة في قسم البيانات:
عنوان صندوق الرسالة
محتوى الرسالة
الكتابة في قسم الكود :
تنفيذ دالة الرسالة
هذا التمرين رأيناه في درسي الأول :
إن اجتزت التمارين قم بحفظ التغييرات (رأيناه في الدرس السابق) و شغل البرنامج
أما أنا فقد تحصلت عند الضغط على ReverseMe :
ماذا عنكم؟
الى هنا ينتهي الدرس
هذا هو ثاني درس لي و يمكن يكون آخر درس اقدمه في هذا المنتدى للأني لم أجد أي تفاعل لللأعضاء في درسي الأول يعني أن اللأعضاء لا يابهون بعالم البرمجة العكسية بتاتا
أنتظر الرد و النقد منكم و الإستفسارات عن هذا الدرس أو سابقه