بسم الله الرحمن الرحيم
أخي الكريم / استاذ مشهور جدا
هل مر عليك يوم و وجدت فيه فيرس بالصدفة في جهازك و برنامج الحماية عندك لا يتعرف عليه ؟
أعتقد أن أغلبنا قد واجه تلك المشكلة الخطيرة أو علي الأقل يوجد أحد من المعارف أو الأقارب قد صادفته تلك المشكلة.
و ان كان كذلك ... إذن .. فما الحل ان وجد ؟
اعلم ان موضوع مقاومة الفايروسات موضوع طويل ومعقد ومتجدد بإستمرار ولكن الأساسيات باقية إلى اليوم
القاعدة التي تبنى عليها برامج مكافحة الفايروسات هي:تحليل الفايروس ثم إصدار توقيع ثم إصطيادة
هذه الثلاث نقاط الاساسية هي موضوعي اليوم , الأمثلة في هذا الموضوع تتطلب برامج هكس
وديسمبلي وسنأخذ olly + مترجم لغة سي وسنأخذ الفيجول سي. .. و تلك البرامج موجودة عندي لمن يطلبها.
و الجدير بالذكر ان هناك أكثر من نوع من الفيروسات تختلف باختلاف طريقة عملها فمثلا هناك
فايروســــات تعمــل عـن طريــــق قاعـــدة بيانــات الريجستـــري
-
فـايروســـات تعمــل عــــن طــريــــق ملـفـــات التــأسيـــس ini
-
فايروسات تعمل عن طريق الملفــات الدفعيــة للنظام دوس bat
-
فايروسات تعمــل عن طريـــق قائمــة البرامــج Start Menu
-
فايروسات تعمل عــن طريق حقن الملفات viruses injecting
-
فايروسات تعمل عن طريق قطاع الإقلاع BOOT SECTOR
و للتحدث عن الفيروسات لن يسعني الوقت و المكان هنا للتفصيل و نعود لاهم نقطة سنتعرف من خلالها علي الفيرس و هي كيفية كتابة برنامج Anti Virus نريد توزيعه على معارفنا و اقاربنا ليتم حذف الفيروس
من أجهزتهم .
سنأخذ هذا المثال على الاساسيات
والملف التنفيذي محل التجربة هذا .exe عادي جدا و خالي من اي كود فيروس سنفترض انه ملف الفايروس الذي وجدناه بعد مراقبه النظام. و يمكن تحميلة من هنا
Download : vir.zip
بعد ذلك سنبدأ بإصدار توقيع لهذا الفايروس ! ولكي نتمكن من إصدار توقيع ليتم معرفه ملف الفايروس
به يجب ان نكون ملمين بطريقه بناء الملفات التنفيذية وطريقة تقسيمها ولذلك سنبدأ بدراسة هذه الامور
-
اولاً: دراسه لمقدمه الملف التنفيذ
إن اغلب الملفات في مختلف الأنظمة تكون مقسمه بهذا الشكل ( مقدمة الملف ثم محتواه)
المقدمه دائما تحتوي على تفاصيل يعتمد عليها الملف ويعتمد عليها النظام في قرائة الملف فمثلاً ملف
الصور او اي صوره تحتوي في مقدمتها على معلومات مهمه مثل الالوان المستخدمه ونوع الصوره والاحجام
وهذه المعلومات تكون مهمه لأي برنامج يقرأ هذه الصوره , وبنفس الطريقه تحتوي الملفات التنفيذيه
على مقدمه بها معلومات مهمه مثل عنوان بدايه تنفيذ البرنامج وعنوان قسم الكود والبيانات والمصادر
لو بدئنا بدراسه هذه المقدمه لوجدنا انها تنقسم إلى ثلاث اقسام وهي
1- مقدمه DOS ثم 2- مقدمه PE ثم وفي النهايه sections او الاقسام
1- مقدمه DOS
لمشاهدة هذه المقدمه من خلال برنامج olly ومن القائمة veiw إختر file ثم تجول في جهازك
وإختر مثالنا virus.exe ,, سيظهر لك محتوى الملف بصيغه الهكس , وإذا اردنا عرض
الملف بصيغه المقدمات إضغط بالزر الأيمن للماوس وإختر Special ثم PE header كما تشاهد في الصورة
بعد ان تغير طريقة العرض إلى PE header ستظهر لك عند العنوان صفر مقدمه الدوس
بمعنى ان اول مقدمه عند اول بايت في الملف تمثل مقدمه الدوس كما تشاهد
الآن سنكتب معنى كل بايت في مقدمه الدوس مع ملاحظة ان كل الارقام ستكون بالنظام الست عشري hex
اول بايت في اي ملف تنفيذي
00: MZ
الحرفين M و Z تمثلان توقيع الملف التنفيذي وتم إضافه للمقدمه لشغله مهمه وهي ان الملفات التنفيذيه لها
انواع كثيرة جدا مثل ملفات dll وocx و sys و vxd و scr وcpl و.....
لكثر انواع الملفات التنفيذية تم إضافه توقيع للملف ليعرف النظام انه ملف تنفيذي
بعد ذلك تبدأ بقيه البيانات التي في الحقيقة ليست لها اهميه في نظام وندوز اهميتها كانت ايام دوس
02: عدد البايتات في آخر بلوك البلوك مكون من 512 بايت DOS_PartPag
04: مجموع عدد البلوكات في الملف التنفيذي DOS_PageCnt
ملاحظه القيمه الأولى ضرب القيمه الثانيه يساوي حجم الملف التنفيذي
06: عدد مداخل الكتل الذاكريه المتحركه أو المتنقله DOS_ReloCnt
08: حجم ترويسه الفقره DOS_HdrSize
0A: الحد الأدنى من الفقرات في الملف التنفيذي DOS_MinMem
0C: الحد الأعلى من الفقرات في الملف التنفيذي DOS_MaxMem
0E: قيمه المكدس SS ويمثل DOS_ReloSS
10:قيمه دليل المكدس SP ويمثل DOS_ExeSP
12: مدقق المقارنه DOS_ChkSum
14: قيمه دليل الكود CS:IP ويمثل DOS_ExeIP
16: بدابه عناوين الكتل الذاكريه ويمثل قسم الكود DOS_ReloCS
18: علامه تدل على بدايه كتله ذاكريه DOS_TablOff
وهذا البايت قد يكون مفيد لتحديد الكتله الذاكريه التاليه وهي مقدمه pe الخاصه بنظام وندوز
1A: قيمه هذه الكلمه دائما صفر لتدل على بدايه البرنامج من الداله الرئيسيه DOS_Overlay
وبعد هذه المقدمه يجب ان تعرف ان الفايروسات نادرا ماتستخدم هذه المقدمه لان اغلب المعلومات
بها لايستخدمها النظام.
نكمل وندخل اكثر في الموضوع ,, قلنا ان البايت 18 بالهكس يمثل الكتله الذاكريه التاليه
خلونا نستخدمه لنحصل على عنوان كتله pe لو لاحظت ان البايت 18 يساوي القيمه 40
توجه للسطر 40 ( ملاحظة كل الارقام في هذا الموضوع بالصيغه الهكس )
ستجد عند العنوان 40 رقم آخر هو C8 ويمثل عنوان بدايه pe توجه للإزاحه C8 ولاحظ مقدمه pe
لو فهمنا هذه المقدمه سنكون قادرين على الدخول في تفاصيل اي ملف تنفيذي
لاحظ مايدل عليه كل بايت في هذه المقدمه
00:علامه بدايه توقيع البرنامج مكونه من 4 بايت PE signature
04:نوع الآله التي يعمل عليها البرنامج Machine وتدل على نوع المعالج مثل 386
06: عدد الأقسام في البرنامج قسم الكود وقسم البيانات وهكذا NumberOfSections
08: وقت إنشاء البرنامج TimeDateStamp
0C: مؤشر إلى جدول الرموز الرموز تستخدم في التنقيح ولا تستخدم في البرنامج النهائي PointerToSymbolTable
10: عدد الرموز NumberOfSymbols
14: حجم ترويسة (PE signature) الملف غير متضمنه حجم الأقسام وهي متساويه في كل البرامج SizeOfOptionalHeader
16:خصائص البرنامج Characteristics مثل برنامج نظام او مكتبه ربط او....انواع الملفات التنفيذية
18:نوع ترويسة الملف MagicNumber
1A:رقم إصدار الرابط النهائي MajorLinkerVersion الرابط هو احد اقسام مترجم لغه البرمجه
1B:رقم إصدار الرابط الأولي أو التجريبي يساوي 0 MinorLinkerVersion
1C:حجم قسم الكود في البرنامج التنفيذي SizeOfCode
20: حجم قسم البيانات للبرنامج SizeOfInitializedData
ملاحظه بعض المترجمات تعتبر كل الأقسام بيانات وتكون القيمه هنا الحجم الوهمي لكل الأقسام
بعضها لا يعتبر قسم الكود بيانات وتكون القيمه هنا الحجم الوهمي لكل الأقسام عدى قسم الكود
24:حجم قسم البيانات الغير متغير SizeOfUninitializedData
28: عنوان بدايه تنفيذ البرنامج AddressOfEntryPoint
2C:عنوان بدايه قسم الكود BaseOfCode
30: عنوان بدايه قسم البيانات BaseOfData
34: عنوان البرنامج في الذاكره ImageBase
ملاحظه بعد ما يشتغل البرنامج وينقل إلى الذاكره كل العنواين مثل عنوان بدايه البرنامج وعناوين الأقسام
يضاف إليها عناون البرنامج في الذاكره وهو عنوان وهمي
38: يحتوي إزاحه أول قسم في البرنامج وعاده يكون قسم الكود والفائده ترتيب أقسام البرنامج SectionAlignment
3C: يحتوي على تنسيق الأقسام والفرق بين حجم القسم الفعلي والوهمي ولذلك سيتم شرحها مع الأقسام FileAlignment
3E:إصدار نظام التشغيل النهائي MajorOSVersion
40: إصدار نظام التشغيل الأولي MinorOSVersion
ملاحظه أي إصدار أولي أو تجريبي يساوي صفر
42: إصدار العنوان الوهمي للبرنامج راجع الإزاحه 34 وغالبا يساوي إصدار نظام التشغيل MajorImageVersion
44: الإصدار الأولي للعنوان يساوي 0 MinorImageVersion
46: إصدار النظام الفرعي النهائي يساوي إصدار نظام التشغيل MajorSubsystemVersion
48: الإصدار الأولي للنظام الفرعي يساوي 0 MinorSubsystemVersion
4A: محجوز للنظام
4E:حجم عنوان البرنامج يساوي العنوان الفعلي لآخر قسم +حجم القسم الفعلي SizeOfImage
52: حجم كل الترويسات بمعنى أول مايبدأ شفره البرنامج بعد الترويسه SizeOfHeaders
56:مدقق المقارنه CheckSum وهو عباره عن إعطاء الملف توقيع لا يشبه اي ملف آخر , سندخل في هذا الموضع عل نهاية الموضوع.
5A: خصائص إظهار البرنامج برنامج رسومي أو كونسل مثل الدوس ولكن 32 بت Subsystem
5C: خصائص ربط المكاتب بالثريد أو العمليه DLLCharacteristics
5E:الحجم الإفتراضي للمكدس وهو دائما يساوي واحد ميجابايت SizeOfStackReserve
62: الحجم الحالي للمكدس SizeOfStackCommit
66: الحجم الإفتراضي للكومه وهو دائما يساوي واحد ميجا SizeOfHeapReserve
6A: الحجم الحالي للكومه SizeOfHeapCommit
ملاحظه كل الأربع الأحجام للمكدس والكومه متشابهه في كل البرامج إذا لم يغيرها المبرمج نفسه
6E: أعلام المشغل البرنامج LoaderFlags
72:القيمه الإفتراضيه لعناوين وأحجام الأقسام الفعليه في كل المترجمات يساوي 16 أي 10 بالهيكس NumberOfRvaAndSizes
وهو أن لكل قسم عنوان فعلي واحد وحجم فعلي واحد ... عدد الأقسام ضرب 2 قد يكون عدد الأقسام
أكبر ... ههههه ليست مشكلة ... إعلم انها ليست كلها فعليه وهذه الاساليب متبعه في برامج التشفير
76: عنوان جدول الدوال المصدره من الملف Export Table address
7A: حجم جدول الدول المصدره Export Table address
7E: عنوان جدول الدوال المستورده للملف Import Table address
82: حجم جدول الدوال المستورده Import Table size
86: عنوان جدول مصادر الملف الأيقونات والنوافذ وغيرها Resource Table address
في مثالي تجده صفر لأنني لم أستخدم اي ايقونه او نافذه او صوره
8A: حجم جدول مصادر الملف Resource Table size
8E: عنوان جدول الإستثناءات والأخطاء في البرنامج Exception Table address
92: حجم جدول الإستثناءات Exception Table size
96: عنوان جدول شهادة البرنامج Certificate File pointer
9A: حجم جدول شهادة البرنامج Certificate Table size
هذه الجداول لا اعرف متى تكون مستخدمه ربما سأعرفها ان شاء الله في المستقبل
إلا ان القيمه الإفتراضيه لهذه الجداول 0 واعتقد انها ستستخدم مثل طريقه
شهادة الوثوقيه للمواقع
9E: عنوان جدول الكتل الذاكريه المتنقله Relocation Table address
A2: حجم جدول الكتل Relocation Table size
الكتل المتنقله عباره عن طريقه لتخزين كود تنفيذي في قسم البيانات
ظهر استخدامه اول مره في برامج الضغط والحزم ثم في برامج التشفير والآن في الفايروسات
A6: عنوان بيانات تصحيح البرنامج غير مستخدم في البرنامج النهائي Debug Data address
AA: حجم البيانات Debug Data size
AE: عنوان بيانات تصميم وبنيه البرنامج Architecture Data address
B2: حجم البيانات Architecture Data size
B6: عنوان جدول المؤشرات العامه Global Ptr address
BA: حجم الجدول
BE: محجوز للنظام
C2: عنوان مخزن خيوط او ثريد البرنامج المحليه TLS Table address
C6: حجم الجدول TLS Table size
CA: عنوان جدول تشكيله البرنامج Load Config Table address
CE: حجم الجدول Load Config Table size
D2: عنوان تحديد جدول إستيراد الدوال Bound Import Table address
D6: حجم الجدول Bound Import Table size
DA: جدول العناوين لعناوين الإستيراد Import Address Table address
DE: حجم الجدول Import Address Table size
E2: جدول الإنتظام لإستيراد الدوال Delay Import Descriptor address
E6: حجم الجدول Delay Import Descriptor size
EA: عناون بدايه ملفات التشغيل لتقنيه الكوم COM+ Runtime Header address
EE: حجم جدول الإستيراد Import Address Table size
F2: محجوز للنظام Reserved
F4: محجوز للنظام Reserved
-
بعد ذلك يبدأ تنسيق الأقسام في البرنامج وكلها نفس القاعده
0-7: إسم القسم وحجمه 8 بايتات SECTION
0B: الحجم الفعلي للقسم VirtualSize
0F: العنوان الفعلي للقسم VirtualAddress
13: الحجم الوهمي للقسم SizeOfRawData
17:العنوان الوهمي للقسم PointerToRawData
القصد منه الفصل بين الأقسام ... مثلا .. لو فتحت أي برنامج
بمحرر هكس من بدايه البرنامج ستلاحظ قسم الكود وبعده فراغ وهي الاصفار
وبعدين القسم الأول من البيانات وبعده فراغ هذه الفراغات للتقسيم
ولهذا فإن الحجم الفعلي للقسم يساوي القسم بدون الفراغ والحجم الوهمي يساوي القسم زائد الفراغ
1B:مؤشر إلى عنوان التحريك للقسم PointerToRelocations
1F:مؤشر إلى رقم السطر PointerToLineNumbers
23:رقم النقل للقسم NumberOfRelocations
25:عدد الأسطر NumberOfLineNumbers
هذه المعلومات خاصه للتبديل بين الأقسام
القيمه الإفتراضيه صفر
27:خصائص القسم Characteristics قسم شفره أو بيانات أو قسم متحرك و للكتابه أو غيره
وهكذا مع كل الأقسام
يتبع ان شاء الله
مواقع النشر (المفضلة)