بناء اختبار ويندوز
بناء اختبار لينكس
Drltrace عبارة عن أداة تتبع مكالمات API ديناميكية لتطبيقات Windows وLinux. تم تصميم Drltrace استنادًا إلى إطار عمل الأجهزة الثنائية الديناميكية DynamoRIO. تم تنفيذ Drltrace في البداية بواسطة Derek Bruening وتم توزيعه باستخدام أطر عمل DynamoRIO وDrMemory. يحتوي هذا المستودع على إصدار مستقل من drltrace مع نصوص برمجية ومواد إضافية حول كيفية استخدامه لتحليل البرامج الضارة. يمكن تنزيل بناء الإصدار هنا.
استخدام drltrace بسيط للغاية. يحتاج المستخدم إلى تحديد دليل السجل واسم العملية المستهدفة بالطريقة التالية:
drltrace -logdir . -- calc.exe
هذا كل شيء، ستقوم الأداة بإدخال ملفات DLL المطلوبة في العملية المستهدفة، وتبدأ الأجهزة وبالتوازي ستقوم بتسجيل المعلومات حول جميع استدعاءات المكتبة التي يتم تنفيذها في العملية المستهدفة:
~~43600~~ msvcrt.dll!__wgetmainargs
arg 0: 0x010d2364
arg 1: 0x010d2368
and return to module id:0, offset:0x193a
~~43600~~ ntdll.dll!EtwEventRegister
arg 0: 0x002ff994
arg 1: 0x010d1490
and return to module id:0, offset:0x157e
~~43600~~ ntdll.dll!EtwEventSetInformation
arg 0: 0x007b4b40
arg 1: 0x00000033
and return to module id:0, offset:0x15a1
~~43600~~ SHELL32.dll!ShellExecuteW
arg 0: <null> (type=<unknown>, size=0x0)
arg 1: <null> (type=wchar_t*, size=0x0)
arg 2: calculator:// (type=wchar_t*, size=0x0)
arg 3: <null> (type=wchar_t*, size=0x0)
arg 4: <null> (type=wchar_t*, size=0x0)
arg 5: 0x1 (type=int, size=0x4)
and return to module id:0, offset:0x167d
تنسيق الإخراج بسيط ويمكن تحليله بسهولة بواسطة برنامج نصي خارجي:
~~[thread id]~~ [dll name]![api call name]
arg [arg #]: [value] (type=[Windows type name], size=[size of arg])
and return to module id:[module unique id], offset:[offset in memory]
يمكن إجراء التحليل باستخدام grep
عند استخدام الوسيطة -grepable
؛ يؤدي هذا إلى طباعة أسماء الوظائف والوسائط كلها في سطر واحد:
~~4824~~ KERNELBASE.dll!CreateFileW {0: C:WindowsFontsstaticcache.dat (type=wchar_t*, size=0x0)} {1: 0x80000000 (type=DWORD, size=0x4)} {2: 0x3 (type=DWORD, size=0x4)} {3: 0x005cde8c (type=<unknown>*, size=0x0)} {4: 0x3 (type=DWORD, size=0x4)} {5: 0x80 (type=DWORD, size=0x4)}
تتم طباعة جدول المعرفات الفريدة للوحدة في نهاية ملف السجل:
Module Table: version 3, count 70
Columns: id, containing_id, start, end, entry, checksum, timestamp, path
0, 0, 0x010d0000, 0x010da000, 0x010d1b80, 0x0000f752, 0xb5fe3575, C:WindowsSysWOW64calc.exe
1, 1, 0x6d4c0000, 0x6d621000, 0x6d563940, 0x00136d65, 0x59ce1b0b, C:UsersMaxDownloadsdrltracedrltracedynamoriolib32releasedynamorio.dll
2, 2, 0x73800000, 0x73975000, 0x7380dbf7, 0x00000000, 0x59ce1b0f, C:UsersMaxDownloadsdrltracedrltracebinrelease/drltracelib.dll
3, 3, 0x742f0000, 0x742fa000, 0x742f2a00, 0x0000c877, 0x0adc52c1, C:WindowsSystem32CRYPTBASE.dll
4, 4, 0x74300000, 0x74320000, 0x7430c9b0, 0x0002c617, 0x245970b4, C:WindowsSystem32SspiCli.dll
5, 5, 0x74410000, 0x74431000, 0x74416900, 0x0002a940, 0x88a53c1d, C:WindowsSystem32GDI32.dll
6, 6, 0x74440000, 0x74500000, 0x7446fb20, 0x000cc410, 0xd343d532, C:WindowsSystem32RPCRT4.dll
7, 7, 0x74500000, 0x74525000, 0x745047d0, 0x00026737, 0xa39c8991, C:WindowsSystem32IMM32.DLL
8, 8, 0x74550000, 0x745c7000, 0x7456e8a0, 0x00081857, 0x73b971e1, C:WindowsSystem32advapi32.dll
9, 9, 0x748f0000, 0x74929000, 0x748febd0, 0x00045303, 0xa58be652, C:WindowsSystem32cfgmgr32.dll
10, 10, 0x74930000, 0x75c78000, 0x74aa09d0, 0x01377aa6, 0x4b39926b, C:WindowsSystem32SHELL32.dll
يمكن لـ Drltrace تصفية المكالمات بين المكتبات بسهولة وطباعة مكالمات API فقط التي يتم إجراؤها من الوحدة الرئيسية (أو من الكومة) للتطبيق المستهدف عن طريق تحديد خيار -only_from_app
وهو مفيد جدًا في حالة التطبيقات التي تولد سجلات ضخمة. لمزيد من التحكم الدقيق، يسمح خيار -filter
للمستخدم بتحديد ملف تكوين عامل التصفية من أجل التصفية في وظائف محددة مدرجة في القائمة البيضاء، أو تجاهل الوظائف المدرجة في القائمة السوداء (راجع ملف filter.config للحصول على أمثلة). يحتوي Drltrace أيضًا على العديد من البرامج النصية الخارجية المفيدة لتصفية استدعاءات واجهة برمجة التطبيقات (API) لمكتبة معينة، وطباعة استدعاءات وسلاسل واجهة برمجة التطبيقات (API) التي قد تكون مثيرة للاهتمام فقط.
يتم توزيع وحدات Drltrace الرئيسية تحت BSD.
يتم توزيع بعض الملفات المطلوبة لـ drltrace ضمن LGPL. انظر الملفات المصدر لمزيد من التفاصيل.
تحليل البرامج الضارة ليس بالمهمة السهلة. أدوات حزم البرامج المتطورة مثل Themida وArmadillo وبالطبع العشرات من برامج التعبئة غير المسماة التي كتبها مؤلفو البرامج الضارة بالإضافة إلى تشفير التعليمات البرمجية والبيانات تسهل بشكل كبير (في بعض الحالات مما يجعلها مستحيلة تمامًا) الهندسة العكسية الثابتة لمثل هذه العينات مما يجعل حياة محللي البرامج الضارة معقدة. في مثل هذه الحالة، يمكن أن يؤدي تتبع مكالمات واجهة برمجة التطبيقات (API) إلى تقليل الوقت المطلوب بشكل كبير لفهم النية الضارة الفعلية والكشف عن الكثير من التفاصيل الفنية حول التعليمات البرمجية الضارة المحمية.
في حين تم تنفيذ التقنية التقليدية لربط واجهة برمجة التطبيقات بنجاح في العديد من الحلول، فقد تمت دراسة هذا النهج جيدًا من قبل مؤلفي البرامج الضارة ويمكن اكتشافه و/أو تجاوزه بسهولة. علاوة على ذلك، يتم توزيع هذه الأدوات كتطبيقات مستقلة ذات وزن ثقيل لواجهة المستخدم الرسومية (كمنتجات خاصة) والتي ليس من السهل غالبًا دمجها في سير عمل تحليل البرامج الضارة الموجود.
إذا نظرنا إلى عالم Linux، هناك أداة رائعة تسمى ltrace. باستخدام أمر bash واحد، يمكننا بسهولة الحصول على التتبع الكامل لاستدعاءات واجهة برمجة التطبيقات (API) الخاصة بملف قابل للتنفيذ معين.
لماذا لا تتوفر لدينا مثل هذه الأداة (مثل ltrace في Linux) لنظام التشغيل Windows والتي تتميز أيضًا بالشفافية ضد حيل مكافحة الأبحاث التي تستخدمها البرامج الضارة الحديثة؟
اتضح أن هناك تقنية يمكن أن تساعدنا في الحصول على مثل هذه الأداة لنظام التشغيل Windows وتتبع مكالمات API بشفافية تجاه البرنامج المنفذ. تسمى هذه التقنية بالأجهزة الثنائية الديناميكية والمعروفة أيضًا باسم DBI. DBI هي تقنية لتحليل سلوك التطبيق الثنائي في وقت التشغيل من خلال حقن كود الأجهزة.
ومع ذلك، فإن تطبيق DBI لتحليل البرامج الضارة مقيد بشكل غير مستحق من خلال تفريغ الأتمتة والعديد من إثباتات المفاهيم للتعليمات والكتل الأساسية وتتبع استدعاءات الوظائف. على حد علمنا، تعد drltrace أول أداة لتتبع مكالمات واجهة برمجة التطبيقات (API) استنادًا إلى DBI والتي يمكن استخدامها عمليًا لتحليل البرامج الضارة. لقد قدمنا العديد من أمثلة تحليل البرامج الضارة في موقع wiki الخاص بنا حيث وصفنا كيف سمح drltrace بالكشف في عدة دقائق عن الكثير من التفاصيل الفنية الداخلية حول العينات الضارة المعقدة دون حتى تشغيل IDA أو مصحح الأخطاء.
-logdir [ .] Log directory to print library call data
-only_from_app [ false] Reports only library calls from the app
-follow_children [ true] Trace child processes
-print_ret_addr [ false] Print library call's return address
-num_unknown_args [ 2] Number of unknown libcall args to print
-num_max_args [ 6] Maximum number of arguments to print
-default_config [ true] Use default config file.
-config [ ""] The path to custom config file.
-filter [filter.config] The path of the whitelist/blacklist file.
-ignore_underscore [ false] Ignores library routine names starting with "_".
-help [ false] Print this message.
-version [ false] Print version number.
-verbose [ 1] Change verbosity.
-use_config [ true] Use config file
-grepable [ false] Grepable output
يدعم Drltrace ملفات التكوين الخارجية حيث يمكن للمستخدم وصف كيفية قيام drltrace بطباعة الوسائط لاستدعاءات API معينة.
HANDLE|CreateRemoteThread|HANDLE|SECURITY_ATTRIBUTES*|size_t|THREAD_START_ROUTINE*|VOID*|DWORD|__out DWORD*
يجب فصل كل وسيطة دالة بـ |
. الوسيطة الأولى هي نوع الإرجاع، والوسيطة الثانية هي اسم الوظيفة نفسها والباقي هي وسيطات الوظيفة. يتم استخدام الرمز المميز __out
لوضع علامة على وسيطات الإخراج ويتم استخدام ___inout
لوضع علامة على وسيطات الإدخال + الإخراج.
يمكنك العثور على أمثلة لكيفية استخدام drltrace لتحليل البرامج الضارة المعقدة على صفحة Wiki الخاصة بنا.
لتسهيل العمل مع ملفات السجل، قمنا بتنفيذ برنامج نصي يسمى api_calls_viz.py
والذي يمكن استخدامه لإنشاء صور RGB حيث يمثل كل لون بكسل استدعاء API فريدًا. على سبيل المثال، تمثل الصورة أدناه ملف سجل البرامج الضارة WannaCry.
تمثل المناطق الخضراء الكبيرة في الصورة استدعاءات API ( wcscmp/wcsicmp
) التي تستخدم لتحديد الملفات ذات الامتدادات المثيرة للاهتمام (مثل docx، xls، py) لتشفيرها. تمثل المناطق الأرجوانية استدعاءات واجهة برمجة التطبيقات ( FindFirstFile/FindNextFile/CryptEncrypt
) التي تُستخدم لتعداد وتشفير الملفات والمجلدات الموجودة على القرص.
يمكن للبرنامج النصي أيضًا إنشاء تمثيل HTML لصورة RGB التي تم إنشاؤها حيث يمكن تحديد كل عنصر لإظهار اسم استدعاء API.
ملف HTML الخام.
راجع دليل api_calls_viz
لمزيد من التفاصيل.
يمكنك العثور على دليل مفصل على صفحة Wiki هذه.
ويندوز، لينكس (ماك في المستقبل).
x86، x64 (ARM في القائمة).
مكتبة C وC++ القياسية (وسجلات التعامل مع البرامج النصية المكتوبة بلغة Python).
قررنا تنفيذ أداة تتبع مكالمات API الخاصة بنا أعلى إطار عمل الأجهزة الثنائية الديناميكي DynamoRIO. يطلب Drltrace من DynamoRIO إجراء أدوات لاستدعاء LoadLibrary لتتمكن من التعامل مع المكتبات الجديدة التي يتم تحميلها بواسطة العملية المستهدفة. عندما تحاول العملية تحميل مكتبة جديدة، يقوم DynamoRIO بإعادة توجيه تدفق التحكم إلى drltracelib.dll
. بدوره، يقوم drltrace بتعداد الوظائف المصدرة في ملف DLL الذي تم تحميله حديثًا ويسجل رد اتصال خاصًا لكل منها. وبالتالي، إذا تم استدعاء بعض الوظائف المصدرة بواسطة البرامج الضارة، فسيتم تنفيذ رد اتصال drltrace قبل هذه الوظيفة وستكون الأداة قادرة على تسجيل جميع المعلومات المطلوبة مثل اسم الوظيفة والوسيطات. قد يتم تسجيل رد اتصال آخر بعد الوظيفة لحفظ نتائج التنفيذ.
لماذا لا إنتل دبوس؟ قررنا استخدام DynamoRIO للأسباب التالية:
-syswide_on
في drrun.exe
). ومع ذلك، في المستقبل، من الضروري تنفيذ دعم خاص في drltrace لمثل هذه المواقف.يحتوي متتبع المشكلات الخاص بنا على مزيد من التفاصيل حول مستقبل drltrace.
مكسيم شدراك https://github.com/mxmssh
ديريك بروينينج https://github.com/derekbruening
جو تيستا https://github.com/jtesta