بسم الله الرحمن الرحيم
سأقوم في هذا الدرس ببرمجة عكسية لملف تنفيذي فارغ و نقوم بإخراج صندوق رسالة
اللأدوات المستعملة :
Debugger: ollydbg
مجمع Masm32 : Win32Asm
و الأهم عقل قادر على التركيز
الخطوات التي سنمر بها :
الخطوة الأولى:
سنستعمل مترجم Masm32 و نكتب هيكل عظمي لبرنامج قابل للتنفيذ النقال Pe
الخطوة الثانية:
ننتقل الىollydbg و نبرمج عكسيا : ينقسم الى قسمين
الأول : نكتب البيانات التي سنحتاجها (عنوان الرسالة,محتوى الرسالة,بارامتر الدوال التي سنستعملها)
الثاني : سنكتب الكود
الخطوة الأخيرة
نقوم بتسجيل التغييرات و نشغل البرنامج
نبدأ بالشرح:
الخطوة الأولى:
نكتب الكود التالي في مترجم Masm32 :
.386
.model flat,stdcall
option casemap:none
.data
text db 0
.code
start:
ret
end start
ملاحظة:
في قسم data. (قسم البيانات) وضعت متغير و ذلك عند عمل تجميع
سيعلم المترجم أنه هناك قسم بيانات و بذلك ينشأ قسم خاص بالبيانات في الملف التنفيذي سنستعمله لاحقا عندما نبرمج البرنامج عكسيا للإضهار صندوق رسالة
في قسم code. و ضعت تعليمة ret ليعلم بوجود كود في البرنامج
كود للملف التنفيذي سنستعمله لنبرمح فيه عكسيا و يضيف قسم
واللآن قم بعمل تجميع للكود
الخطوة الثانية:
قلنا أولا سنكتب البيانات التي نحتاجها في قسم البينات
البيانات اللازمة للإخراج صندوق نص :
دالة MessageBox تأخذ 4 بارامتر:
1/الزر: و سنضعه 0 ليخرج لنا زر Ok
2/عنوان صندوق الرسالة (سنكتبه في قسم البيانات)
3/محتوى الرسالة (سنكتبه في قسم البيانات)
4/المقبض و هنا ليس لدينا مقبض سنضعها 0
سؤال : لكن نحن لم نحمل المكتبة التي تتحتوي على هذه الدالة ماذا نفعل؟
جواب:
بمأننا لم نحمل هذه الدالة في البرنامج الحل هو استعمال
الدالتين GetProcAddress و LoadLibrary
بعضكم يقول أن هاتين الدالتين لم نحملهم أيضا في البرنامج و لكني جربتها و اشتغلت, هل من أحد يفسر سبب الإشتغال؟
حسب ما أظن أن نظام التشغيل يقوم بتحميلهم تلقائيا ليشغل نفسه, هل من تفسير آخر؟
تعريف الدوال :
LoadLibrary/1 :هذه الدلة تقوم بتحميل مكتبة من خلال إسمها
و تأخذ بارامتر واحد وهو اسم المكتبة المراد تحميلها,اسم المكتبة سنكتبه في قسم البيانات وهي "user32.dll" التي تحتوي على دالة
MessageBox
GetProcAddress/2 : تقوم بجلب عنوان الدالة في البروسيسور
من خلال اسمها الذي سنكتبه في قسم البيانات وهي تأخذ بارامترين
1/ يمثل مقبض الذي يعرف المكتبة,سنضع eax وهي القيمة المرجعة
من الدالة السابقة
2/اسم الدالة التي نريد جلب عنوانهاوهي MessageBox التي
سنكتبها في قسم البيانات ونضيف لها حرف A حيث تصبح MessageBoxA
البيانات التي سنكتبها:
اسم المكتبة : User32.dll
اسم الدالة : MessageBoxA
عنوان صندوق الرسالة : RE World
محتوى الرسالة : !Hello RE World
لنشرع في كتابة البيانات:
نفتح الملف المستخرج بالديبغر, سوف يظهر لك نفس مافي الصورة
1/في قسم البيانات نعمل كليك على أول بايت في العنوان 402000
ومن لوحة المفاتيح نضغط على CTRL+E
تخرج لنا نافذة جديدة نختار ASCII ونكتب اسم المكتبة
2/ نختار أول بايت في العنوان 402010
نفذ نفس العملية السابقة و نكتب اسم الدالة
3/نختار أول بايت في العنوان 402020
نفذ نفس العملية السابقة و نكتب عنوان صندوق الرسالة
4/نختار أول بايت في العنوان 402030
نفذ نفس العملية السابقة و نكتب محتوى الرسالة
وفي الإخير سنتحصل على ماهو في الصورة
أرجو أنكم فهمتم هذه الخطوة
في قسم الكود من olly نعمل كليك يمين على التعليمة retn ونختار
Assemble
1/ سنستعمل الدالة الأولى لتحميل المكتبة
أولا ندفع اسم المكتبة المراد تحميلها من خلال عنوانها
نكتب الأمر : Push 402000
ثم نضغط Assemble
ثانبا نطلب تنفيذ دالة تحميل المكتبة
بكتابة الأمر : Call LoadLibraryA
ثم نضغط Assemble
تنبيه : لا تنسو كتابة الحرف A بعد الدالة السابقة
2/نستعمل الدالة الثانية
ندفع اسم الدالة المراد جلب عنوانها
نكتب الأمر : Push 402010
ثم نضغط Assemble
ثم ندفع معرف المكتبة التي تجد فيها الدالة السابقة
بكتابة الأمر : Push eax
ثم نضغط Assemble
ثم نطلب تنفيذ دالة جلب العنوان
بكتابة الأمر : Call GetProcAddess
3/تنفيذ دالة اضهار صندوق رسالة
ندفع معرف الزر Ok
بكتابة الأمر : Push 0
ثم نضغط Assemble
ندفع عنوان صندوق الرسالة
بكتابة الأمر : Push 402020
ثم نضغط Assemble
ندفع محتوى الرسالة
بكتابة الأمر : Push 402030
ثم نضغط Assemble
ثم ندفع المقبض و قلنا سنضعه 0
بكتابة الأمر : Push 0
ثم نضغط Assemble
ثم نطلب تنفيذ دالة اخراج رسالة صندوق
بكتابة الأمر : Call ُEAX
لماذا EAX : للأن بعد تنفيذ دالة جلب عنوان يصبح EAX يشير الى
عنوان الدالة التي جلبناها
وأخيرا نرجع التعليمة ret
و سنتحصل على مافي الصورة:
نمر الى الخطوة الأخير وهي تسجيل:
أولا نقوم بعمل Select لكل ماأضفناه في قسم البيانات
ثم كليك يمين نختار Copy to executable file
راقب الصورة :
ستخرج لك نافذة جديدة لا تفعل شيئ فقط قم بالرجوع الى النافذة السابقة
و اللآن سنقوم بنفس العملية لكن في قسم الكود
نقوم بعمل Select لكل ماأضفناه في قسم الكود
ثم كليك يمين نختار
Copy to executable --> َAll modifications --> Copy all
ستخرج لك نافذة جديدة فيها الكود الذي أضف
قم بعمل كليك يمين عليه و اختار Save File اكتب اسم الملف ثم Save
قم بتشغيل البرنامج :
وتخرج رسالة ترحب بعالم البرمجة العكسية
الحمد لله الذي أعانني على إنهاء الدرس
أرجو أنكم فهتم الدرس و أنا أنتظر نقدكم له
السلام عليكم و رحمة الله و بركاته
