
regipy v6.3.0
Regipy هي مكتبة بايثون مستقلة عن نظام التشغيل لتحليل خلايا التسجيل غير المتصلة.
regipy
⚠️ تغييرات جذرية في الإصدار 6.0.0
يتضمن الإصدار 6.0.0 تغييرات تحديثية كبيرة:
- يتطلب Python 3.9+ - تم إسقاط دعم Python 3.6 و3.7 و3.8
- تمت إزالة مكتبة
attrs- تستخدم فئات البيانات الآن وحدةdataclassesالمدمجة في Python- إذا كان الكود الخاص بك يستورد فئات داخلية (
Cell،VKRecord،Value،Subkey) ويستخدم دوالattrsمثلattr.asdict()، فقم بالتبديل إلىdataclasses.asdict()راجع CHANGELOG للحصول على التفاصيل الكاملة.
Regipy هي مكتبة Python لتحليل خلايا التسجيل (Registry Hives) غير المتصلة بالإنترنت (ملفات Hive التي تحتوي على ترويسة REGF). تمتلك regipy العديد من الإمكانيات:
- الاستخدام كمكتبة:
- التنقل التكراري عبر خلية التسجيل، من الجذر أو من مسار معين والحصول على جميع المفاتيح الفرعية والقيم
- قراءة مفاتيح فرعية وقيم محددة
- تطبيق سجلات المعاملات (Transaction Logs) على خلية تسجيل
- أدوات سطر الأوامر
- تفريغ خلية تسجيل كاملة إلى json
- تطبيق سجلات المعاملات على خلية تسجيل
- مقارنة خلايا التسجيل
- تنفيذ الإضافات (Plugins) من نظام إضافات قوي (مثل: amcache، shimcache، استخراج اسم الكمبيوتر...)
يتطلب Python 3.9 أو أعلى.
التثبيت
يمكن تثبيت أحدث إصدار من Regipy من pypi:
pip install regipy[full]
ملاحظة: يقوم regipy[full] بتثبيت التبعيات التي تتطلب أدوات الترجمة (Compilation Tools) وقد يستغرق بعض الوقت.
من الممكن تثبيت إصدار بتبعيات مخففة، عن طريق حذف [full].
أيضاً، من الممكن التثبيت من المصدر عن طريق استنساخ المستودع وتنفيذ:
pip install --editable .[full]
الواجهة الخلفية المعجّلة بـ Rust (ألفا)
يتوفر تطبيق Rust اختياري لمحلل REGF الأساسي كواجهة خلفية اختيارية،
تُنشر بشكل منفصل على PyPI باسم
regipy-rs:
pip install regipy[rust]
from regipy.registry_rs import RegistryHive # instead of regipy.registry
reg = RegistryHive("/tmp/NTUSER.dat")
# Same API: get_key, iter_values, recurse_subkeys, plugins — everything
# works unchanged, including all regipy plugins.
إنه بديل مباشر تم التحقق منه 1:1 مقابل المحلل المكتوب بلغة Python الخالصة عبر
مجموعة اختبارات الخلايا الكاملة — كل مسار مفتاح، وطابع زمني، وقيمة، ومخرجات
إضافة، موثّق بمطابقة ملخصات التنقل SHA-256 (راجع
regipy_tests/comparison_test.py وقسم Forensic parity evidence
في regipy-rs/BENCHMARKS.md).
التنقل الكامل مع القيم (recurse_subkeys)، أفضل نتيجة من 3 تشغيلات:
| Hive | Keys | Python | Rust | Speedup |
|---|---|---|---|---|
| NTUSER.DAT | 1,812 | 173 ms | 5 ms | 38x |
| UsrClass.dat | 6,205 | 948 ms | 17 ms | 55x |
| amcache.hve | 2,105 | 837 ms | 12 ms | 67x |
| SYSTEM | 30,756 | 23.1 s | 91 ms | 253x |
| SYSTEM (Win10 1709) | 43,211 | 118.7 s | 111 ms | 1,068x |
| SOFTWARE | 117,488 | 745.6 s | 292 ms | 2,550x |
يوضح cProfile السبب: في الواجهة الخلفية بلغة Python، يهيمن على وقت التنقل
تحليل بنية construct لكل سجل وفك ترميز القيم؛ مع الواجهة الخلفية بـ Rust،
يختفي المحلل من الملف التعريفي تماماً وتكون التكلفة الوحيدة المتبقية في Python
هي إنشاء فئات بيانات Subkey المُرجعة.
توجد الملفات التعريفية الكاملة، وملخصات كل خلية، وإخلاء مسؤولية يوثّق
الاختلافات المتعمدة القليلة (أنواع الاستثناءات على الخلايا التالفة، وسلوك
حماية الدورات) في regipy-rs/BENCHMARKS.md؛
يقوم python regipy-rs/benchmark.py بإعادة إنشاء التقرير بالكامل.
يظل المحلل المكتوب بلغة Python الخالصة هو الافتراضي ولا يتأثر عندما لا تكون الواجهة الخلفية بـ Rust مثبتة.
CLI
تحليل الترويسة
regipy-parse-header ~/Documents/TestEvidence/Registry/SYSTEM
مثال على المخرجات:
╒════════════════════════╤══════════╕
│ signature │ b'regf' │
├────────────────────────┼──────────┤
│ primary_sequence_num │ 11639 │
├────────────────────────┼──────────┤
│ secondary_sequence_num │ 11638 │
├────────────────────────┼──────────┤
│ last_modification_time │ 0 │
├────────────────────────┼──────────┤
│ major_version │ 1 │
├────────────────────────┼──────────┤
│ minor_version │ 5 │
├────────────────────────┼──────────┤
│ file_type │ 0 │
├────────────────────────┼──────────┤
│ file_format │ 1 │
├────────────────────────┼──────────┤
│ root_key_offset │ 32 │
├────────────────────────┼──────────┤
│ hive_bins_data_size │ 10534912 │
├────────────────────────┼──────────┤
│ clustering_factor │ 1 │
├────────────────────────┼──────────┤
│ file_name │ SYSTEM │
├────────────────────────┼──────────┤
│ checksum │ 0 │
╘════════════════════════╧══════════╛
[2019-02-09 13:46:12.111654] WARNING: regipy.cli: Hive is not clean! You should apply transaction logs
- عند تحليل ترويسة خلية، يتم أيضاً إجراء التحقق من checksum والتحقق من المعاملات
تفريغ الخلية كاملة إلى القرص (قد يستغرق هذا بعض الوقت)
regipy-dump ~/Documents/TestEvidence/Registry/NTUSER-CCLEANER.DAT -o /tmp/output.json
يمكن لأداة regipy-dump أيضاً إخراج خط زمني بدلاً من JSON، عن طريق إضافة العلامة -t
تشغيل الإضافات ذات الصلة على الخلية
regipy-plugins-run ~/Documents/TestEvidence/Registry/SYSTEM -o /tmp/plugins_output.json
سيتم اكتشاف نوع الخلية تلقائياً وسيتم تنفيذ الإضافات ذات الصلة. راجع قسم الإضافات للحصول على مزيد من المعلومات
مقارنة خلايا التسجيل
قارن خلايا التسجيل من نفس النوع وأخرج إلى CSV (إذا لم يتم تحديد -o فسيتم طباعة المخرجات على الشاشة)
regipy-diff NTUSER.dat NTUSER_modified.dat -o /tmp/diff.csv
مثال على المخرجات:
[2019-02-11 19:49:18.824245] INFO: regipy.cli: Comparing NTUSER.DAT vs NTUSER_modified.DAT
╒══════════════╤══════════════╤════════════════════════════════════════════════════════════════════════════════╤════════════════════════════════════════════════╕
│ difference │ first_hive │ second_hive │ description │
╞══════════════╪══════════════╪════════════════════════════════════════════════════════════════════════════════╪════════════════════════════════════════════════╡
│ new_subkey │ │ 2019-02-11T19:46:31.832134+00:00 │ \Software\Microsoft\legitimate_subkey │
├──────────────┼──────────────┼────────────────────────────────────────────────────────────────────────────────┼────────────────────────────────────────────────┤
│ new_value │ │ not_a_malware: c:\temp\legitimate_binary.exe @ 2019-02-11 19:45:25.516346+00:00 │ \Software\Microsoft\Windows\CurrentVersion\Run │
╘══════════════╧══════════════╧════════════════════════════════════════════════════════════════════════════════╧════════════════════════════════════════════════╛
[2019-02-11 19:49:18.825328] INFO: regipy.cli: Detected 2 differences
استعادة خلية تسجيل، باستخدام سجلات المعاملات
regipy-process-transaction-logs NTUSER.DAT -p ntuser.dat.log1 -s ntuser.dat.log2 -o recovered_NTUSER.dat
بعد الاستعادة، قارن الخلايا باستخدام registry-diff لمعرفة ما تغير
الاستخدام كمكتبة
تهيئة كائن خلية التسجيل
from regipy.registry import RegistryHive
reg = RegistryHive("/Users/martinkorman/Documents/TestEvidence/Registry/Vibranium-NTUSER.DAT")
التنقل التكراري عبر الخلية بأكملها، من المفتاح الجذر
for entry in reg.recurse_subkeys(as_json=True):
print(entry)
التنقل عبر مفتاح والحصول على جميع المفاتيح الفرعية ووقت تعديلها
for sk in reg.get_key('Software').iter_subkeys():
print(sk.name, convert_wintime(sk.header.last_modified).isoformat())