22 تغريدة 15 قراءة Jul 10, 2022
تخيّل معي انك جاي تحلل executable وتكتشف انك لمن تشغله داخل debugger يوقّف تنفيذه وينهي البروسس حقته ولكن اذا تم تشغيله خارج الـ debugger يكون شغال طبيعي وعادي وينفذ مهماته
هذا الي يقدر يسويه كاتب البرمجيات الخبيثه باستخدام الـ TLS Callbacks عشان يشوش على المحلل، ومثل هالطرق المُستخدمه لنفس هذا السيناريو يندرجون داخل فئة
Anti-debugging techniques
ولكن كيف يصير كذا هذا ما سنعرفه في هذا الثريد تاكد انك مسوي فولو ومفعل جرس التنبيهات عشان يوصلك جديدنا اول باول ✨ ...
بالبداية لازم نعرف كونسبت مهم الا وهو الـ threads والي قبل لا نعرفه لازم نعرّج على الـ processes، الـ CPU لمن يجي يشغل برنامجين او بالاصح بروسيسسين بنفس الوقت فهو كل مده زمنيه ينتقل بالتنفيذ من بروسيس الى اخرى بشكل ما يلاحظه المستخدم العادي
طيب داخل البروسيس قالوا نقدر نخلي اكثر من thread كل منهم يشغّل جزء معين من الكود في كل فتره زمنيه معطاه للـ Process
بصياغه اخرى الحين يجي الـ CPU يشوف منو البرامج او البروسسات الي تبي تشتغل بنفس الوقت، ويقول خلاص كل بروسيس انا بعطيها N وحده زمنيه تنفذ فيها شغلها اذا خلص الوقت N ابي انتقل الى البروسيس الثانيه ويضل ينتقل بين البروسيسسين الى ان ينتهون
طبعاً انا اقول بروسسيسين لتوضيح ولا هو يقدر يشغل اكثر من بروسسين ( بنفس الوقت بنظره المستخدم العادي )
هذا على صعيد البروسسات، بعدين قالوا يبا مدام كل بروسيس لها فتره زمنيه ومرات تروح هذي الفتره والبروسيس تكون تنتظر شي مثل قراءه ملف او تتكلم مع الطابعه او تسوي شي ياخذ وقت، سوو مفهوم الـ threads والي هو باختصار بروسيسات صغيره داخل بروسيس يسمونه البروسيس الاب
وقالوا نعطي المبرمج الصلاحيه انه يقدر يقسم كوده ويخلي كل قسم من الكود يشتغل بب ثريد بروحه، فف يصير اذا الـ CPU يعطي وقت N للبروسيس فهذا الوقت يتقسم على عدد الثريدات الي داخل البروسيس هذي
فف الي صار ان ويندوز على سبيل المثال تقول كل بروسيس داخلها على الاقل ثريد وهو الي ينفذ مهام البرنامج ( هذي المعلومه مهمه وهي المقصد من السالفه الطويله الي فوق )
فف زبدة الكلام ان اي برنامج يشغله ويندوز يتم انشاء بروسيس له وداخل البروسيس هذي ثريد على الاقل وهو الي بدوره بينفذ الكود
وطبعاً كل thread يحتاج لامكانيات واشياء تكون خاصه فيه لحاله عشان ما يتصادم مع اخوه الـ thread الثاني وتصير مشاكل عائلية داخل البروسيس وتتفكك الاسره
وايضاً ويندوز سوو مفهوم
الـ Thread Local Storage callbacks عشان يسمحون للمبرمج يجهز الـ thread الي على الاقل بيكون واحد لكل process قبل تنفيذ الـ main function والي هو عادةً نقطه البداية لتنفيذ مهام الـ executable
وبما انه بيتنفذ قبل الـ main function فف كاتب البرمجيات الخبيثه او الي يبي يصعب عملية الـ debugging على المحلل يقدر يشيك اذا كان البروسيس شغاله داخل debugger فف يتصرف بتصرف مغاير لطبيعته عشان يضلل المحلل او يقدر بكل بساطه ينهي البروسيس بكبرها وهنا قد يهنق مخ المحلل من هالشي
بصياغة اخرى بعين الـ debugger، الـ debugger يشوف الـ PE Structure ويطلع منه الـ entry point تبع الـ executable فف يجي ويحط breakpoint ، والمحلل من جانب اخر بيسوي run
للـ executable داخل الـ debugger لين يوصل عند الـ entry point ومن هنا يبدا يحلل
ولكن الي يصير ان المحلل بهالحال يحسب نفسه الصياد ما يدري انه صار هو الفريسه لان الـ tls callbacks اشتغلت او تشتغل عادةً قبل الـ entrypoint الي بيوقف عندها الـ debugger
لو نشوف الكود السفري ادناه نلاحظ انه بالـ tls callback يشيك
اذا البروسيس الي شغال فيها شغاله داخل debugger يعرض رساله ب message box وينهي تشغيل البروسيس
ولكن اذا البروسيس شغاله بدون او برا الـ debugger بيعرض رساله بب message box ايضا ويدخل الـ main function ويطبع انه وصل للمين
ونشوف بالفيديو ادناه وهو شغال بدون debugger
وهنا نشغله مع ollydbg debugger ونلاحظ انه اكتشف وجوده داخل debugger و انهى البروسيس
ملاحظه ؛ التكنيك هذا قديم الاكتشاف ولكنه متجدد الاستخدام ولذلك حطيته خلف الكواليس داخل x32dbg debugger واكتشف ان فيه tls callbacks وسوى breakpoint عندها واشتغل وكانه شغال خارج الـ Debugger
وفي الختام صلّوا على خير الأنام، ولا تنسونا من دعائكم 🌹
المصادر :-
- بهاراتي الخاصه 👨🏻‍🍳
- anti-reversing.com
- MAP Course from @elearnsecurity

جاري تحميل الاقتراحات...