
Drltrace هو متتبع لاستدعاءات المكتبات لتطبيقات ويندوز ولينكس.
Windows test build
Drltrace هي أداة تتبع ديناميكي لاستدعاءات واجهة برمجة التطبيقات (API) لتطبيقات ويندوز ولينكس. تم بناء 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:\Windows\Fonts\staticcache.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:\Windows\SysWOW64\calc.exe
1, 1, 0x6d4c0000, 0x6d621000, 0x6d563940, 0x00136d65, 0x59ce1b0b, C:\Users\Max\Downloads\drltrace\drltrace\dynamorio\lib32\release\dynamorio.dll
2, 2, 0x73800000, 0x73975000, 0x7380dbf7, 0x00000000, 0x59ce1b0f, C:\Users\Max\Downloads\drltrace\drltrace\bin\release/drltracelib.dll
3, 3, 0x742f0000, 0x742fa000, 0x742f2a00, 0x0000c877, 0x0adc52c1, C:\Windows\System32\CRYPTBASE.dll
4, 4, 0x74300000, 0x74320000, 0x7430c9b0, 0x0002c617, 0x245970b4, C:\Windows\System32\SspiCli.dll
5, 5, 0x74410000, 0x74431000, 0x74416900, 0x0002a940, 0x88a53c1d, C:\Windows\System32\GDI32.dll
6, 6, 0x74440000, 0x74500000, 0x7446fb20, 0x000cc410, 0xd343d532, C:\Windows\System32\RPCRT4.dll
7, 7, 0x74500000, 0x74525000, 0x745047d0, 0x00026737, 0xa39c8991, C:\Windows\System32\IMM32.DLL
8, 8, 0x74550000, 0x745c7000, 0x7456e8a0, 0x00081857, 0x73b971e1, C:\Windows\System32\advapi32.dll
9, 9, 0x748f0000, 0x74929000, 0x748febd0, 0x00045303, 0xa58be652, C:\Windows\System32\cfgmgr32.dll
10, 10, 0x74930000, 0x75c78000, 0x74aa09d0, 0x01377aa6, 0x4b39926b, C:\Windows\System32\SHELL32.dll
يمكن لـ Drltrace تصفية استدعاءات المكتبات البينية بسهولة وطباعة استدعاءات API التي تتم من الوحدة الرئيسية (أو من الكومة) للتطبيق المستهدف فقط عن طريق تحديد الخيار -only_from_app، وهو مفيد جدًا في حالة التطبيقات التي تولد سجلات ضخمة. للتحكم الدقيق، يسمح الخيار -filter للمستخدم بتحديد ملف تكوين للتصفية بهدف تضمين دوال معينة في القائمة البيضاء، أو تجاهل دوال في القائمة السوداء (انظر ملف filter.config للأمثلة). يحتوي Drltrace أيضًا على عدة نصوص خارجية مفيدة لتصفية استدعاءات API لمكتبة معينة، وطباعة استدعاءات API والسلاسل التي قد تكون مثيرة للاهتمام فقط.
الوحدات الرئيسية لـ Drltrace موزعة تحت رخصة BSD.
بعض الملفات المطلوبة لـ drltrace موزعة تحت رخصة LGPL. راجع ملفات المصدر لمزيد من التفاصيل.
تحليل البرامج الضارة ليس مهمة سهلة. أدوات التغليف البرمجية المتطورة مثل Themida وArmadillo، وبالطبع العشرات من أدوات التغليف غير المسماة التي يكتبها مؤلفو البرامج الضارة بالإضافة إلى تشفير الكود والبيانات، تسهل بشكل كبير (وفي بعض الحالات تجعله مستحيلًا تمامًا) الهندسة العكسية الثابتة لهذه العينات، مما يجعل حياة محللي البرامج الضارة معقدة. في هذه الحالة، يمكن لتتبع استدعاءات API أن يقلل بشكل كبير من الوقت المطلوب لفهم النية الضارة الفعلية ويكشف عن الكثير من التفاصيل التقنية حول الكود الضار المحمي.
في حين تم تنفيذ التقنية التقليدية لـ API-hooking بنجاح في عدة حلول، إلا أن هذا النهج تمت دراسته جيدًا من قبل مؤلفي البرامج الضارة ويمكن اكتشافه و/أو تجاوزه بسهولة. علاوة على ذلك، يتم توزيع هذه الأدوات كتطبيقات واجهة مستخدم رسومية مستقلة وثقيلة (كمنتجات مملوكة) والتي غالبًا ما يصعب دمجها في سير عمل تحليل البرامج الضارة الحالي.
إذا نظرنا إلى عالم لينكس، هناك أداة رائعة تسمى ltrace. باستخدام أمر bash واحد، يمكننا بسهولة الحصول على التتبع الكامل لاستدعاءات API لملف تنفيذي معين.
لماذا لا نملك مثل هذه الأداة (مثل ltrace في لينكس) لنظام ويندوز تكون أيضًا شفافة تجاه تقنيات مكافحة البحث التي يستخدمها البرامج الضارة الحديثة؟
اتضح أن هناك تقنية يمكن أن تساعدنا في الحصول على مثل هذه الأداة لنظام ويندوز وتتبع استدعاءات API بشفافية تجاه البرنامج المنفذ. تسمى هذه التقنية التعليمات الثنائية الديناميكية (Dynamic Binary Instrumentation) أو DBI. DBI هي تقنية لتحليل سلوك تطبيق ثنائي في وقت التشغيل من خلال حقن كود التجهيز.
ومع ذلك، فإن تطبيق DBI لتحليل البرامج الضارة محدود بشكل غير مستحق بأتمتة فك التغليف والعديد من البراهين على المفهوم لتتبع التعليمات والكتل الأساسية واستدعاءات الدوال. على حد علمنا، drltrace هي أول أداة لتتبع استدعاءات API تعتمد على DBI يمكن استخدامها عمليًا لتحليل البرامج الضارة. قدمنا عدة أمثلة لتحليل البرامج الضارة في ويكي الخاصة بنا حيث وصفنا كيف سمح 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 لتحليل البرامج الضارة المعقدة على صفحة الويكي الخاصة بنا.
لتسهيل العمل مع ملفات السجل، قمنا بتنفيذ سكريبت يسمى api_calls_viz.py يمكن استخدامه لإنشاء صور RGB حيث يمثل كل لون بكسل استدعاء API فريدًا. على سبيل المثال، تمثل الصورة أدناه ملف سجل برنامج الفدية WannaCry.

المناطق الخضراء الكبيرة في الصورة تمثل استدعاءات API (wcscmp/wcsicmp) التي تُستخدم لتحديد الملفات ذات الامتدادات المثيرة للاهتمام (مثل docx, xls, py) لتشفيرها. المناطق الأرجوانية تمثل استدعاءات API (FindFirstFile/FindNextFile/CryptEncrypt) التي تُستخدم لتعداد وتشفير الملفات والمجلدات على القرص.
يمكن للسكريبت أيضًا إنشاء تمثيل HTML للصورة RGB الناتجة حيث يمكن اختيار كل عنصر لعرض اسم استدعاء API.

راجع دليل api_calls_viz لمزيد من التفاصيل.
يمكنك العثور على دليل مفصل في صفحة الويكي هذه.
ويندوز، لينكس (macOS في المستقبل).
x86، x64 (ARM على القائمة).
مكتبة C و C++ القياسية (ونصوص معالجة السجلات المكتوبة بلغة Python).
قررنا تنفيذ أداة تتبع استدعاءات API الخاصة بنا فوق إطار العمل الديناميكي للتعليمات الثنائية DynamoRIO. يطلب Drltrace من DynamoRIO إجراء تجهيز لاستدعاء LoadLibrary ليكون قادرًا على التعامل مع المكتبات الجديدة التي يتم تحميلها بواسطة العملية المستهدفة. عندما تحاول العملية تحميل مكتبة جديدة، يقوم DynamoRIO بإعادة توجيه تدفق التحكم إلى drltracelib.dll. بدوره، يقوم drltrace بتعداد الدوال المصدرة في ملف DLL المحمل حديثًا ويسجل رد اتصال خاصًا لكل منها. وبالتالي، إذا تم استدعاء دالة مصدرة بواسطة برنامج ضار، فسيتم تنفيذ رد اتصال drltrace قبل هذه الدالة وستتمكن الأداة من تسجيل جميع المعلومات المطلوبة مثل اسم الدالة والوسائط. يمكن تسجيل رد اتصال آخر بعد الدالة لحفظ نتائج التنفيذ.
لماذا ليس Intel Pin؟ قررنا استخدام DynamoRIO بدافع الأسباب التالية:
-syswide_on لـ drrun.exe). ومع ذلك، في المستقبل، من الضروري تنفيذ دعم خاص في drltrace لمثل هذه الحالات.يحتوي متتبع المشكلات الخاص بنا على مزيد من التفاصيل حول مستقبل drltrace.
Maksim Shudrak https://github.com/mxmssh
Derek Bruening https://github.com/derekbruening
Joe Testa https://github.com/jtesta