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

مبدأ من مبادئ الهندسة العكسية : للمبتدئين

بدأه Z3r0n3 في 12 مايو 2010 · 10 رد · 3,871 مشاهدة · في المواضيع المميزة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

سأقوم في هذا الدرس ببرمجة عكسية لملف تنفيذي فارغ و نقوم بإخراج صندوق رسالة

اللأدوات المستعملة :

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

لنشرع في كتابة البيانات:

نفتح الملف المستخرج بالديبغر, سوف يظهر لك نفس مافي الصورة

post-228541-12736806461049_thumb.jpg

1/في قسم البيانات نعمل كليك على أول بايت في العنوان 402000

ومن لوحة المفاتيح نضغط على CTRL+E

تخرج لنا نافذة جديدة نختار ASCII ونكتب اسم المكتبة

2/ نختار أول بايت في العنوان 402010

نفذ نفس العملية السابقة و نكتب اسم الدالة

3/نختار أول بايت في العنوان 402020

نفذ نفس العملية السابقة و نكتب عنوان صندوق الرسالة

4/نختار أول بايت في العنوان 402030

نفذ نفس العملية السابقة و نكتب محتوى الرسالة

وفي الإخير سنتحصل على ماهو في الصورة

post-228541-12736806897545_thumb.jpg

أرجو أنكم فهمتم هذه الخطوة

في قسم الكود من 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

و سنتحصل على مافي الصورة:

post-228541-12736807160001_thumb.jpg

نمر الى الخطوة الأخير وهي تسجيل:

أولا نقوم بعمل Select لكل ماأضفناه في قسم البيانات

ثم كليك يمين نختار Copy to executable file

راقب الصورة :

post-228541-12736807442592_thumb.jpg

ستخرج لك نافذة جديدة لا تفعل شيئ فقط قم بالرجوع الى النافذة السابقة

و اللآن سنقوم بنفس العملية لكن في قسم الكود

نقوم بعمل Select لكل ماأضفناه في قسم الكود

ثم كليك يمين نختار

Copy to executable --> َAll modifications --> Copy all

ستخرج لك نافذة جديدة فيها الكود الذي أضف

قم بعمل كليك يمين عليه و اختار Save File اكتب اسم الملف ثم Save

قم بتشغيل البرنامج :

post-228541-12736807837673_thumb.jpg

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

الحمد لله الذي أعانني على إنهاء الدرس

أرجو أنكم فهتم الدرس و أنا أنتظر نقدكم له

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

RE.zip

3
#4
Z3r0n3 كتب:

أين التشجيع؟

:clapping:

دعني أخبرك شئ من واقع تجربتي

لا تكتب من أجل التشجيع وإنما اكتب وانشر ما كتبته لتثبيت المعلومة فكلما كتبت كلما تثبتت في ذهنك وكلما كان لديك شئ تعود إليه للتعديل عليه لاحقاً عندما تزداد خبرة.

2

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#5
Z3r0n3 كتب:

بمأننا لم نحمل هذه الدالة في البرنامج الحل هو استعمال

الدالتين GetProcAddress و LoadLibrary

بعضكم يقول أن هاتين الدالتين لم نحملهم أيضا في البرنامج و لكني جربتها و اشتغلت, هل من أحد يفسر سبب الإشتغال؟

حسب ما أظن أن نظام التشغيل يقوم بتحميلهم تلقائيا ليشغل نفسه, هل من تفسير آخر؟

لاحظ أنك استخدمت تعليمة CALL في استدعائك للوظيفتين بالشكل

CALL LoadLibraryA

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

جرب كتابة CALL لدالة MessageBox أيضاً بدون تحميلها وسيقوم Olly بوضعها لك وستعمل لو جربت تنفيذها.

هذه العناوين تختلف من نظام إلى نظام (Windows XP > Vista) وقد تختلف من Service pack إلى آخر.

لو قمت بتنفيذ برنامجك في جهازي فغالباً لن يعمل وسأحصل على نتيجة غير متوقعة لاختلاف العناوين.

راجع هذه المقالة واقرأ الجزء "The Solution" حول ما كتب عن جلب العناوين للدوال حتى بدون تحميل المكتبات داخل البرنامج.. هذه ليست المقالة الوحيدة (وهي قديمة نوعاً ما) وليست الطريقة الوحيدة أيضاً ;)

http://www.harmonysecurity.com/kungfoo.html

هذه طرق يستخدمها كاتبو الـ shell codes بالمناسبة.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#6

شكرا على الرد الأخ Xacker

و وصلت معلومة عن تحميل الدوال

←دعني أخبرك شئ من واقع تجربتي لا تكتب من أجل التشجيع وإنما اكتب وانشر ما كتبته لتثبيت المعلومة فكلما كتبت كلما تثبتت في ذهنك وكلما كان لديك شئ تعود إليه للتعديل عليه لاحقاً عندما تزداد خبرة.

أنا عضو جديد في هدا المنتدى و أريد أقدم ما أستطيع تقديمه لأستفيد و أفيد :happy: :happy:

أما ادا لم أجد أحد يتفاعل مع الموضوع أو يطرح أسئلة هدا يعني أني لم أشرح بكيفية مفهومة للسادة الأعضاء :ohmy: :ohmy:

شكرا

#9

بداية موفقه أخى, على الرغم من أني أفقه فى علم الفضاء أكثر مما أفقه في موضوع الهندسة العكسية و الأسمبلي :D

#11

جزاك الله خيراً :)
بصراحة أستغرب الردود .. شكراً , بالتوفيق , مرحباً , أهلا وسهلاً !!
عجبي
لو كل واحد يزيد من عنده خمس أسطر على مواضيع مهمة مثل هذه , لصار عندنا موسوعة
قمت بزيادة بعض الأسطر في الكود وصار يظهر 16 نافذة مختلفة لنرى التنوع في النوافذ

00401000 >/$ 68 00204000    PUSH test90.00402000                     ; /FileName = "User32.dll"
00401005  |. E8 5A18D675    CALL kernel32.LoadLibraryA               ; \LoadLibraryA
0040100A  |. 68 10204000    PUSH test90.00402010                     ; /ProcNameOrOrdinal = "MessageBoxA"
0040100F  |. 50             PUSH EAX                                 ; |hModule
00401010  |. E8 465C4675    CALL KERNELBA.GetProcAddress             ; \GetProcAddress
00401015  |. B9 16000000    MOV ECX,16
0040101A  |. A3 50204000    MOV DWORD PTR DS:[402050],EAX
0040101F  |> 890D 60204000  /MOV DWORD PTR DS:[402060],ECX
00401025  |. A1 50204000    |MOV EAX,DWORD PTR DS:[402050]
0040102A  |. 8B0D 60204000  |MOV ECX,DWORD PTR DS:[402060]
00401030  |. 51             |PUSH ECX
00401031  |. 68 40204000    |PUSH test90.00402040                    ;  ASCII "Hello World!"
00401036  |. 68 20204000    |PUSH test90.00402020                    ;  ASCII "Hello Revers Programming World!"
0040103B  |. 6A 00          |PUSH 0
0040103D  |. FFD0           |CALL EAX
0040103F  |. 8B0D 60204000  |MOV ECX,DWORD PTR DS:[402060]
00401045  |.^E2 D8          \LOOPD SHORT test90.0040101F
00401047  \. C3             RETN
طبعاً لا ننسى أن يكون قسم البيانات مماثل للمذكور في الدرس
00402000  55 73 65 72 33 32 2E 64  User32.d
00402008  6C 6C 00 72 33 32 2E 64  ll.r32.d
00402010  4D 65 73 73 61 67 65 42  MessageB
00402018  6F 78 41 00 61 67 65 42  oxA.ageB
00402020  48 65 6C 6C 6F 20 52 65  Hello Re
00402028  76 65 72 73 20 50 72 6F  vers Pro
00402030  67 72 61 6D 6D 69 6E 67  gramming
00402038  20 57 6F 72 6C 64 21 00   World!.
00402040  48 65 6C 6C 6F 20 57 6F  Hello Wo
00402048  72 6C 64 21 00 00 00 00  rld!....
00402050  42 79 20 4D 6F 73 74 61  By Mosta
00402058  66 61 20 33 36 61 32 00  fa 36a2.

والله ولي التوفيق

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