
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 العديد من الإمكانيات:
يتطلب Python 3.9 أو أعلى.
يمكن تثبيت أحدث إصدار من Regipy من pypi:
pip install regipy[full]
ملاحظة: يقوم regipy[full] بتثبيت التبعيات التي تتطلب أدوات الترجمة (Compilation Tools) وقد يستغرق بعض الوقت.
من الممكن تثبيت إصدار بتبعيات مخففة، عن طريق حذف [full].
أيضاً، من الممكن التثبيت من المصدر عن طريق استنساخ المستودع وتنفيذ:
pip install --editable .[full]
يتوفر تطبيق 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 مثبتة.
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
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())