في هذا المنتدى الرائع و المميز حقيقة واتمنى ان يكون هذا مفيدا بقدر ماهو طويل
متطلبات الدرس:
يتطلب فهم مباديء لغة الأسمبلي والتعامل مع البرامج عن طريق برامج التنقيح و بالأخص OllyDbg
درسنا اليوم يتحدث عن التحليل الفيروسات و التروجانات و سنبدأ إن شاء الله بــ:
Trojan-Dropper
قبل أن أبدا في الدرس يجب ان أشرح بعض الأشياء المهمة التي يجب ان يفهمها عضو لكي يستوعب الدرس.
دوال API:
واجهات برمجة التطبيقات
API :Application Programming Interface
هي مجموعة من الدوال أو الوظائف موجودة في ملفات ربط ديناميكية DLL يمكن للمبرمج إستخدامها في برامجه وتتيح هذه الأخير الإستفادة من وظائف نظام التشغيل
ويمكن إستدعائها من برامج كثير وفي نفس الوقت.
وهته الدوال مقسمة على ملفات الــ(DLL) كل على حسب وظيفته
مثلا : دوال Process ,Threading تجدها في Kernel32.dll
دوال التعامل مع المستخدم من رسائل وووو تجدها في User32.dll
دوال الرسم تجدها في GDI32.dll
ما هو Trojan Dropper:
هي عبارة عن برامج تقوم بدمج التروجان مع برنامج اخر لأغراض , أهمها خداع الضحية ثم بعد ذلك الإستلاء على جهازه.
وعلى سبيل المثال يقوم هذا النوع من البرمجيات بدمج تروجان مع برنامج ما كما هو مثالنا اليوم دمج حصان طروادة مع برنامج يدعون انه يتجسس على المايك الخاص بالطرف الأخر في محادثة الياهو.
نبدا بعون الله.
البرنامج المراد تحليله موجود في المرفقات.
***** Micإسم البرنامج
نفتح البرنامج بـــPEid
كما هو موضح في الصورة البرنامج مضغوط بال MEW 11 1.2 ولن نقوم بفكه ببرنامج فك الضغط الخاص به بل سنقوم بفكه بأنفسنا يعني يدويا(طبعا ليس بذلك القدر من الفك لكن عملية بسيطة جدااا) -
ملاحظة اخرى ربما يشكل عليك و انت تقرأ الكود في Olly فإذا نزلت للأسفل وجدت اكواد غير مفهومة و تجد كلمة FSG و..و..و ربما يتبادر الى ذهنك أن عملية فك الضغط ناقصة.
اقولك تجد الإجابة بعد قليل.
أظن أن المهم شغلنا عن الأهم لا تخف ها قد عدنا.
الأن سنتناول تحليل البرنامج بالتفصيل الممل لكي يتسنى لنا التعامل مع مثله مرة أخرى.
إفتح ال Trojan Dropper المفكوك في Olly
File<Open
ستظهر لك هذه الصورة.
هذا هو كود البرنامج الكامل نبدا بالشرح.
هذا البرنامج يتكون من مجموعة من دوال API اغلبها تخص القرائة و الكتابة من وإلى الملفات.
هنالك شيء غيرب الم تلاحظه....البرنامج إعتمد على دوال أخرى خاصة بالقرائة و الكتابة من المفروض أنه يستعمل Cr eateFile و Wri teFile لكنه إستعمل دوال أخرى.
من الممكن أن السبب هو أن المبرمج اراد أن يجعل لبرنامجه سماحية اكثر في أنظمة أخرى لأن تلك الدوال المستخدمة في البرنامج مخصصة لأنظمة 16-bit وتتوافق مع 32-bit فأراد المبرمج أن يعمل برنامجه على 16bit و 32Bit هذا إحتمال وارد أو ان الأمر منوط به والبيئية الذي يجيد البرمجة فيه و الكومبيلر.
من الصورة نجد أن البرنامج يستدعي دالة _lcreat وهذه الدالة مخصصة لأنظمة 16-bit و تعمل على انظمة 32 Bit وتقبلها الدالة Cre ateFile في 32 bit
تأخذ هذه الدالة 2 برامتر:
كود:
1-Attribute=خصائص إنشاء الملف
2-Fil eNmae=مسار الملف
البارمتر الأولى لها أربع حالات:
0=Normal
قبل للقرائة و الكتابة و التعديل و غير مخفي.
1=R ead Only
للقرائة فقط.
2=Hiden
مخفي.
4=System
ملف نظام و هو يشمل جميع المواصفات ما عدى
رجع الدالة _lcreat مقبض الملف وتخزنه في المسجل EAX
الدالة _lw rite
ويقابلها WriteFile في 32bit
تأخذ هذه الدالة 3 بارميتر:
كود:
1-BufSize=حجم البايانات المراد كتابتها.
2-Buffer=المكان الذي يحتوي البيانات المراد كتابتها في الملف.
3-hfile=مقبض الملف أو Object.
الدالة _lclose
تقوم هذه الدالة بإغلاق الملف بعد اكمال عمليات الإنشاء و القرائة.
الدالة ShelEx3cute
هذه الدالة تابعة لأنظمة 32bit
تقوم ببعض العمليات منها تشغيل الملفات التنفيذية.
تأخذ 6 بارميتر:
كود:
isShown(ShowCmd)=وضعية الظهور وبها عدة حالات منها
SW_HIDE
SW_MAXIMIZE.
SW_MINIMIZE
وأظن أن 5 هي في حالة SW_HIDE.
DefDir=المجلد الإفتراضي للبرنامج.
Parameters=من الممكن ان تكون Cm dLin3 فمثلا إذا كنت تتعامل مع برنامج ما وبشتغل بالكومند لاين راح تضعها هنالك.
FileName=واضح من اسمه.
Operation=العملية المطبقة على الملف و تأخذ 3 حالات:
Open: لفتح ملف تنفيذي
Print: لطبع الملف وهذه الخاصية بالمستندات document file
Explore: وتستعمل هذه الخاصية مع المجلدات.
الدالة ExitProcess
تقوم بإغلاق الملف ولها بارميتر واحد:
ExitCode=إذاكنت مبرمج اسمبلي إجلها 1 وريحنا.
عرف اني طولت عليكم و انا بنفسي مليت لا عليكم هذا هو الجزء الأهم في الشرح ما بعده سيكون أخف تابع.
الأن نأتي لشرح الكود المكتوب بالأسمبلي.
كود:
PUSH 0 //دفع البارميتر 0 للدالة
PUSH Unpacked.00463495 //دفع مسار الدروبر للمكدس
CALL DWORD PTR DS:[<&ke rnel32._lcreat>] //إستدعاء الدالة لإنشاء الملف
MOV EBX,EAX //كما قلنا مسبقا الدالة الاخير تخزن المقبض في المسجل
//EAX
//تقوم هذه التعليمة بنقل المقبض من
//EAX to EBX
//لكي يتم إستخدامها بعد قليل
PUSH 62449 //دفع حجم البفر للمكدس القيمة تكون بالهكس
PUSH Unpacked.0040104C // دفع عنوان البفر المراد كتابتها أي الدروبر الثاني
//ntlcs.exe
PUSH EBX //إستعمال المقبض قي عملية الكتابة وهذا ما يفسر التعليمة فوق
CALL DWORD PTR DS:[<&ke rnel32._hwrite>] //إستدعاء دالة الكتابة
//لن أكمل كل شيء راح يكون واضح دفع و إستدعاء دفع و إستدعاء.
PUSH EBX
CALL DWORD PTR DS:[<&kernel32._lclose>]
PUSH 5
PUSH 0
PUSH 0
PUSH Unpacked.00463495
PUSH Unpacked.00401047
PUSH 0
CALL DWORD PTR DS:[463537]
PUSH 0
CALL DWORD PTR DS:[<&kernel32.ExitProces]
ماذا نستنتج من هذا كله:
يقوم البرنامج بإنشاء دروبر ثاني بعد ذلك يقوم بكتابة الكود بداخله, انتظر ماذا قلنا فوق عن الأكواد المبهمة و عبارة FSG وووو هنا يتضح الأمر
تلك الأكواد هي خاصة بالدروبر الثاني ntlcs.exe و اذا اكملت معنا ستجد أن البرنامج مضغوط بال FSG.
تعلو سنلقي على الكود نظرة سريعة.
كيف سنلفي عليه نظرة لا حظ هذه التعليمة.
PUSH Unpacked.0040104C
وهي القيمة التي دفع على شكل عنوان لمحتويات للدروبر الثاني لدالة _lwr ite نذهب إليها سنرى الموجود في الصورة.
شاهد الصورة
ويبدا ب MZ بمذا تذكرك هذه العبارة اه تذكرة بمقدمة الملفات التنفيذية و هي إختصار لإسم مخترعها و هو Mark Zibikowsky.
ثم يقوم بتشغيله في وضع الإخفاء ثم يغلق البرنامج.
اذا اردت التعمق و التتبع اكثر انصحك أن تتوقف عند دالة _lclose لأنك إذا اكملت سوف ترى ما لا يحمد عقباه D:.
ماذا نفعل الأن......
سنذهب لتحليل الدروبر الثاني و هو الأهم لأنه هو الذي يقوم بنشر السيرفر في جهاز الضحية + تشغيل برنامج *****Mic.
نفحص البرنامج بال PEiD سنجده مضغوط بال FSG يجب عليك أن تستعمل الطريقة التي وضحتها في الفيديوا ولا تتعب نفسك بعمل Dump له واصل من هنالك وستكمل الدرس بشكل عادي.
الدروبر الثاني مصمم بالدالفي)ترى الدالفي يعملون بيه عمايل)d:
شاهد صورة الدروبر في Olly
تمثل الصورة بداية الشيفرة الخاصة بالدروبر هل شاهدت تلك الطلاسم الموضوعة في إيطار ياترى ماهي و ماذا يفعل بها البرنامج.
أعرف أن الامر يحيرك كما حيرني لكن الأمر وبكل بساطة هي عبارات مشفرة و مرمزة, ياترى ما هي تلك العبارات, لن أدخل في شرح كيفية فك هذه العبارات لأننا سنخرج عن سياق الموضوع وندخل في مجال فك خوارزمية التشفير الفعلية في الأسمبلي لذلك لقد قمت بإيجاد مكان الخوارزمية لكي يتسنى لك تحليلها.
وإذاكنت تريد فك الخوارزمية انصحك بالبدا من هذا العنوان 00403FC5 والغوص في اعماق البرنامج ما بين Calls و Rets وانصحك ان تتبع كل Calls على حدى وان وجدت Calls أخرى ادخل إليها و أكمل التتبع منها بالتوفيق smale.
هل اكملت فك الخوارزمية على كل حال إذا إختلط عليك الأمر إذهب إلى هذا العنوان 00402538 وستجد ما يسرك وإن اردت الحل خذ هذا العناون 00402572 هنا سيتم نقل الحرف المقابل لكل حرف مشفر إلى سلسلة نصية ما.
على كل فك عن نفسك العناء فلقد اردت منك التعمق و التحليل لكي تتمرن على مثل هذه الأمور و اذا واجهتك مثل هذه الخوارزميات مرة اخرى ستعتاد على حلها.
اذهب إلى هذا العنوان 00403FC5 وستجد تعليمة Call في ذلك العنوان تبدا عملية فك التشفير بعده تماما يوجد تعليمة MOV يقوم بنقل العبارة الأصلية من المكدس إلى المسجل EAX وتحتها العبارة المشفرة في المسجل ECX وهكذا مع كل العبارات المشفرة, أرأيتم بسيطة لكن لولا المعلومات الموجودة في الأعلى لما عرفت أن العبارة الموجودة في EAX هي نفسها الموجودة في ECX ولكنها مشفرة.
طبعا إذا أردت رؤية الكلمة الأصلية و المشفرة في المسجلان EAX و ECX إذهب إلى عنوان Call المذكور في الأعلى و اضغط F2 لوضع نقطة توقف ثم F9 لتشغيل الدروبر راح يتوقف Olly عند نقطة التوقف إضغط F8 مرتين وستراهما.
وهذه قائمة بالعبارة المشفرة و كلماتها الأصلية:
رايتم البرنامج يهيأ هذه الدوال لعمل ما دعونا نكمل لنعرف ما هو.
الأن ضع نقطة توقف على العنوان التالي 004040D1 إضغط F9 سيتوقف Olly بعد روتين فك التشفير.
شاهد معي الصورة
هل ترى تعليمة
XOR EAX,EAX
تعمل على تصفير المسجل EAX او بمعنى اخر تهيئته لإستقبال البيانات.
هنالك بعدها مباشرة تعليمة Call ياترى ما ذا يوجد بداخلها تعالوا ندخل إليها ونقوم بتحليلها إضغط انتر ثم إضغط F2 لوضع نقطة توقف إضغط F8 ستجد نفسك هنا.
ملاحظة:
كلمة Data_Sniper و إسم المنتدى الموجودة في الكود ليست تابعة له بل انا اضفتها وستجدونها في اغلب الصور.
كما تشاهد في الصورة توجد هنالك دالة وحيدة فقط و هي GetModuleFil eName
تقوم هذه الدالة بإرجاع المسار الكامل للملف التنفيذي.
تأخذ هذه الدالة 3 براميتر:
كود:
BufSize=حجم مسار الملف التنفيذي
PathBu ffer=مؤشر لعنوان المسار
hModul=في حالتنا الموديل هو null و في هذه الحالة سيتم إرجاع مسار الملف التنفيذي الذي طلب دالة GetModuleFil eName
نبدا بشرح التعليمات ,على كل حال, كل شيء واضح ولكن أشرح للتوضيح اكثر.
شاهد الصورة
-مجموعة من التعليمات تعمل على تهيئمة المسجلات بالقيم المناسبة ثم تليها تعليمة إتصال Call هذا الإتصال يقوم بطلب كود من الدروبر يعمل على التحقق من بعض الشروط ثم تليها تعليمة Test المنطقية وكما تعلمنا من دروس الأسمبلي أن التعليمة المنطقية لها جدول حقيقة,وهو ممثل هنا:
1 TEST 1 = 1
1 TEST 0 = 0
0 TEST 1 = 0
0 TEST 0 = 0
هذه التعليمة تؤثر على الرايات إذا كانت النتيجة من العمملية المنطقية تساوي صفر يتم جعل قيمة ZF=0 و العكس صحيح.
بعدها التعليمة JNZ ونعلم أن هذه التعليمة تتأثر بالراية ZF فإذا كان ZF=0 فإن التعليمة ستنفذ ويقفز البرنامج ولكن ESI يساوي 0 نطبق عليها العملية المنطقية فنجد انها تساوي 0 وبذلك سيتم جعل ZF=1 ولن يقفز البرنامج.
2-التعليمات واضحة دفع البرارميتر للدالة ثم إستدعائها.
تعليمات MOV الثلاثة بمثابة نقل الباث التابع للدروبر من مسجل لمسجل لأغراض خاصة بالبرنامج.
شاهد صورة المسجلات
عد ذلك قفزة يليها الرجوع إلى ماكان عليه البرنامج من قبل.
بعد هذا كله لن يكون الشرح بالتفصيل فيما يخص الدوال و التعليمات ستكون رؤس اقلام و سأترك لك حرية البحث و التنقيب عن الدوال في جوجل و اي سؤال انا موجود.
شاهد هذه الصورة
هنا يقوم البرنامج بإنشاء مقبض لنفسه عن طريق الدالة Cre ateFileA
ثم يقوم بتغير مؤشر القرائة عن طريق الدالة SetFilePointer ليبدا بقرائة نفسه وإستخراج المعلومات.
الأن وبعد هذا كله الدروبر يبدا بإستعمال خوارزمية لفك تشفير إسم البرنامجين السيرفر و الياهو مايك عن طريق حلقة تكرارية كبيرة بها حلاقة تكرارية صغيرة .
الحلقة التكرارية تدور 105 مرة و الحلقة التكرارية الكبير تدور مرتين مرة لبرنامج *****Mic ومرة ل Se rver .
إذهب إلى العنوان التالي 00403C8C ضع نقطة توقف كالمعتاد, تتبع بالضغط على F8 إلى ان تصل إليها او قم بالضغط على F9 لتشغيل الدروبر وسيتوقف Olly عندها.
إبدأ بالتتبع سترى بعض الدوال المعتاد عليها مثل Re4dFile و Set FilePointer وتقوم تلك الدوال بقرائة الدروبر و بدية استخراج البيانات الفعلية من اعماق البرنامج.
واصل التتبع إلى أن تصل للعنان التالي 00403D04 هنا تبدأ عملية الفك.
شاهد الصورة
بعد إكمال الحلقتين و إستخراج إسم البرنامجين إذهب ل هذا العنوان 00403D5C وستجد في بعض الدوال منها:
GetSystemDirectoryA
التي تقوم بإستخراج مسار system32 لديك لكي يقوم بنسخهما إلى هنالك.
الأن هنالك حلقة تكرارية اخرى تقوم بفك شيفرة برنامج *****Mic وهي موجودة في العنوان التالي 00403E1C تتبعها كما كنا نفعل من قبل وانظر إلى الأسفل ستجد البيانات تتغير وفي تلك اللحظة يتم فك التشفير.
عد ذلك يستدعي دالة Shell ExecuteA لتشغيل *****Mic واصل وشغل البرنامج لا ضير في تشغيله لن يصيبك شيء.
الان مازال السيرفر لم يتم تشغيله وفك تشفيره
بعد عملية فك تشفير *****Mic وتشغيله ويقوم ببعض التعليمات يقوم بإستخراج كلمة Se rver.exeوإستعمالاها في نفس الحلقة , الحلقة السابقة الذكر التي تقوم بفك شيفرة البرنامج.
شاهد الصورة
الصورة مكتوب بها الشرح كل شيء واضح أنصحك بعدم الإكمال من تلك الدالة ShellExecuteA لأنك ستوف تخترق بعد غضون ثواني
السلا عليكم
شباب اقسم بالله العظيم
ان الموضع كان عندي الكتب الاكترونيه
ولم اعرف صاحب الموضوع
بس مذكور انو موقع الفريق العربي للهندسه العكسيه
مع العلم لم اعرف صاحبه
مكشور على المضوع بس يا اخي كلكو هيك بتشرحو وبطبقو على برنامج انتو بتختاروو ياريت
لو تشرحلو طرق تنفع لك البرامج
انا عن نفسي بفتح البرنامج وبراقب العمليات واذا السيرفير موقوت بنتظر لحد ما يشتغل
وهيك بعرف تلغيم البرنامج
صراحة ما بحب هيك دروس غامضة بتقول نلاحظ ونلاحظ كانو يعني احنا عاريفين شو بتقول
هههههههههههههه
لا تزعل بس هذا الواقع المشكلة تخصيي اسمبلي ههههههههه
بس لس ما بدات فيه
سلام
والف شكر والموضوع منقول شفت نفسوو على ما اعتقد
توقيع : ip-13
اقوى شرح في التاريخ التخلص من اقوى الاختراقات في العالم وتخطي كل طرق الحقن وغيهرهاا
موضوع رائع ومتميز ماشاء الله
ودرس واضح ان من كتبه بارع بالهندسة العكسية وتحليل البرمجيات
الحقيقة المبرمج الذي لايعلم شيء عن الهندسة العكسية يجب ان يخجل ان يصف نفسه بلقب المبرمج
فالمشكلة تجدا اغلب الناس يقولك انه مبرمج طب
تسأله ماهي ديناميكية عمل البرامج في النظام ؟؟
لايعرف فقط تعود ان ينقل الاكواد دون اي تعب يذكر او تعود ان يضع بعض الاضافات فقط ثم يقول تبم برمجته بواسطة ....
المبرمج الحقيقي هو من يعرف ديناميكة عمل البرامج في النظام ويفهم كيف تعمل بالظبط بادق تفاصيلها
مثل كيفية الاستدعاء calling والعودة وماهي عملية المقدمة للدالة prolog والخاتمة للدالةepilog وغيرها من التفاصيل الدقيقة
المبرمج الحقيقي من يعلك خبايا البرمجة والاخطاء التي يقع فيها المبرمجون وبالتالي لايقع في هذه الاخطاء
فمثلا المبرمج المحترف تجده يعرف اثناء برمجته ان الدالة الفلانية فيها خطورة على البرنامج حيث قد تجعله مصاب بثغرة اوفر فلو مثلا وليكن على سبيل المثال دالة strcpy في لغة السي.
ربما اطلت بكلامي لكن بحق انا اعجب بالشخص الفاهم والذي يعرف عن ماذا يتحدث بالظبط
تحياتي لكاتب الموضوع
اخو في الله
النمر المصري