Bluepill هو إطار تحليل ديناميكي مفتوح المصدر للتعامل مع البرامج الضارة المراوغة. هدفها هو التوفيق بين خصائص الشفافية اللازمة للتحليلات التلقائية مع إمكانيات التفتيش والقدرات الدقيقة للتنفيذ المطلوبة للتحليل اليدوي.
Bluepill هو نموذج أولي أكاديمي نحافظ عليه في أوقات فراغنا: ملاحظاتك ثمينة!
يمكن أن تصادف Bluepill العديد من الحبوب الحمراء التي تستهدف Hypervisors و Defuggers وأدوات الطرف الثالث ، والتحف التوقيت. إنه يعتمد على الأجهزة الثنائية الديناميكية (DBI) لمراقبة الاستعلامات التي يمكن أن تصنعها البرامج الضارة على البيئة التي تبحث عن القطع الأثرية ، وتغيير نتائجها عندما يمكن أن تكشف عن وجود نظام تحليل آلي أو عامل بشري. يقدم Bluepill واجهة GDB عن بُعد لتصحيح عينة أثناء رعاية عمليات التناغم من المحللين ، إلى جانب آليات تصحيح خلسة جديدة لإخفاء التغييرات التي تم إجراؤها في مخططات التصحيح من مخططات التثبيت الذاتي.
لقد اختبرنا Bluepill على البرامج الضارة PE32 غير المتجانسة التي تعمل على Windows 7 SP1 32 بت: على سبيل المثال ، يمكننا تشغيل المواد التنفيذية المحمية بالإصدارات الحديثة من VMProtect و temida وعينات مراوغة للغاية مثل فورتيم.
تم تقديم Bluepill في:
لمواجهة Evasions DBI ، يستخدم Bluepill مكتبة من التخفيفات التي كتبناها لـ Intel Pin كجزء من ورقة SOK: استخدام الأجهزة الثنائية الديناميكية للأمن (وكيف قد يتم القبض عليك من قبل متناول اليد) من ASIACCS 2019. يمكنك قراءة المزيد حول Evasions DBI في الورقة التي تقوم بتقييم أنظمة الأجهزة الثنائية الديناميكية للميزات الواضحة والقطع الأثرية التي ظهرت مؤخرًا في ACM DTRAP (prepRINT).
أسفل قائمة جزئية لخطوقة Evasions التي تم مواجهتها في اختباراتنا على جهاز Windows 7 SP1 32 بت Virtualbox 5.2 للحصول على مجموعة كبيرة من الحماة القابلة للتنفيذ والعينات المدرعة:
| فئة | حالات |
|---|---|
| Hypervisor | إضافات الضيوف والملفات وإدخالات التسجيل والمكتبات والسائقين من VirtualBox |
| الأجهزة | سلاسل السير والبرامج الثابتة ، عنوان MAC ، cpuid ، حجم القرص ، قدرات الطاقة/الحرارية |
| وقت | اكتشاف التباطؤ باستخدام واجهات برمجة التطبيقات ذات الصلة بالوقت rtdsc و Windows |
| برمجة | قطعة أثرية لأدوات المراقبة الشائعة (عمليات التشغيل ، نوافذ واجهة المستخدم الرسومية) ، عملية الوالدين ، تخطيط لوحة المفاتيح HKL ، مؤشر الماوس المجمد |
| تصحيح الأخطاء | استثناءات خطوة واحدة ، int 2d ، استعلامات OS للتصحيح النشط/المثبت (على سبيل المثال NtQueryInformationProcess ) ، حقول كتلة إدخال العملية |
| استعلامات WMI | وحدة المعالجة المركزية وحجم القرص وعنوان MAC و ACPI و MUI Languages و VirtualBox VBOXVIDEO |
| DBI | يتسرب المؤشر مع تعليمات FPU ، ومحتويات الذاكرة والأذونات (مثل صفحات الحراسة ، وفرض NX) |
ملحوظة: قبل أن نلقي علناً عن BH Europe 2019 ، قمنا بإجراء تغييرات جذرية كسرت معالجة رمز 64 بت و (إلى حد ما) من النظام الفرعي WOW64: يرجى النظر في هذه السيناريوهات التجريبية مع إكمال اختبار الانحدار ، ولا تتردد في الإبلاغ عن المشكلات.
يعتمد Bluepill على دبوس Intel (موصى به V3.16) ويتطلب Visual Studio 2015 أو أعلى لتجميعه.
يحتوي PIN على بعض التبعيات التي تتطلب التضمين اليدوي في المشروع. لقد أنشأنا ملفًا Locals.props يبسط تكوين المشروع. يتم تثبيت PIN الافتراضيات في C:Pin316 ورؤوس SDK 8.1 قيد الاستخدام:
<PropertyGroup Label="UserMacros">
<PinFolder>C:Pin316</PinFolder>
<WinHPath>C:/Program Files (x86)/Windows Kits/8.1/Include/um</WinHPath>
</PropertyGroup>
على سبيل المثال ، إذا كنت ترغب في استخدام رؤوس SDK 10.0.17763.0 ، بعد تعديل إعدادات المشروع في Visual Studio ، يجب أيضًا تغيير قيمة خاصية WinHPath إلى C:/Program Files/Windows Kits/10/Include/10.0.17763.0/um . Similary ، قم بتعديل قيمة الخاصية إذا تم تثبيت رؤوس SDK 8.1 في C:/Program Files/ بدلاً من C:/Program Files (x86)/ . الغرض من هذا الحقل هو مساعدة PIN عندما يتضمن المسار المطلق لنظام التشغيل Windows.h من رؤوس CRT الخاصة به.
يجب أن تكون قادرًا الآن على تجميع المخطط. بمجرد انتهاء التجميع ، ستجد مكتبة bluepill32.dll في دليل PIN. إذا واجهت خطأ msvc_compat.h المفقود ، فتأكد من أن $(PinFolder)extrascrtinclude هو مسار صالح.
لتشغيل مستخدم قابل للتنفيذ تحت الخطورة:
C:Pin316pin.exe -t bluepill32.dll [options] -- <file.exe>
يدعم Bluepill خيارات سطر الأوامر التالية:
| خيار | معنى |
|---|---|
-evasions | اكتشف ومعالجة غالبية التنازلات المدعومة (انظر أدناه ل DBI) |
-debugger | تمكين وضع التصحيح عبر واجهة GDB عن بُعد |
-leak | DBI Evasions: إصلاح تسريبات eip الحقيقية (مثل تعليمات FPU) |
-nx | DBI Evasions: تحقق من أن صفحات الرمز قابلة للتنفيذ |
-rw | DBI Evasions: إخفاء الصفحات التي تنتمي إلى محرك DBI |
على سبيل المثال ، لتشغيل برنامج مراوغ يسمى sample.exe في وضع تلقائي يشبه صندوق الرمل ، حاول:
C:Pin316pin.exe -t bluepill32.dll -evasions -leak -- sample.exe
إن تمكين التخفيف -leak له تأثير ضئيل في الأداء ، في حين أن -nx و -rw في النهاية يمكن أن تساعد في باكيرز معقدة تحاول التحقق من مساحة العنوان للبرنامج.
ستقوم BluePill بإنشاء ملف يسمى evasions.log تحت مجلد PIN C:Pin316 (تعديل متغير LOGPATH داخل pintoolsrclogging.h لتغييره) الذي يحاول المحاولات الممكنة التي تم اعتراضها أثناء التنفيذ.
يدعم Bluepill استخدام مصحح الأخطاء للتحكم في التنفيذ وتنفيذ تشريح البرامج الضارة. نعتمد على واجهة GDB عن بُعد لـ PIN: يمكن بالتالي استخدام BluePill كوجود خلفي عن بعد من أداة تصحيح الأخطاء إذا كان يدعم بروتوكول GDB. في ما يلي نقدم إرشادات لإعداد جلسة تصحيح الأخطاء مع IDA Pro.
لتمكين واجهة تصحيح الأخطاء ، تحتاج إلى توفير خيارات سطر أوامر إضافية لكل من PIN ( -appdebug -appdebug_server_port <port> ) و Lluepill ( -debugger ) على النحو التالي:
C:Pin316pin.exe -appdebug —appdebug_server_port 10000 -t bluepill32.dll -debugger [other options] -- <file.exe>
سوف نستخدم 10000 كرقم منفذ في هذا الدليل. سيبقى التطبيق متوقفًا مؤقتًا حتى تقوم بتوصيل مصحح أخطاء بالمقبس: ومع ذلك ، إذا حاولت إرفاق مصحح تصحيح محلي بالعملية ، فسوف ينتهي بك الأمر إلى تصحيح محرك الدبوس بأكمله بدلاً من التطبيق فقط. سيكون الإخراج المتوقع على الشاشة مثل:

يمكنك الآن فتح القابل للتنفيذ في IDA وتحديد الواجهة الخلفية لـ GDB عن بُعد من Debugger->Switch debugger . تأكد من أن الخيارات (رقم المنفذ على سبيل المثال) صحيحة باستخدام Debugger->Process options كما في لقطة الشاشة أدناه:

في هذه المرحلة ، يساعد على إدراج نقطة توقف على بعض العنوان في القسم القابل للتنفيذ الرئيسي ، على سبيل المثال على نقطة الدخول. بعد ذلك ، يمكنك بدء جلسة تصحيح الأخطاء مع Debugger->Start process . سوف تخطرك إيدا أن "هناك بالفعل عملية يتم تصحيحها بواسطة جهاز التحكم عن بُعد. هل تريد إرفاقها؟" . فقط انقر فوق "نعم" وستبدأ جلسة تصحيح الأخطاء ، مع وجود EIP في مكان ما في الداخل في NTDLL.DLL.
نظرًا لأن معلومات تعيين الذاكرة غير متوفرة افتراضيًا على بروتوكول GDB عن بُعد ، فقد أضفنا أمرًا مخصصًا لتصحيح الأخطاء vmmap يوضح Bluepill لإنشاء مثل هذه الخريطة. لقد قمنا بتآكل هذه العملية باستخدام برنامج addSegments.py متوفر في scripts/ المجلد: فقط قم بتحميلها في IDA مع File->Script file . سيقوم البرنامج النصي بملء المقاطع الفرعية للشرائح من IDA مع معلومات تخطيط الذاكرة (أي أقسام وأذوناتها) لكل وحدة رمز. ملاحظة: سنضيف قريبًا رمزًا لتحديث VILED MODULE Subview ، والذي يبقى حاليًا قديمة.
يمكنك الآن تصحيح العينة الخاصة بك لأن Bluepilling تحمي لك من مجموعة كبيرة من التحفيز :-)
يرجى ملاحظة أن معالجة الاستثناءات تتطلب حلًا بديلًا لدعم خادم GDB الحالي في PIN. عندما لا ينبغي نقل الاستثناء إلى التطبيق (على سبيل المثال ، 0xc0000008 لمقبض غير صالح تم تمريره إلى CloseHandle) ، أرسل أمر wait في وحدة التحكم GDB مباشرة بعد تلقي رسالة الاستثناء ، ثم افصل IDA وإعادة توصيلها إلى Bluepill. في غضون ذلك ، سيبقي مساعد تصحيح الأخطاء القابل للتنفيذ في الانتظار استجابةً للأمر.
ملاحظة: اعتمدنا في الأصل على خدعة الانفصال أيضًا لأنواع الاستثناء الأخرى. بالنسبة لهم ، فإن التغييرات التي تم تقديمها حديثًا في بعض الإفراج عن دبوس بعد 3.5 تؤدي إلى فشل التأكيد الداخلي عند إعادة صياغة تصحيح الأخطاء ( A: sourcepinvmdebugger-connectiondebugger-connection.cpp: PINVM::DEBUGGER_CONNECTION::NotifyThreadsStopped: 1004: assertion failed: focus != PIN::INVALID_THREADID : لذلك ، عندما تواجه على سبيل المثال استثناء 0xc0000005 من رمز int 3 أو int 2d ، يمكنك نقل الاستثناء إلى التطبيق. لن يتم اكتشاف واجهة تصحيح الدبوس مباشرة ، ولكن قد لا يزال الخصم يفعل ذلك باستخدام ساعة كتابة. نحن نفكر حاليًا في حل بديل لحماية هذه القطع الأثرية أيضًا.
تنفذ Bluepill وظيفة فريدة لتصحيح جزء رمز عند تصحيح الأخطاء أثناء إخفاءه من الرمز التنفيذي. يبقى التصحيح المطبقة غير مرئي للمخططات المضادة للانتعاش (على سبيل المثال تسلسلات التسلسل الذاتي) لأنه مقترن بشكل كبير مع آلية JIT من الدبوس. باختصار ، نقوم بإعادة تجميع JIT لإضافة الترامبولين التي تتجاوز الإرشادات (الأصلية) التي تم تجميعها وتبدو دون أن يلاحظها أحد من قبل آليات حماية الكود ، حيث تظل القراءة في الذاكرة يتم إعادة توجيهها إلى تعليمات البرنامج الأصلية.
يتم تقسيم تصحيح التصحيح إلى ثلاث خطوات:
ضع في اعتبارك كتلة التعليمات البرمجية في الصورة أدناه ، ونفترض أننا نريد الكتابة فوق mov ebp, esp على العنوان 0x771X37A5 مع mov eax, esp ( 89 e0 في الثنائي) ، ثم جعل التنفيذ استئنافًا على العنوان 0x771X37A8 .

عندما تعمل Bluepill في وضع تصحيح الأخطاء ، يمكننا إرشاد PIN للتصحيحات من خلال أمر GDB مخصص: set_<START_ADDR>_<END_ADDR>_<CONT_ADDR>_<PATCH_CODE_BYTES> ، مع العناوين المعبر عنها كأرقام سداسية وبيوت تصحيح رمز مفصول بواسطة CAMA. على سبيل المثال أعلاه ، يمكننا استخدام: set_771c37a6_771c37a6_771c37a8_89,e0 .
يمكن بعد ذلك إزالة التصحيحات باستخدام أمر GDB آخر مخصص: rm_<START_ADDR>_<END_ADDR> .
إذا كنت تستخدم مخططًا في مشروع أكاديمي أو تعتقد أنه سيتناسب مع قسم المناقشة في ورقتك ، فسنكون ممتنين إذا تمكنت من الرجوع إلى عملنا باستخدام إدخال Bibtex التالي:
@ARTICLE{BluePill,
author={D'Elia, Daniele Cono and Coppa, Emilio and Palmaro, Federico and Cavallaro, Lorenzo},
journal={IEEE Transactions on Information Forensics and Security},
title={On the Dissection of Evasive Malware},
year={2020},
volume={15},
number={},
pages={2750-2765},
doi={10.1109/TIFS.2020.2976559}}