العودة إلى التحديثات
New releaseAug 20, 2026

regipy v6.3.0

Regipy هي مكتبة بايثون مستقلة عن نظام التشغيل لتحليل خلايا التسجيل غير المتصلة.

مشاركة

regipy

OpenSSF Scorecard

⚠️ تغييرات جذرية في الإصدار 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 تشغيلات:

HiveKeysPythonRustSpeedup
NTUSER.DAT1,812173 ms5 ms38x
UsrClass.dat6,205948 ms17 ms55x
amcache.hve2,105837 ms12 ms67x
SYSTEM30,75623.1 s91 ms253x
SYSTEM (Win10 1709)43,211118.7 s111 ms1,068x
SOFTWARE117,488745.6 s292 ms2,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())

الفئات