السلام عليكم,
لقد قام الأخ jaas بإعطاء دروس مهمة في هذا المجال. وهنا فتحت موضوع جديد في هذا الميدان أيضا حتى لا أضع له خللا في التسلسل الذي الذي يتصوره لدروسه. وبما أني لست أتذكر الرابط القديم سأعاود هذا علما أن القديم كان يستهدف نضام 98 فقط وهنا سنحاول أن نعممها على جميع الأنظمة إن شاء الله.
سنبدأ هنا إن شاء الله بزيادة MessageBox للنوتباد وستظهر هذه النافذة قبل أن يبدأ البرنامج.
هنا أفترض أنه لدينا بعض المعلومات عن Pe Header ويمكن أن نقرأ الملفات الخاصة بذلك وهي في المنتدى دائما - عفوا الأخ طارق لم أتذكر الرابط مرة أخرى ويمكن أن أعيد الملفات مرة أخرى إن اقتضى الحال - . وبعد هذا سنطور الطريقة وسنزيد في المرة القادمة نافذة تطلب منا إدخال بسوورد فإذا تحقق يشتغل البرنامج والعكس بالعكس.
هنا اشتغلت على نوتباد اللي في الوندوز 98 النسخة الفرنسية ويمكن عمل نفس الشيء إذا كان الملف مختلفا في الأنظمة الأخرى.
الطريقة الآن سنبدأ بالسهلة وهي كما يلي :
نقوم أولا بإلقاء نظرة على الملف المستهدف مثلا سنرى القطاعات التي يحويها هذا البرنامج Sections وسنرى أنه عندنا مساحة خالية في قطعة الكود وهذا يكون في أغلب الأحيان متحققا وذلك لأن الكود يكون له Alignement وهذا يجعله يترك فراغا في أغلبية البرامج .
فيما يخص هذه النسخة من نوتباد عندنا ما يكفينا من الفراغ وأكثر. وسنفتح الملف في برنامج للهيكس وسنتأكد أن لدينا مساحة خالية تمتد من الأوفسيت 4EA0 إلى الأوفسيت 5000 . وهنا اخترت أن أبدأ في 4F00 . في هذا الأوفسيت سنضع الكود الخاص ل MessageBox ونعرف أن برمجتها في الأسمبلر تكون كما يلي :
push KindOfMessageBox push OffsetOfTitle Push OffsetOfText push HandleOfParentWindow Call MessageBoxA
فيما يخص KindOfMessageBox سنعطيها قيمة 0 لأننا نريد النوع البدائي ويمكن أن نعطيها الأرقام الخاصة بكل نوع إذا ما أردنا.
OffsetOfTitle وهو العنوان الذي سيحتوي على عنوان النافذة وهنا اخترت أن أضع العنوان في الأوفسيت 4F50
OffsetOfText هو عنوان المسج الذي ستعطيه لنا النافذة وقد اخترت أن أضعه في الأوفسيت 4F60 . ومن هنا نستنتج أن لا يتعدى طول OffsetOfTitle السابق 15 حرفا مع 0 الختام . وكما نعلم جميع الجمل يجب أن تنتهي ب 0.
HandleOfParentWindow هنا بما أننا لا نريد زيادة الكود لنتعرف على النافذة الأم سنعطي لهذا البارامتر قيمة 0 ليكون إجمالي.
بعد هذا ما علينا سوى أن نستدعي عنوان الدالة MessageBoxA الموجودة في User32.dll . فكيف سنعثر على هذا العنوان.
من حسن حضنا البرنامج نوتباد يستدعي هذه الدالة ولهذا فإن عنوانها سيكون موجودا في ImpotTable . وهنا إما أن نكون نعرف كيف نبحث داخل هذه الطاولة - وسنعود إلى هذا الموضوع في الحلقات المقدمة لأني في صدد عمل برنامج لهذا الغرض - أو نستعمل بعض البرامج التي تعطينا هذا مثل برنامج FileInspector مثلا أو غيره. وحين يحمل البرنامج إلى الذاكرة سيقوم بالبحث عن الدوال المستوردة ويضعها كل واحدة في مكانها. وفي هذا المثال فإن عنوان MessageBox سيكون في العنوان التالي : 4064A8 حين يكون في الذاكرة وهذا ما كنا سنحتاجه.
بعد هذا سنحتاج إلى الكود محول إلى بايناري للكود السابق. وهنا يمكن أن نستعمل عدة طرق وأنا مثلا أكتبها في ديبوغر - سفتايس - وبعد ذلك أنقل الكود الذي سيعطيني إلى ملف معين . والكود الكامل الذي نريد أن نترجم هو كالآتي :
push 0 push 404f50h push 404f60h push 0 call [4064A8h] mov eax,4010cch jmp eax
والسطور الأولى كما ذكرت هي لإظهار النافذة ونلاحظ العناوين 404F50 و 404F60 وهي العنواوين التي ستكون في الذاكرة بعد تحميل البرنامج بواسطة لودر الوندوز. وهنا كان الأمر سهلا لأنه عندنا في برنامج نوتباد هذا نفس العناوين في الملف على القرص وفي الذاكرة.
وبعد هذا سنقفز إلى نقطة الدخول الأصلية للبرنامج والتي هي في هذه الحالة 4010CC .
وهنا طبعا سنغير نقطة بداية البرنامج الأصلية لنجعلها تؤشر إلى الكود الذي أضفناه.وكما نعلم فإن نقطة بداية كل برنامج تكون في الملف في الأوفسيت 28 هكس بعد ابتداء Pe Header وفي مثالنا ستكون في الأوفسيت A8 وفيه ستكون النقطة الأصلية فيها
CC-10-00-00 وسنغيرها على الشكل 00-4F-00- صفر . كلمة صفر يعني أن نضع هنا صفر لأن الكتابة لم ترد أن تضع الصفر هنا.
وهكذا فحين سنشغل البرنامج وبما أننا غيرنا نقطة البداية فهو سيذهب إلى الكود الذي أضفناه وسيضهر لنا الرسالة وبعد هذا يذهب إلى النقطة الأصلية وسيشتغل البرنامج كأن شيئ لم يكن.
هذه بداية وسأحاول أن أعطي مثالا في المرة المقبلة كبف شنضيف نافذة كاملة تطلب منا PassWord. وبما أنني لا أريد البداية بالأشياء الصعبة سأبحث عن برنامج يكون يستورد الدوال التي تلزمنا وهي على سبيل المثال :
DialogBoxIndirectParamA
GetDlgItemTextA
EndDialog
ExitProcess
GetModuleHandle
حاولت أن أضع هذا المثال على نوتباد ولكنه لا يستورد كل هذه الدوال ولذى أبحث عن ملف لهذا الغرض. لقد قمت مثلا بهذا على برنامج Winzip32.exe النسخة 9.0 ولكن الملف طويل وسيكون عائقا في التحميل.
ولكن بعد هذا وبعد أن نكتسب شيئا من الخبرة سنحاول عمل ما نريد على أي ملف حتى ولو كان لا يستورد هذه الدوال إذ سنبحث عنها مباشرة في الدوال الأم إما مثلا user32 أو kernel32 أو غيرها.
وفي الملف المرفق أعطيت نوتباد النسخة الأصلية والمغيرة حتى إذا كان لأحد ما نسخة غير هذه.
في انتظار أسئلتكم أو اقتراحاتكم أقول لكم إلى اللقاء.

