معهد دعم اتش فى اى بى اس لحلول الويب - Powered by vBulletin


 
 
النتائج 1 إلى 1 من 1

الموضوع: مبادئ كتابة الفيروسات قسم الأسمبلي في قسم الإنعاش

  1. #1
    عضو جديد


    تاريخ التسجيل: Jun 2011
    رقم العضوية: 7
    المشاركات: 2,181
    HVIPS5 غير متواجد حالياً

    مبادئ كتابة الفيروسات قسم الأسمبلي في قسم الإنعاش


    مبادئ كتابة الفيروسات قسم الأسمبلي في قسم الإنعاش
    مبادئ كتابة الفيروسات قسم الأسمبلي في قسم الإنعاش
    مبادئ كتابة الفيروسات قسم الأسمبلي في قسم الإنعاش



    السلام عليكم,,,

    سيتضمن هذا الدرس التالي :

    1- كيف تأخذ الفيروسات معلومات من الملف التنفيذي
    كيف تحقن الفيروسات الكود-2


    في البداية لن أتكلم عن مبادئ كتابة الفيروسات بل خصصته لأتكلم عن قسم الأسمبلي.
    كل من فتح الموضوع استغرب من العنوان : مبادئ كتابة الفيروسات و التعليق هو قسم الأسمبلي في قسم الإنعاش ؟؟؟؟!!!!
    حسنا العنوان يتكلم عن الموضوع لكن التعليق يتكلم عن قسم الأسمبلي ؟؟؟
    الأسمبلي هي أهم لغات البرمجة, لكن في هذا المنتدى الأعضاء لا يعطون أهمية لهذه اللغة و بذلك لا يعطون أهمية لهذا القسم لأن عند تصفحي القسم و ألقي نظرة في الأسفل لأرى كم عظو يتصفحه فأجد :
    ( 1 ) الاعضاء , ( 0 ) الزوار , ( 0 ) عضو بدخول مخفي
    Z3r0n3
    !!!!!!!!!!!!!!

    يعني أنا العظو الوحيد !!!!
    مع العلم أن هذا الموقع هو أكثر موقع عربي يعطي أهمية لهذه اللغة ( يعني تخيل أنت كيف يكون حال المواقع العربية الأخرى )

    بعد تقديمي لقليل من الدروس في قسم الأسمبلي و أغلبها كان يتحدث عن الهندسة العكسية للمبتدأين (بالنسبة لي الهندسة العكسية = خبرة كبيرة في الأسمبلي) مع العلم بأنني مبتدأ في هذا المجال لم أجد أي تفاعل من المبتدأين مثلي و كأنهم كلهم خبراء ؟ حيث كانت كل الردود : أكمل الدروس أنا أتابعك, بداية رائعة, موفق ...
    أنا لا أكتفي بهذه الردود بل أريد نقاش, أريد من يضيف إلى معلوماتي و يشير إلى الأخطاء التي أرتكبها


    بذلك جاءتني فكرة كتابة موضوع يتحدث عن مبادئ كتابة الفيروسات, قلت لعل و عسى أن يخرج قسم الأسمبلي من الإنعاش و يزداد أحباء هذه اللغة و بذلك تعم الفائدة و نطور أنفسنا في اللغة و نصبح خبراء فيها و بذلك يمكننا كتابة الفيروسات, ممارسة الهندسة العكسية, كتابة مكافحات فيروسات و يكبر الحلم بنا ليصل إلى برمجة أنظمة التشغيل (نظام تشغيل مكتوب بأيادي عربية مسلمة !!!! : هل هناك إمكانية؟) أو تصميم لغة برمجة (نفس السؤال: هل هناك إمكانية؟)
    كل هذه الأحلام تغزوا أفكاري و أنا مازلت في مرحلة الصفر (تحت الصفر أحيانا!!)

    لنكتفي أحلام و نعود إلى واقع الميدان

    ما علاقة برمجة الفيروسات بلغة الأسمبلي؟
    كان هذا سؤالي عندما قرأت مقالة بالإنجليزية تتحدث عن الفيروسات و قد قمت بترجمة الجزء الذي يتحدث عن الأسمبلي. حيث يقول الكاتب :
    "الفيروسات التي كتبت بلغة الأسمبلي و لغات عالية المستوى مثل Basic,c,pascal
    صممت لتوليد البرامج المستقلة بذاتها
    لكن لغات عالية المستوى تكون تقريبا عديمة الفائدة في كتابة الفيروسات ببساطة لأنها لا تقدم أداء جيد للقفز من برنامج ضحية إلى آخر و ذلك لانتشار الفيروس
    هذا الكلام لا يعني أنا لا أحد يستطيع تصميم فيروس بلغة عالية المستوى يقوم بالغرض بشكل جيد, لكن لا أحد قام بهذا من قبل.
    لخلق فيروس يجب أن نستعمل لغة الأسمبلي فهي الحل الوحيد للسيطرة التامة على كل مصادر نظام الكومبيوتر ..."

    أرجو أن تكون ترجمة مفهومة ؟

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

    حسنا, أنا كتبت هذا الموضوع صدفة كيف؟

    الإجابة :
    فتحت برنامج صممته بلغة الأسمبلي في محرر الهكس و بدأ الإكتشاف



    كيف تأخذ الفيروسات معلومات من الملف التنفيذي -1

    كل مترجمات اللغة بعد تنفيذ عملية الترجمة تترك معلومات في بداية الملف التنفيذي (512 بايت)
    هذه المعلومات يحتاجها ال Loader (المحمل) لتحميل البرنامج و تجهيز البروسيسور لتنفيذ البرنامج.

    بعد ما فتحت البرنامج بمحرر الهكس كنت أعلم أن البرنامج يحتوي على 50 بايت من كود و بيانات
    (50 = 32h), بعد مايسمى بال DOS HEADER و وهما بياتان يمثلان الحرفين MZ و جدت الرقم 32h
    و هو عدد بايتات البرنامج و لأتأكد فتحت ملف مصدر البرنامج و حسبت قسم البيانات كم يحتوي على بايت فوجدت 16, ثم فتحت البرنامج بدبيغر الونداوز و حسبت بايتات الكود فوجدتها 34
    34+16=50=32h
    فتذكرت موضوع قرأته سابقا على هذا المنتدى كتبه الأخ JAAS

    اسم الموضوع : تعلم كيف تعمل مترجمات لغات البرمجة بنيه البرامج
    هذا الموضوع قرأته سابقا و لم أفهم منه شيء لكن بعد تقدمي في البرمجة و اكتشاف هذه الخطوة رجعت للموضوع و أخذت منه ما يفيدنا لهذا الموضوع :
    الإزاحة
    02h : عدد بايتات البرنامج
    14h : قيمة دليل الكود CS:IP (نقطة مدخل البرنامج)
    بخصوص الأخ JAAS :
    هو غائب منذ 2005 على المنتدى لكن دروسه مازلنا نستفيد منها و نحتاج منها المزيد حتى ولو كانت ذات مستوى متقدم, لذلك من يعلم معلومة عن الأخ JAAS أو موقعه الشخصي أو موقع يكون فيه عضو أو أي شيء فليخبرنا بذلك لأنه في الحقيقة نابغة بالبرمجة.
    لنكمل

    إذن الإزاحة 02h هي تمثل عدد بايتات الكود و البيانات و الإزاحة 14h تمثل نقطة مدخل البرنامج
    حسنا, الأولى اكتشفناها و تحققنا منها و الآن جاء دور الثانية

    رجعت لمحرر الهكس و ذهبت إلى الإزاحة 14h و جدتها تحتوي على 0000
    و هذا يعني أن القيمة الابتدائية لمؤشر التعليمة IP هي 0000 و لأتأكد من ذلك فتحت البرنامج بديبغر الونداوز فوجدت :


    كود:
    0CFD:0000 B8FF0C        MOV     AX,0CFF
    0CFD:0003 8ED8          MOV     DS,AX

    و فعلا القيمة الابتدائية لــ IP تساوي صفر

    هنا جاءتني فكرة تغيير نقطة مدخل البرنامج من خلال الإزاحة 14h
    و جربت أن أغير البرنامج أن يبدأ من التعليمة MOV DS,AX و التي في الإزاحة 0003 (0CFD:0003)
    فتحت البرنامج بمحرر الهكس و ذهبت إلى الإزاحة 14h و غيرت محتواها من 0000 إلى 0300

    لماذا 0300 و إزاحة التعليمة الثانية تساوي 0003 ؟

    ذلك لأن البيانات تخزن في الذاكرة بالشكل المعكوس, فمثلا إذا احتوى AX=ABCD و قمنا بتخزين محتواه في الذاكرة سيخزن البايت ذات الوزن المنخفض (AL) في الموقع الأول في الذاكرة و البايت ذات الوزن المرتفع (AH) في الموقع الثاني في الذاكرة

    سجلت التغيير و فتحته بالديبغر و وجدت:


    كود:
    0CFD:0003 8ED8          MOV     DS,AX
    0CFD:0005 8D1E0200      LEA     BX,[0002]
    سررت عندما رأيت أن مؤشر التعليمة أصبح يؤشر إلى 0003
    هنا مباشرتا جاءتني فكرة الفيروسات

    كيف تحقن الفيروسات الكود -2

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

    هنا سنتبع الخطوات التالية :

    1/ نحقن الكود بعد آخر بايت في كود البرنامج
    2/ ننفذ قفزة إلى نقطة المدخل الأصلية للبرنامج
    3/ نغير نقطة إدخال البرنامج إلى عنوان الكود المحقون

    1/ نحقن الكود بعد آخر بايت في كود البرنامج

    البرنامج الصغير الذي سنحقنه في آخر البرنامج الرئيسي هو يطبع حرف A على الشاشة
    و هو كالآتي :



    كود:
    MOV AH,02h
    MOV DL,41h
    INT 21h
    طبعا إذا حقنا هذا الكود مباشرة فلن يعمل أبدا لذلك يجب تحويله إلى كود الآلة و نكتبه بالنظام الست عشري
    و الحل هو استعمال ديبغر الونداوز و هو المفضل بالنسبة لي في تنقيح البرامج 16bit مع أنني لم أستعمل غيره (من لديه دروس عن هذا الديبغر فلا يبخل علينا)
    إذن نفتح الـ command prompt و نكتب debug
    ثم نضغط a من لوحة المفاتيح وهي تعني assemble سيأخذنا البرنامج إلى العنوان 0CA4:0100 و هنا نستطيع أن نكتب أكواد أسمبلي و ننفذها. نكتب كود برنامجنا
    تنبيه : عند الانتهاء من كتابة تعليمة نمر إلى التالية بالضغط على الزر Enter ثم نكتب التعليمة التالية كذلك حذف الحرف h بعد كل الأرقام لأنه من دون ما نشير له بأنه رقم هكس يكتبها تلقائيا (كل الأرقام يتخذها بالنظام الست عشري)

    عند الانتهاء من كتابة البرنامج نضغط Enter مرتين ثم ندخل حرف u ثم enter لنرى الكود الذي كتبناه :



    كود:
    0CA4:0100 B402          MOV     AH,02
    0CA4:0102 B241          MOV     DL,41
    0CA4:0104 CD21          INT     21
    ماذا لدينا :
    عنوان التعليمة ثم الكود بلغة الآلة ثم الكود بلغة الأسمبلي
    ما يهمنا هو الكود بلغة الآلة و هو التالي
    B402
    B241
    CD21
    هذا هو الكود الذي سنحقنه
    ملاحظة: لطباعة حرف في الشاشة بلغة الأسمبلي يتكلف هذا 6 بايتات !!!
    الآن يجب أن نحقن الكود بعد آخر بايت للبرنامج الرئيسي
    نفتح البرنامج الضحية بمحرر الهكس و نكتب الكود الذي تحصلنا عليه بعد آخر بايت

    شاهد الصورة :


    نقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعي


    سجل ماغيرناه على اسم آخر لأني سأحتاج البرنامج الأصلي للشرح في المرحلة القادمة

    2/ ننفذ قفزة إلى نقطة المدخل الأصلية للبرنامج

    هذه المرحلة تحتاج شرح أكثر من تطبيق

    لنبدأ:

    المعلومات التي تحصلنا عليها هي أنا البرنامج الأصلي حجمه 32h byte = 50 byte
    و باقي البرنامج هي معلومات يتركها المترجم للـ Loader ليجهز بها البروسيسور قبل تشغيل البرنامج
    حجم هذه المعلومات هو 512 byte = 200h byte
    حيث يبدأ أول بايت من هذه المعلومات من الأزاحة 0 و آخر بايت عند الإزاحة 511 = 1FFh

    بايتات البرنامج الأصلي تبدأ عند العنوان 512=200h في الملف
    هذا العنوان بعد تحميل البرنامج إلى الذاكرة يصبح العنوان 0 أي يصبح يشير إلى بداية البرنامج الرئيسي من كود و بيانات ( نحذف رقم المئات من العنوان بالهكس,200 نحذف 2 يصبح 000)

    لنجرب التالي :
    افتح البرنامج المرفق (ليس الذي حقنا فيه الكود) بمحرر الهكس و اختار آخر بايت فيه

    شاهد الصورة :


    نقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعي


    آخر بايت عنوانه 231h=561 نحذف رقم المئات من الرقم بالهكس يصبح 031h
    إذا إزاحة آخر بايت هي 031h من العنوان 0

    من هذا يمكننا معرفة الآتي :

    1* عدد بايتات البرنامج الأصلي وهي كالتالي :

    عنوان آخر بايت من الرنامج الأصلي – عنوان أول بايت من الرنامج الأصلي + 1 = عدد بايتات البرنامج الأصلي

    2* كم يلزمنا من بايت نقفز فوقه للرجوع من كود البرنامج المحقون إلى كود البرنامج الأصلي
    3* عنوان أول بايت من الكود المحقون (نستغلها في المرحلة التالية عند تغيير نقطة الإدخال الأصلية إلى عنوان البرنامج المحقون)

    في هذه المرحلة قلنا أننا سننفذ قفزة إلى نقطة المدخل الأصلية للبرنامج لذلك يلزمنا قفزة غير مشروطة (Unconditional Jump) و ذلك بإستعمال التعليمة JMP ( بلغة الآلة = 0EBh) لنقل التنفيذ إلى البرنامج الأصلي

    هذه القفزة يمكن أن تكون إلى الأمام (Forward) و يمكن أن تكون إلى الخلف (Backward)

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

    مقدار الإزاحة ستكون مساوية إلى :

    عنوان آخر تعليمة في البرنامج الأصلي + عدد بايتات الكود المحقون = الإزاحة
    بخصوص الكود المحقون سنضيف 2 بايت و هما خاصين بالقفزة الغير مشروطة :
    EB XX
    XX : تمثل عدد البايتات التي سنقفزها فوقها

    قلنا أن الكود لطباعة الحرف على الشاشة يتكلف 6 بايتات و نضيف 2 بايت الخاصة بالقفزة ليصبح 8 بايت

    حسنا لنطبق قاعدة الإزاحة :
    08h+31h= 39h

    نحن كما قلنا سابقا سننفذ قفزة إلى الخلف يعني ناقص الإزاحة التي تحصلنا عليها
    لنحوله إلى رقم سالب نطرح قيمة الإزاحة من 0FFh
    0FFh – 39h = C6h
    إذن القفز ستكون على الشكل EBC6 :

    نفتح البرنامج المحقون بمحرر الهكس وهو الآن يحتوي على كود طباعة حرف فقط و نضيف له في آخر بايت EBC7
    و الكود النهائي الذي كتبناه سيكون كالتالي :


    كود:
    B402B241CD21EBC6

    بهذا حققنا القفزة إلى البرنامج الأصلي

    3/ نغير نقطة إدخال البرنامج إلى عنوان الكود المحقون

    آخر جزء من الدرس

    طبعا إن قرأت الموضوع من البداية ستكون تعلم بأن الإزاحة 14h تحتوي على نقطة مدخل البرنامج و التي من خلالها سنحولها إلى عنوان الكود المحقون و بذلك سينفذ البرنامج الكود الخاص بنا و يطبع الحرف 'A' على الشاشة ثم ينقل التنفيذ إلى بداية الكود الأصلي للبرنامج من خلال القفزة

    حسنا قلنا أن عنوان آخر بايت في البرنامج الأصلي هو 31h و نحن كتبنا الكود الخاص في آخر البرنامج يعني بعد هذا العنوان و بذلك عنوان الكود المحقون يصبح 32h

    إذن نفتح البرنامج المحقون بمحرر الهكس, و نتجه مباشرتا إلى العنوان 14h و نغير الصفرين بـ 32h
    لا تنسو أنني تحدثت عن القيم كيف تخرن في الذاكرة (بشكل مقلوب)



    نقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعي


    ملاحظة : عدد بايتات البرنامج الأصلي تساوي إزاحة الكود المحقون كما هو مشار في الصورة, لنتخذها قاعدة جديد نقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعي

    نفتح البرنامج في الـ command prompt سيطبع لنا :
    AA0

    A الأولى خاصة بالكود الذي حقناه و الباقي هو تابع إلى البرنامج الأصلي

    إنتهى الدرس

    =====


    لتفهم أكثر الموضوع طبق هذه المراحل على برامج أخرى لتفهم أكثر (برامج 16bit)

    طبعا هذه تعتبر مقدمة إلى عالم الفيروسات كذلك أنا لست خبير في هذا المجال و كما قلت في بداية الموضوع أنني مازلت أتعلم لغة الأسمبلي و أحاول إحترافها

    الموضوع مازال مفتوح و يمكن أن نظيف إليه :

    1- نصمم برنامج يقوم بما فعلناه يدويا و بطريقة صحيحة :
    يمكن أن نستعمل الدوال التالية:
    CreateFile لفتح البرنامج الضحية ة الذي نريد حقن فيه الكود
    SetFilePointer لنضع مؤشر الملف في الإزاحات 02h و 014h للقراءة و الإزاحات 32h و 014h للكاتبة
    ReadFile لنقرأ من الملف
    WriteFile لنكتب على الملف
    CloseHandle لنغلق الملف

    من القادر على كتابة هذا البرنامج فل يبرمجه و يرفقه لنا لتعم الفائدة

    2- آلية النسخ (Copy Mechanism)

    طبعا برنامج الضحية لا يحتوي على خوارزمية تنقل العدوى إلى الملفات الأخرى و بذلك لم نحقق أول خاصية لدى الفيروسات و هي الانتشار
    فمن له العلم بهذا فل يتفضل و يفيدنا

    من برمج منكم فيروسات أو كتب دروس عنها ليرفقها لنا و لا يبخل علينا


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



    حمل البرنامج من المرفقات

    مبادئ كتابة الفيروسات قسم الأسمبلي في قسم الإنعاش
    مبادئ كتابة الفيروسات قسم الأسمبلي في قسم الإنعاش
    مبادئ كتابة الفيروسات قسم الأسمبلي في قسم الإنعاش

    الملفات المرفقة

 

ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •