أهلا رمضان،
ياسلام على هذا السؤال ، أنا مثل هيك أسئلة فعلا بتعجبني ... بس أنا مستعجب منك على موضوع البخل ، الشباب في هذا المنتدى مابيقصرو فأي شخص يعرف الإجابة على سؤال ما يتأخر بالرد . (الله يسامحك)
المهم نرجع على الموضوع .
تريد إضافة كود على برنامج تنفيذي من غير ما تؤثر على البرنامج التنفيذي ، بحيث يعمل هذا الكود على سبيل المثال عند تشغيل البرنامج التنفيذي . في الحقيقة فعلا كما ذكرت فإن معظم الفيروسات تتعامل بهذه الطريقة فهي تضع برنامج التوالد في الملفات التنفيذية وأول ما يتم تشغيل البرنامج المصاب فإن الفيروس ينتقل إلى الذاكرة ومن هناك يتم حقن نفسه في كل برنامج يعمل ويتكاثر .
لأستطرق إلى موضوع مشابه : هل فكرت كيف يتم تكوين ملف تنفيذي للملفات المضغوطة zip عن طريق Create self-extractor . في الحقيقية يتم إضافة الملف المضغوط على ملف تنفيذي آخر وظيفته فك الضغط أحيانا إذا كان ملف ال zip كبير فإن الملف التنفيذي يصل مثلا إلى 100 ميجابايت ، فهل تعتقد أنه عند تشغيل هذا الملف وفتحه بعد أن أصبح exe يتم نسخه بالكامل إلى الذاكرة من أجل تشغيله ؟ لا على العكس تماما فإن تشغيل ذاك الملف يتم في لحظات وهذا يعني أن الكمية التي نسخت إلى الذاكرة لا تتجاوز الكيلو بايتات . هذا البرنامج الذي نسخ إلى الذاكرة وظيفته فتح نفس الملف وقرائة الRow Data بداية من نهاية البرنامج التنفيذي الأساسي . فكيف تم تحيد عدد البايتات التي يجب نسخها إلى الذاكرة ؟
كل ملف تنفيذي يحتوي على ترويسة أو Header فيها الكثير من البيانات المفيدة أحدها هو عدد البايتات التي يجب أن تنسخ إلى الذاكرة (أو بالأصح عدد البولكات – كل بلوك 512 بايت) . هذه القيمة بالعادة تساوي حجم البرنامج التنفيذي . أما في المثال الذي ذكرته في السابق فهي تساوي فقط حجم برنامج فك الضغط الأساسي .
لماذا قمت بذكر جميع المعلومات السابقة ؟ بصراحة هي لب الموضوع لأنه على سبيل المثال إذا قمت بنسخ شيفرة بعد نهاية ملف تنفيذي ما ، فإنك عند تشغيل البرنامج فإن هذا القسم الذي نسخته فإن الويندوز لن يستعبره إلى في حالة ...... انت خمن ؟ صحيح ، في حالة إذا قمت بتعديل البيانات في الترويسة المسؤلة عن حجم الملف التنفيذي .
إلى هما الموضوع مشترك في الدوس والويندوز ...
دعني أتكلم عن أيام الدوس قليلا مع أنك حاليا لا تريد فعل الطريقة على الدوس .. في الدوس كانة معظم الفيروسات بالإضافة إلى العمل السابق تقوم بوضع تعليمة قفز في بداية البرنامج الأساسي ؛ هذه التعليمة مهمتها تنفيذ برنامج الفيروس ومن ثم العودة إلى تنفيذ البرنامج الأساسي وكأن شيئا لم يكن .
العملية في الويندوز مختلفة بعض الشيء .. وهذا له علاقة بالمهام وال Process .. وأنصحك بمراجعة موضوعي تنفيذ برنامج من الذاكرة الموجود في الوصلة :
http://arabteam.nicmatic.com/vb/showthread...p3?threadid=231
حسنا في ترويسة الملف التفيذي يوجد أيضا رقم يدل على بداية تنفيذ البرنامج أو ال entry point ، فتجد أنه بتغيير هذه القيمة لكي تؤشر على البرنامج المحقون فإن هذه العملية تكافئ عملية تعليمة القفز في الدوس . ومن ثم بعد أن ينتهي تنفيذ البرنامج المحقون يتم القفز إلى بداية البرنامج الرئيسي . وهذا كل شيء بكل بساطة ...
طبعا يجب الانتباه إلى عدة أمور وهي :
- البرنامج المحقون يجب ان يكون صغير أي يكون مبرمج بالأسمبلي أو ياستخدام الفيجوال سي++ ولكن من غير MFC أي مباشرة بال WIN SDK .
- بما أن الويندوز يقوم بتشغيل البرنامج الأول فإن جميع المكاتب DLL يقوم الويندوز بتحميلها ، لذا يفضل أن يكون البرنامج المحقون لا يستخدم سوى المكاتب القياسية ك Kernel32.DLL و GDI32.DLL . أو يستخدم نفس المكاتب التي يستخدمها البرنامج الأساسي . أو يتم التعامل مع المكاتب بشكل ديناميكي أي عن طريق LoadLibrary و GetProcAddress ..
- البرنامج المحقون ينتهي مفعوله بمجرد انتهاء تنفيذه ولا يستطيع فعل أي شيء عندما يبدأ البرنامج الأساسي بالعمل .
بالنسبة إلى النقطة الأخير التي ذكرتها يمكن التلاعب في WinNT أو Win2000 كالتالي : يمكن أن يقوم البرنامج المحقون بحقن كود آخر في مهمة الويندوز الاساسية أو ال explorer.exe وهو برنامج الخلفية . وهذه العملية جدا معقدة ولكن ممكن أن يتم برمجتها ولكن فقط في WinNT وذلك بسبب أن التوابع ال API التي يجب استخدامها غير متوفرة في Win9x . هذا البرنامج الآخر المحقون يمكن أن يعمل كفيروس والله يستر ....
هذا الكلام نظري بحت ، وأنا راح أسيبك تتمخمخ فيه من قبل أن أجرب شي كود او برنامج يطبق الكلام السابق .
بس بدي أسئلك بالأول أنا مافهمت أيش هو سببك بالظبط من هذا أي كبف يتم استخدتمها في الحماية ؟؟؟