[c]دراسة فيروس بسيط يصيب الملفات التنفيذية من النوع( COM ) [/c]
سنتعرض في هذا الدرس لدراسة واحد من أبسط الفيروسات البرمجية وأصغرها حجماً، فهو لا يتجاوز 264 بايت بلغة الآلة. ويتميز هذا الفيروس بإجرائية البحث البسيطة التي يستخدمها، ويطلق عليها الاسم TIMID . ويستطيع مهاجمة الملفات التنفيذية من النوع COM والموجدة ضمن المجلد نفسه، ولا يستطيع الانتقال من مجلد إلى آخر وبالتالي يمكن السيطرة عليه بسهولة، وهو من الفيروسات المسالمة إذ لا يقوم بأية عملية ضارة أو مؤذية، ويمكن اكتشافه بسهولة .
سنعمد من خلال دراسة هذا الفيروس إلى تغطية كل المبادئ الأساسية لبناء الفيروس بأقل قدر ممكن من التعقيد وذلك لفهم طريقة عمله لعلنا ان نستطيع ان نشق طريق بعمل برنامج لمكافحة الفيروسات .. عربي المنشأ
[c]بعض المفاهيم الأساسية عن نظام التشغيل DOS
[/c]
لفهم آلية عمل وانتساخ هذا الفيروس لا بد لنا أولاً من أن نفهم، وبالتفصيل، كيف يقوم نظام التشغيل بشحن برنامج ما إلى الذاكرة الرئيسية والتحكم به، فلكي يستطيع الفيروس أن يتكاثر يجب أن يكتب بطريقة تضمن تنفيذه وليس تنفيذ البرنامج الذي يلتصق به الفيروس فقط، كما يجب أن يسمح الفيروس للبرنامج الأصلي أن يتابع سيره بشكل طبيعي .
تستطيع وحدة المعالجة المركزية ( CPU ) تنفيذ الملفات COM و EXE مباشرة، وتعتبر ملفات COM هي الأبسط، فصيغة ترميز هذه الملفات معرفة مسبقاً ويستطيع نظام التشغيل التعرف عليها مباشرة، في حين يتم ترميز الملفات EXE باستخدام صيغ أكثر تعقيداً، وتحوي الملفات COM الترميز الثنائي المباشر لما يجب أن تنفذه وحدة المعالجة المركزية .
عند طلب تنفيذ من النوع COM، يقوم نظام التشغيل بإجراء العديد من العمليات التحضيرية الأساسية قبل أن يسلّم التحكم بوحدة المعالجة المركزية للبرنامج، ومن أهم هذه العمليات تنظيم استخدام ذاكرة الحاسب من قبل البرامج المختلفة، فيقوم نظام التشغيل أولاً باختبار سعة الذاكرة الحرة المتوفرة لمعرفة إذا كان هناك ما يكفي لشحن البرنامج المعني، فإذا كان الحجم المتوفر كافياً يقوم نظام التشغيل بحجز الحيز اللازم من الذاكرة ويأخذ ذلك بعين الاعتبار عند محاولة شحن برنامج آخر بحيث لا يقوم بحجز المنطقة نفسها لبرنامج آخر. تعتبر هذه المرحلة ضرورية جداً لأنه يمكن، في أية لحظة، أن يتواجد في الذاكرة أكثر من برنامج، ومثال ذلك البرامج المقيمة ( resident programs ) التي تبقى مقيمة في ذاكرة الحاسب وتستطيع استدعاء برامج أخرى وتنفيذها.
يقوم نظام التشغيل أخيراً بحجز كتلة في الذاكرة تتسع لـ 256 بايت، وتعرف باسم " بادئة مقطع البرنامج " (Program Segment Prefix) PSP . وهي طريقة موروثة من نظام التشغيل CP/M الذي كان شائعاً في أواخر السبعينات وبداية الثمانينات، وكان يستخدم لتشغيل الحاسبات الصغرية التي تستخدم المعالجات الصغرية 8080 و Z80 ، إذا كان حجم الذاكرة الكلية المتاحة في الحاسب هو 64 كيلو بايت تحجز أول 256 بايت منها لنظام التشغيل لحفظ بعض المعلومات الأساسية، ويتضمن أحد المواقع، ذو العنوان 5 مثلاً ، تعليمه قفز إلى منطقة الذاكرة العليا حيث توجد بقية نظام التشغيل.وهذا مثال على صيغة بادئة مقطع البرنامج :
الانزياح الطول الوصف OH 2 التعليمة 20H int 2 2 عنوان آخر مقطع محجوز 4 1 بايت محجوزة 5 5 ( 21H int ) استدعاء تابع التنفيذ من النظام DOS A 4 المقاطعة 22H ( انتهاء البرنامج ) E 4 المقاطعة 23H ( ctrl + c ) 12 4 المقاطعة 24H ( خطاً حرج ) 16 22 محجوزة 2C 2 عنوان المقطع الذي يحوي وصف محيط العمل 2E 34 محجوزة 50 3 التعليمة Int 21H/RETF 53 9 محجوزة 5C 16 معلومات تحكم خاصة بالملف 6C 20 معلومات تحكم خاصة بالملف 80 128 منطقة التبادل على القرص DTA ( Date Transfer Area ) 100 - بداية البرنامج COM
بذلك كانت البرامج المكتوبة لهذه الآلات تستطيع الوصول إلى وظائف نظام التشغيل باستدعاء مستوى العنوان 5 من الذاكرة، ونتيجة للانتشار الواسع لنظام CP/M في ذلك الوقت ولكون الكثير من البرامج قد كتبت وفقاً لهذا النظام فقد حافظت الحاسبات الشخصية على هذه الطريقة. وقد أصبحت هذه الطريقة قليلة الفائدة بعد تقدم تقنيات صناعة الحاسبات وبرمجتها، لكنها مع ذلك ما زالت تحتفظ بشيء من الأهمية كما سنرى لاحقاً .
بعد أن يتم إنشاء بادئة مقطع البرنامج يقوم نظام التشغيل بشحن الملف COM إلى الموقع الذي يلي بادئة مقطع البرنامج مباشرة، أي إلى الموقع ذي الانحياز 100H، وقبل أن يقوم النظام بتسليم التحكم بوحدة المعالجة للبرنامج يشع قيماً محددة مسبقاً في مسجلات وحدة المعالجة المركزية . لتوضيح ما يحصل سنلقي الآن نظرة سريعة على مسجلات المقاطع ( Segment registers ) .
تتألف مسجلات المعالج الصغري 8088 من 16 بت فقط، مما يعني أنه يمكننا باستخدام أحد هذه المسجلات عنونة 64 كيلو بايت فقط من الذاكرة، أما إذا أردنا عنونة ذاكرة أكبر فسنحتاج لاستخدام بتات إضافية، وقد حلت هذه المشكلة باستخدام طريقة تعرف باسم التجزئة (segmentation ) التي تمكن المعالج من عنونة ميغابايت من الذاكرة، وتعتمد هذه الطريقة على استخدام مسجلين لعنونة أي موقع في الذاكرة وتستخدم 20 بتاً بدلاً من 16 فقط. يتم تقسيم الذاكرة إلى كتل تضم كل منها 16 بايت، ويتضمن أحد المسجلين ونسميه مسجل المقطع ( segment register ) الجزء الأعلى من العنوان، في حين يتضمن المسجل الآخر، ونسميه مسجل الإزاحة ( offset register ) الجزء الأدنى من العنوان، وهو في الواقع عدد البايتات التي يجب إضافتها إلى بداية الكتلة المعنونة بمسجل المقطع للوصول إلى بايت محددة. لنفترض مثلاً أن المسجل ds يحوي العدد الستة عشري 1275 وأن المسجل bx يحوي العدد الستة عشري 457، يحسب عندئذ عنوان البايت المطلوبة كما يلي :
1257 H x 10 H = 12750 H
12750 H + 457 H=12BA7 H
ولكن وبما أن المقطع يحوي 16 بايت فقط، يجب ألا يتجاوز محتويات مسجل الإزاحة القيمة 15 ، ومع ذلك يستعمل عادةً أي عدد يسمح المسجل بتمثيله ( أي 64 K )، وهذا يعطي إمكانية الوصول إلى العنوان ذاته بعدة طرق. ففي مثالنا السابق يمكن عنونة البايت نفسها بوضع القيمة 12BA في المسجل ds والقيمة 7 في المسجل bx، ويترك الخيار في ذلك للمبرمج، إلا أن قواعد البرمجة القياسية تفترض تثبيت قيمة مسجل المقطع لأطول وقت ممكن وتغيير قيمة مسجل الإزاحة .
يتضمن المعالج 8088 أربعة مسجلات مقاطع هي CS، DS ، SS ، و ES وتقابل على الترتيب : مقطع البرنامج ( code segment )، ومقطع المعطيات ( Data segment )، ومقطع المكدس ( stack segment )، ومقطعاً إضافياً ( Extra segment )، ولكل من هذه المسجلات وظيفة خاصة فالمسجل CS يشير إلى كتلة من 64 كيلو بايت تحوي التعليمات الحقيقية للبرنامج المطلوب تنفيذه، ويُستخدم المسجل DS لعنونة المقطع من الذاكرة الذي يحوي معطيات البرنامج، ويعنون المسجل SS المقطع الذي يستخدم كمكدس، أما المسجل الأخير ES فيستخدم لعنونة مقطع إضافي من الذاكرة يُترك للمبرمج حرية استخدامه حسب الحاجة .
ذكرنا أن صيغة ملفات COM بسيطة للغاية، وهي في الواقع ملفات صغيرة إذ لا يمكن أن يتجاوز حجم الملف سعة مقطع واحد، أي 64 كيلو بايت ، ويستخدم المقطع نفسه لتخزين تعليمات البرنامج ومعطياته ولاستخدامات المكدس، وبالتالي تكون المسجلات الأربعة المذكورة القيمة ذاتها، أي : CS = DS = SS = ES . نشير هنا إلى أن هذا الحجم كان يعتبر كافياً في الفترة الأولى من ظهور واستخدام الحاسبات الشخصية، أما اليوم فقد أصبح من الطبيعي أن يتجاوز حجم البرنامج عدة مئات من الكيلوبايتات، وأن يستخدم معطيات بحجم مماثل. وتحتاج مثل هذه البرامج شحنها وتنفيذها لاستخدام استراتيجيات أكثر تعقيداً وتؤخذ هذه الاستراتيجيات بعين الاعتبار عند تحديد صيغ الملفات من النوع EXE، وتمكن سيئة هذه الملفات في ضرورة إجراء تعديلات هامة عليها قبل تنفيذها، وهذا ما يقوم به نظام التشغيل دون أن يلاحظ المستخدم ذلك . بينما لا يحتاج تنفيذ الملفات COM إلى إجراء هذه التعديلات، وهذا ما يسمح بحفظ الصورة الثنائية للملف COM كما هي على القرص، وعند تنفيذ البرنامج يقوم نظام التشغيل بإسناد القيمة المناسبة إلى مسجلات المقاطع فقط .
عند طلب تنفيذ ملف من النوع COM يقوم نظام التشغيل، بعد تحديد المقطع الحر من الذاكرة الذي سيشحن البرنامج إليه، بكتابة بادئة المقطع (PSP) في بدية المقطع أي بدءً من العنوان ذي الانزياح OH، ثم يقوم بشحن تعليمات الملف في الموقع التالي مباشرة، أي بدءاً من العنوان ذي الانزياح 100H يقوم نظام التشغيل بعد ذلك بتسليم التحكم بوحدة المعالجة المركزية لتعليمات البرنامج، ويتم ذلك بإسناد عنوان أول تعليمة ( أي 100H ) إلى مسجل عداد البرنامج PC ( program counter )، ويبدأ عندها تنفيذ البرنامج الذي قد يقوم باستدعاء بعض إجرائيات نظام التشغيل ( كالقراءة والكتابة )، وعند انتهاء تنفيذ البرنامج تتم إعادة التحكم من جديد لنظام التشغيل الذي يقوم بتحرير المقطع المحجوز للبرنامج ويعود لحالة انتظار طلب تنفيذ برنامج آخر من قبل المستخدم .
انظر الصورة الاتية
[C] [/C]
درسنا القادم ان شاء الله سيكون بعنوان
[c]الإطار العام لعمل الفيروس
[/c]
تحياتي وأسف للاطاله .
الدرس الاول
http://www.arabteam2000.com/vb/showthread....p?threadid=6587
الدرس الثالث
http://www.arabteam2000.com/vb/showthread....p?threadid=6935
اخوكم