
Winstrument هو إطار عمل من البرامج النصية المعيارية للمساعدة في تزويد برامج Windows بالأدوات باستخدام Frida للهندسة العكسية وتحليل سطح الهجوم.
Winstrument هو إطار عمل من السكربتات المعيارية للمساعدة في فحص برمجيات Windows باستخدام Frida لأغراض الهندسة العكسية وتحليل سطح الهجوم.
يدعم هذا المشروع Python 3.7. إذا كان لديك Python و pip مثبتين بالفعل، فببساطة:
pip install winstrument
ثم لتشغيل البرنامج، نفّذ:
winstrument
لاحظ أن الأداة تجريبية حاليًا، وقد تتجمد أحيانًا أو تواجه مشكلات استقرار أخرى.
في بعض الحالات، مثل تثبيت جديد لنظام Windows 10، قد تواجه خطأ SSL في pip عند تثبيت Frida. إذا حدث ذلك، راجع استكشاف الأخطاء وإصلاحها أدناه.
لتشغيل بيئة Winstrument التفاعلية (REPL)، شغّل winstrument.
فيما يلي مثال سريع لفحص notepad.exe باستخدام وحدة . للحصول على معلومات كاملة حول أوامر سطر الأوامر المتاحة، راجع أدناه.
registryPS C:\winstrument> winstrument
> set target C:\Windows\System32\notepad.exe
> use registry
> run
Spawned 1144
instrumented process with pid: 1144 and path: C:\Windows\System32\notepad.exe
<User closes notepad from GUI>
detached from 1144 for reason process-terminated
> show registry
module time target function hkey subkey value
-------- ----------------- ------------------------------- ---------------- ------------------ --------------------------------------------------------------------------- ---------------------------------
registry 2019-08-19 07:03:07 C:\Windows\System32\notepad.exe RegGetValueW 0x2f4 SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize AppsUseLightTheme
<...>
في المثال أعلاه، يحدد المستخدم العملية المستهدفة، وفي هذه الحالة notepad.exe. ثم يشير إلى رغبته في استخدام وحدة registry، التي تُعدّد استدعاءات النظام المتعلقة بالسجل (Registry) التي يقوم بها البرنامج. بعد انتهاء العملية (يقوم المستخدم بإغلاق Notepad)، يمكن عرض المخرجات المخزنة باستخدام show registry.
يقوم ملف Python الرئيسي winstrument.py بتهيئة جهاز Frida وإنشاء مثيل للعملية المستهدفة.
يوفر cmdline.py واجهة سطر أوامر باستخدام cmd2. هذه هي نقطة الدخول الرئيسية للسكربت عند تشغيل Winstrument مباشرة من سطر الأوامر. الأوامر موثقة أدناه.
ثم يمر عبر كل وحدة مفعّلة، وينشئ مثيلًا لها، ويستدعي طريقة load_scripts() الخاصة بتلك الوحدة لفحص العملية.
أخيرًا، يستدعي get_output() و on_finish() لكل وحدة عند فصلها عن الهدف.
توجد الوحدات في ملفات .py داخل مجلد modules/. تتكون الوحدة من فئة فرعية من base_module.BaseInstrumentation والتي تعرّف الكود المراد حقنه، ومعالجة الرسائل لذلك الكود المحقون، والمخرجات.
يتم تعريف واجهات برمجة الوحدات بمزيد من التفصيل في قسم "الوحدات" أدناه.
تخزّن كل وحدة بيانات وصفية مثل وصفها في modules/metadata.toml. يجب أن يكون عنوان القسم هو اسم الوحدة (دون تمييز بين الأحرف الكبيرة والصغيرة).
على سبيل المثال، هذا هو القسم المقابل لوحدة dlls:
[DLLS]
description = """Hooks LoadLibrary-family system calls and outputs DLL loads where part of the search path might be
writable by the current user or a low-privileged user group."""
يقوم البرنامج بتخزين الإعدادات في settings.toml داخل %APPDATA%/winstrument.
نظرًا لأن معظم الوحدات، إن لم تكن جميعها، ستقوم بحقن Javascript في العملية المستهدفة، فإن مجلد modules/js/ يحتوي على مقاطع Javascript الخاصة بـ Frida والتي يتم تحميلها وحقنها بواسطة الوحدات.
يجب أن تحمل هذه الملفات نفس اسم الوحدة، أي أن وحدة dlls.py ستستخدم JS من js/dlls.js.
كما هو موضح أعلاه، كل وحدة هي فئة فرعية من BaseInstrumentation الموجودة في base_module.py
يجب على كل وحدة تعريف اسمها (اسم ملفي python و js دون الامتداد) كخاصية فئة ثابتة تسمى modulename.
يمكن للوحدات استخدام أو تجاوز الطرق التالية من BaseInstrumentation:
__init__(self,*args,**kwargs) - بالإضافة إلى أي كود تهيئة خاص بالوحدة، يجب على هذا المُنشئ استدعاء super().__init__(*args,**kwargs).load_script(self) - هذه الطريقة لا يُفترض عمومًا أن تحتاج إلى تجاوز، لأن التنفيذ في BaseInstrumentation يجب أن يكون كافيًا لمعظم حالات الاستخدام. للتثبيت على أحداث Frida، قم بتجاوز register_callbacks() بدلًا من ذلك. يجب استخدام load_script لتحميل ملف javascript المراد الفحص به، واستدعاء session.create_script من Frida، وإضافة أي دوال استدعاء مرغوبة، ثم استدعاء طريقة load() الخاصة بكائن السكربت لتنفيذ الفحص.register_callbacks(self) - تُستدعى بواسطة BaseInstrumentation.load_script قبل تحميل السكربت في العملية المستهدفة. تُستخدم لتسجيل الأحداث مثل _session.on('message') وغيرها. النسخة في BaseInstrumentation تضيف خطافًا (hook) لحدث on_message افتراضيًا.write_message(message) - تستقبل رسالة شبيهة بـ JSON على شكل dict، وتكتبها في قاعدة بيانات sqlite وتحفظها لإخراجها لاحقًا.post_load(self) - تُستدعى بواسطة BaseInstrumentation.load_script بعد تحميل السكربت داخل العملية المستهدفة. يمكن استخدامها، على سبيل المثال، لاستدعاء طرق RPC المُصدَّرة من السكربت.get_output(self) - تُستدعى بواسطة السكربت الرئيسي عند فصل الهدف. يجب أن تُرجع هذه الطريقة قائمة، حيث كل عنصر هو كائن MoudleMessage واحد (من data/module_message.py). عمومًا لا تحتاج إلى تجاوز.on_message(self,message,data) - معالجة استدعاء لحدث message في Frida، والذي يتم تشغيله بواسطة send داخل JS المحقون.on_finish(self) - معالجة استدعاء تُستدعى بواسطة السكربت الرئيسي عند فصل الهدف. قم بأي عمليات تنظيف مطلوبة هنا.توفر واجهة Winstrument الأوامر التالية:
list - عرض جميع الوحدات المتاحة والمحمّلةload <modulename>/use <modulename> - تفعيل الوحدة ذات الاسم المعطىunload <modulename> - تعطيل الوحدة ذات الاسم المعطىset [setting [value]] - بدون وسائط، يعرض جميع الإعدادات وقيمها. مع وسيط واحد، يعرض قيمة setting. مع وسيطين، يعيّن setting إلى value. تبقى الإعدادات محفوظة عبر عمليات تشغيل متعددة.show [modulename [format]] - عرض المدخلات المخزنة من modulename بالتنسيق format المحدد. شغّله دون وسائط لعرض قائمة بتنسيقات العرض (formatters).info <modulename> - يطبع وصفًا للوحدة ذات الاسم المعطى.run - بدء الفحص (instrumentation).q/quit/exit - إنهاء سطر الأوامر (من الواضح).يبدو أن هذا يحدث غالبًا على تثبيت جديد لنظام Windows. يحاول setup.py الخاص بـ Frida سحب ملف .egg من https://files.pythonhosted.org. في بعض الحالات، يفشل ذلك لأن شهادة SSL لهذا النطاق لا يتم التحقق منها. يبدو أن هذا أحد الآثار الجانبية للطريقة التي يقوم بها Windows بتحميل الشهادات الجذرية (root CAs). يبدو أن Windows لا يوفّر جميع الشهادات الجذرية في التثبيت الافتراضي، مفضلًا سحبها عند الحاجة أثناء زيارة المواقع. ونتيجة لذلك، قد لا تكون الشهادة الجذرية التي وقّعت شهادة SSL الخاصة بـ files.pythonhosted.org موجودة في مخزن الثقة بالنظام.
لحل هذه المشكلة، قم بزيارة https://files.pythonhosted.org يدويًا في Edge أو Chrome لدفع Windows إلى إضافة الشهادة الجذرية إلى مخزن الثقة لديه، ثم جرّب pip install مرة أخرى.
لاحظ أن زيارة الصفحة في Firefox لن تعمل، لأن Firefox يستخدم مخزن الثقة الخاص به بدلاً من مخزن النظام.
Winstrument مرخّص بموجب GPLv3. لمزيد من التفاصيل، راجع ملف LICENSE.