almohammdih منتديات المحمدية
عدد المساهمات : 922 نقاط : 2354 تاريخ التسجيل : 14/01/2010
| موضوع: الهندسة العكسية للمبتدئين الدرس الثاني Basic Patching الأحد مارس 14, 2010 6:53 pm | |
| الهندسة العكسية للمبتدئين الدرس الثاني
قم بتحميل الأدوات [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]
نقوم بفتح OllyDBG وتابع كما بالصور [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] مسار UDD يتم به حفظ تحليل البرامج حتي لا يقوم البرنامج بنفس العمل كل مرة مسار Plugins أعتقد أنه يشرح نفسه
بعد تحديد المسارات سيحتاج البرنامج لغلقه و إعادة تشغيله مرة أخري [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] و سيتم شرح الأزرار المستخدمة خلال الشرح في الأدوات التي قمت بتحميلها بأعلي ستجد ملف إسمه lesson1Test. قم بسحبه إلي البرنامج -Drag ـ أو منFile ثم open ثم إختار الملف أو من الزر الأول الذي يأخذ شكل الفولدر[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] عند تشغيل البرنامج الصغير Lesson 1 test ستظهر كما بالصورة
كما هو واضح البرنامج يقول إنه نسخة تجريبية ونحن نريد ن نجعله نسخة كاملة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] إضغط Ok و إغلق قم بتحميل الملفين الآتيين [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]
بعد إنتهاء التحميل قم بفك الضغط عن الملفين و ضع الملفات التي تم فكها في فولدر Plugins
ثم قم بتشغيل Olly مرة أخري , و إسحب برنامج الدرس مرة أخري وتابع كما بالصورة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] قم بإختيار ملف Win32 help الذي قمت بتحميله ووضعته في فولدر Plugins عند تشغيل البرنامج ظهرت لنا رسالة تقول أن البرنامج نسخة تجريبية هذه الرسالة تسمي Message Box تابع كما بالصورة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] واضح كما بالصورة تعريف Message Box إستخدم Win32 Help في كل مرة للتعرف علي الأوامر المختلفة نعود إلي كود البرنامج مرة أخري [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] كود البرنامج صغير جدا سنقوم بدراسته خطوة خطوة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] لو عدت إلي الدرس الأول ستعلم أن الأمر Mov هو عبارة عن نقل داتا من مكان إلي مكان وهنا الأمر سيقوم بنقل 1 بايت إلي AL Register لاحظ byte ptr عرفنا أنه سيتم نقل 1 بايت ولو أردنا نقل 2 بايت لكنا رأينا الأمر word ptr ول أردنا نقل 4 بايت لكنا رأينا الأمر dword ptr لكن ما الذي يوجد بالذاكرة 403000 لاحظ الصورة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] الأمر الثاني هو CMP AL, 00 و الأمر يقوم بمقارنة0x00l ب Al ونتيجة المقارنة تظهر في z-flag إما صفر أو واحد jne 0040101c لو عدت إلي الدرس الأول ستجد أن Jne تعني Jmp if not equal لاحظ أن Al =1 و أن المقارنة تتم بين al و 0 و النتيجة ستظهر في Z-Flag وهي التي ستحدد إن كان سيتم القفز أم لا هنكا أكثر من طريقة حتي نصل لهدفنا وهو النسخة الكاملة لكن قبل ذلك نعود Olly ولاحظ ما يحدث للكود وقارن بين الصورتين [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] إضغط F8 أو [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] حتي يتم تشغيل البرنامج خطوة خطوة ودائما و أبدا سنفعل ذلك ولاحظ ما يحدث للكود وقارن بين الصورتين [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] أعتقد انه واضح أن في الصورة الأولي AL = 0 وهو واضح في EAX وفي الصورة الثانية وبعد نقل 1 بايت فإن AL = 1 وواضح أيضا في EAX الآن إضغط F8 مرة أخري [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] لاحظ أن نتيجة المقارنة ظهرت في Z-Flag = 0 و بناءا عليها لن يتم القفز وسيتم الإستكمال وهو سيقودنا إلي رسالة Trial Version لكن لاحظ إن تم القفز سيتم القفز إلي 0040101E وهي موجودة كما بالصورة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] أعتقد أنه واضح الآن كيف سنحل هذا الدرس
| |
|
almohammdih منتديات المحمدية
عدد المساهمات : 922 نقاط : 2354 تاريخ التسجيل : 14/01/2010
| موضوع: رد: الهندسة العكسية للمبتدئين الدرس الثاني Basic Patching الأحد مارس 14, 2010 6:54 pm | |
| هناك أربعة طرق للوصول إلي الهدف الأولي أن نجعل Al = 0 فكما رأينا قبل ذلك أنه حتي نصل إلي 403000 والتي تقودنا إلي النسخة الكاملة يجب أن تكون Al = 1 راجع الصورة 11 والمقارنة التي تحدد القفز إلي النسخة الكاملة هي 0 إذن لنجعل 403000 تبدأ عند صفر بدلا من 1 وهو ما سنقوم به عن طريق Olly تابع الصور [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] لاحظ أن تقوم بعمل كليك يمين عند 01 بالضبط [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] بعد ان قمنا بالتعديل كليك يمين مرة أخري [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] بعد الحفظ قم بتجربة الملف الجديد [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] وقم بتجربته ب Olly ولاحظ ما يحدث خطوة خطوة F8 الطريقة الثانية هي أن نجعل المقارنة بين AL و 1 بدلا من الصفر وبالتاي ستكون نتيجة المقارنة في Z-Flag هي 1 أي سيتم القفز نعود للملف الأصلي ب Olly [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] وبعد ذلك إحفظ الملف بإسم آخر وقم بتجربته كما فعلت في الطريقة الأولي الطريقة الثالثة أن نغير أمر القفز فبدلا من أن يكون الأمر JE نجعله Jne ويعني Jump if not equal وبالتالي سيقوم البرنامج بالقفز كل مرة إلي العنوان الصحيح ,من المكن أن نغير الأمر لنجعله JNZ أي Jump if not zero وسيؤدي نفس المهمة ونقوم بالتغيير بالعودة للملف الأصلي للدرس في Olly وعند أمر القفز نضغط كليك يمين ثم Assemble أو نضغط Space ثم نقوم بتغيير Je إلي Jne ونحفظ الملف ونقوم بتجربته كما فعلا سابقا الطريقة الرابعة وهي إستبدال أمر المقارنة ب Nop أي No Operation يتبع....... | |
|
almohammdih منتديات المحمدية
عدد المساهمات : 922 نقاط : 2354 تاريخ التسجيل : 14/01/2010
| موضوع: رد: الهندسة العكسية للمبتدئين الدرس الثاني Basic Patching الأحد مارس 14, 2010 6:56 pm | |
| في الأدوات التي تم تحميله سابقا ستجد ملف إسمه ReverseMe إضغط عليه لنري ماذا سيحدث[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] واضح كما بالصورة النسخة التجريبية إنتهت رسالة إعتيادية تقابلها بالتأكيد في برامج كثيرة لنري ماذا سنفعل للتغلب علي هذه الرسالة وإعادة البرنامج إلي العمل مرة أخري . للتسهيل ستستخدم هذه المرة نسخة معدلة من OllyDBG لها إختلافات كثيرة ستراها وسنعود للنسخة الأصلية لتوضيح بعض الأشياء عند الحاجة الآن حمل هذه النسخة من Olly [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] نقوم بفتح برنامج Olly النسخة المعدلة ونسحب reverseme إلي olly [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] الأمر Push يعني Push Onto Stack إنظر إلي خانة Stack في Olly وشاهد ما يحدث الأمر Call يعني Call Subroutine أعتقد أن الأمر يشرح نفسه فهو يستدعي جزء من كود البرنامج الآن قم بعمل Step للبرنامج كما فعلنا بالسابق بإستخدام F8 إلي ان نصل كما بالصورة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] أعتقد أن الكود ما قبل هذه لا يوجد به شيء مثير يهمنا لكن عند النقطة التي توقفنا عندها 00401073 هناك شيء جديد كما تلاحظ Create FileA[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] إذن ReverseMe يقوم بالبحث عن ملف حتي يقرأ منه حالة البرنامج هل هو مسجل أم لا و إسم الملف في حالتنا ليس صعب إكتشافه فهو موجود بالأمر السابق كما بالصورةKeyfile.dat لكن هذا الملف غير موجود لذلك البرنامج يظهر غير مسجل في كل مرة الآن F8 مرة أخري [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] الآن F8 [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] JNZ SHORT 0040109A إذن القفز لن ينفذ حيث أن نتيجة المقارنة هي صفر وفي هذه الحالة فإن القفز لن يتم وهو ما سيؤدي إلي رسالة النسخة إنتهت
إذن يجب أن نقفز حتي الا تظهر رسالة النسخة إنتهت وهذه المرة لن نقوم بتغيير أمر القفز لكن سنقوم بتغيير القيمة الموجودة ب Z-Flag بدلا من 1 سنجعلها صفر لكن لاحظ أن Z-Flag هي جزء من المعالج وليست جزء من كود البرنامج فالقيمة التي سنقوم بتغييرها ستتغير مؤقتا ولمرة واحدة فقط لكن إن أردنا تثبيت القفز سنغير الأمر ذاته لكن بما إننا غير متأكدين حتي الآن من مكان الباتش فسنقوم بتغيير القيمة في Z-Flag
فقط إضغط بالماوس مرتين علي القيمة 1 بجوار Z حتي تتغير إلي صفر [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] قبل أن نقفز opcode وبجوار أمر قفز إضغط مرتين بالماوس في خانة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] ما فعلناه هو أننا وضعنا BP أي Break Point بما أننا عرفنا أن هذه القفزة مهمة بالنسبة انا وهي أول ما نريده في البرنامج فبدلا من أن نبحث عنها في كل مرة نضع BP وسيتوقف Olly عند هذه النقطة في كل مرة سيتضح إستخدامها بعد قليل أعتقد انه واضح الآن أننا سنقوم بالقفز و أننا عندما غيرنا القيمة في Z-Flag جعلنا البرنامج يفهم أن الملف KeyFile.dat الذي يبحث عنه موجود إضغط F8 لنري ماذا سيحدث حتي نصل كما يالصورة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] أعتقد أن ما نراه هو جديد علينا ReadFile و أعتقد أننا نعرف الآن كيف سنصل إلي معناها [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] هذا يعني أن ReadFile يحاول أن يقرأ عدد محدد من البايت من KeyFile.dat ويضعها بعنوان معين بالذاكرة في حالة نجاحه في قرائتها ولو لاحظت أن القيمة في ال Stack وفي EAX Register هي FFFFFFFF والقيمة تظهر Hex و تعني أن الملف غير موجود [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] لو نظرت اسفل ReadFile ستجد مجموعة من القفزات المشروطة إذن واضح ان هذا ليس ما نريده حيث أن هذا سيرجع بنا إلي نفس الرسالة السابقة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة]TEST .... , TEST .... في 99% من الحالات الأمر يأتي TEST EAX , TEST EAX وهو يقوم بإجراء عملية منطقية AND حيثAND Dest , Source والعملية تكون Dest: = Dest /\ Source و Dest إختصار Destination وهذه العملية لا تقوم بحفظ القيم ولكن تقوم بتغيير القيمة في Z-Flag , وتقوم بتفريغ O-Flag و C-FLag فتخيل لو لديك 10010101100101001101 ولو قمت بإجراء عملية AND بإستحدام حاسبة الويندوز ( لاحظ الأرقام Binary ) فستكون النتيجة 0001000100 | |
|
almohammdih منتديات المحمدية
عدد المساهمات : 922 نقاط : 2354 تاريخ التسجيل : 14/01/2010
| موضوع: رد: الهندسة العكسية للمبتدئين الدرس الثاني Basic Patching الأحد مارس 14, 2010 6:57 pm | |
| الآن F8 لاحظ الأمر الذي يأتي بعد TEST EAX , TEST EAX هو JNE وبالتأكيد لن نقفز لإن EAX =00000000 و Z-Flag = 1 الآن F8 ولكن الأمر الذي يليه هو قفز غير مشروط JMP [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] كما تري فإن السهم يشير إلي المكان الذي سيتم القفز إليه ( Plugin مضاف إلي النسخة المعدلة ) وواضح كما بالصورة إنه ليس المكان الذي نبحث عنه لإن البرنامج لم يجد Keyfile.dat وبالتالي أعطي رسالة إنه غير صالح الآن F8 حتي تظهر الرسالة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] الآن إضغط Ok[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] الآن قم بعمل ريستارت [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] أو Ctrl+F2 وبعد ذلك إضغط Run او F9 ستجد نفسك عند ال BP -Break Point التي قمنا بوضعها من قبل قم بتغيير Z-Flag كما فعلنا من قبل وبعد ذلك F8 حتي نصل كما بالصورة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] أعتقد أننا نعلم إننا إذا لم نقفز سنذهب إلي الرسالة التي لا نريدها إذن يب ان نقفز و أعتقد أننا نعلم كيف سنفعل هذا بالطبع تغيير القيم الموجودة ب Z-Flag من 1 إلي صفر
الآن F8 [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] ما فعلناه هو أننا عندما قفزنا جعلنا البرنامج يعتقد أن الملف KeyFile.dat موجود و أنه يقرأ منه حيث Dest: = Dest \/ Source وتقوم بتفريغ ال O-Flag وال C-Flag وتحديد Z-Flag فلو إفترضنا أنها ستكون بين فالنتيجة ستكون 1100011011 جرب العملية بإستخدام الحاسبة لاحظ أنها تكون هكذا XOR EAX,EAX فالنتيجة في النهاية ستكون EAX = 0 لإنك تقوم بعمل XOR بين نفس القيميتن الآن F8 XOR هو عملية منطقية أخري لقيم Binary تقوم بعمل OR Dest , Source 1001010110 0101001101 [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] لنري إلي أين ستذهب بنا هذه القفزة واضح أن هذه القفزة ستعطينا نفس الرسالة ألا نقفز لكن هذه المرة لكن لاحظ أن هذه JL ولذلك ان نستخدم Z-FLag و لكن سنستخدم S-Flag واضح ماذا سنفعل سنغير القيمة الموجودة في S-Flag من 1 إلي 0 [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] الآن F8[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] الآن F8 حتي نصل كما بالصورة [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] إذن كل القفزات التي قمنا بتعديلها سنحتاج إلي تثبيتها حتي يفعل ReverseMe هذه التعديلات كل مرة قم بعمل ريستارت ل ReverseMe و إضغط Run حتي تصل إلي BP التي قمنا بوضعها من قبل وكما فعلنا في الدرس السابق ستقوم بعمل Assemble ونغير JNZ ب JMP الآن إضغط مرتين علي لBP لحذفها لإننا لا نريدها مرة أخري وقم بضغط F8 حتي تصل إلي القفزة الثانية الي قمنا بتعديلها و هكذا حتي تصل إلي القفزةالأخيرة ( ستقوم بتغيير JNZ إلي JMP وتقوم بتغيير إلي NOP وهناك طريقة أخري بدلا من NOP ذكرتها في الدرس السابق سأتركها لمن يريد أن يجربها ) ثم قم بحفظ التغييرات كما فعلنا سابقا و إحفظ الملف بإسم لآخر وقم بتجربته ( لاحظ أننا عندما نقوم بالتغيير في ال Flags فإننا نغير القيمة الموجودة بالذاكرة مؤقتا ولم نغير بكود البرنامج ) | |
|