العودة إلى التحديثات
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 هي مكتبة بايثون لتحليل خلايا التسجيل غير المتصلة (ملفات Hive ذات رأس REGF). تحتوي regipy على العديد من الإمكانيات:

  • الاستخدام كمكتبة:
    • التجول عبر خلية التسجيل، من الجذر أو من مسار معين والحصول على جميع المفاتيح الفرعية والقيم
    • قراءة مفاتيح فرعية وقيم محددة
    • تطبيق سجلات المعاملات على خلية التسجيل
  • أدوات سطر الأوامر
    • تفريغ خلية التسجيل بالكامل إلى JSON
    • تطبيق سجلات المعاملات على خلية التسجيل
    • مقارنة خلايا التسجيل
    • تنفيذ الإضافات من نظام إضافات قوي (مثل: amcache، shimcache، استخراج اسم الكمبيوتر...)

يتطلب Python 3.9 أو أعلى.

التثبيت

يمكن تثبيت أحدث إصدار من regipy من pypi:

pip install regipy[full]

ملاحظة: regipy[full] يقوم بتثبيت تبعيات تتطلب أدوات ترجمة وقد تستغرق بعض الوقت. من الممكن تثبيت إصدار بتبعيات مخففة، عن طريق حذف [full].

أيضًا، يمكن التثبيت من المصدر عن طريق استنساخ المستودع وتنفيذ:

pip install --editable .[full]

الخلفية المسرّعة بـ Rust (إصدار ألفا)

يتوفر تطبيق اختياري بلغة Rust للمحلل الأساسي لملفات REGF كخلفية اختيارية، منشورة بشكل منفصل على PyPI باسم regipy-rs:

pip install regipy[rust]
from regipy.registry_rs import RegistryHive  # بدلاً من regipy.registry

reg = RegistryHive('/tmp/NTUSER.dat')
# نفس الواجهة: get_key, iter_values, recurse_subkeys, plugins — كل شيء
# يعمل دون تغيير، بما في ذلك جميع إضافات regipy.

إنه بديل مباشر تم التحقق منه بنسبة 1:1 مقابل المحلل بلغة Python الخالصة على مجموعة اختبار كاملة من الخلايا — كل مسار مفتاح، طابع زمني، قيمة ومخرجات إضافة، موثقة عبر مطابقة ملخصات SHA-256 الخاصة بالتجول (انظر regipy_tests/comparison_test.py وقسم Forensic parity evidence في regipy-rs/BENCHMARKS.md).

التجول الكامل مع القيم (recurse_subkeys)، أفضل 3 مرات تشغيل:

الخليةالمفاتيحبايثونراستتسريع
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 يُظهر السبب: في الخلفية بلغة بايثون، يهيمن وقت التجول على تحليل هيكل construct لكل سجل وفك تشفير القيمة؛ مع الخلفية بلغة Rust، يختفي المحلل من الملف الشخصي تمامًا وتبقى التكلفة الوحيدة في بايثون هي بناء فئات 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
  • عند تحليل رأس خلية، يتم أيضًا التحقق من صحة المجموع الاختباري والمعاملات

تفريغ الخلية بالكامل إلى القرص (قد يستغرق بعض الوقت)

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())

Adobe 2019-02-03T22:05:32.525965
AppDataLow 2019-02-03T22:05:32.526047
McAfee 2019-02-03T22:05:32.526140
Microsoft 2019-02-03T22:05:32.526282
Netscape 2019-02-03T22:05:32.526352
ODBC 2019-02-03T22:05:32.526521
Policies 2019-02-03T22:05:32.526592

الحصول على قيم مفتاح:

reg.get_key('Software\Microsoft\Internet Explorer\BrowserEmulation').get_values(as_json=True)
[{'name': 'CVListTTL',
  'value': 0,
  'value_type': 'REG_DWORD',
  'is_corrupted': False},
 {'name': 'UnattendLoaded',
  'value': 0,
  'value_type': 'REG_DWORD',
  'is_corrupted': False},
 {'name': 'TLDUpdates',
  'value': 0,
  'value_type': 'REG_DWORD',
  'is_corrupted': False},
 {'name': 'CVListXMLVersionLow',
  'value': 2097211,
  'value_type': 'REG_DWORD',
  'is_corrupted': False},
 {'name': 'CVListXMLVersionHigh',
  'value': None,
  'value_type': 'REG_DWORD',
  'is_corrupted': False},
 {'name': 'CVListLastUpdateTime',
  'value': None,
  'value_type': 'REG_DWORD',
  'is_corrupted': False},
 {'name': 'IECompatVersionHigh',
  'value': None,
  'value_type': 'REG_DWORD',
  'is_corrupted': False},
 {'name': 'IECompatVersionLow',
  'value': 2097211,
  'value_type': 'REG_DWORD',
  'is_corrupted': False},
 {'name': 'StaleCompatCache',
  'value': 0,
  'value_type': 'REG_DWORD',
  'is_corrupted': False}]

الاستخدام كإضافة:

from regipy.plugins.ntuser.ntuser_persistence import NTUserPersistencePlugin
NTUserPersistencePlugin(reg, as_json=True).run()

{
	'Software\\Microsoft\\Windows\\CurrentVersion\\Run': {
		'timestamp': '2019-02-03T22:10:52.655462',
		'values': [{
			'name': 'Sidebar',
			'value': '%ProgramFiles%\\Windows Sidebar\\Sidebar.exe /autoRun',
			'value_type': 'REG_EXPAND_SZ',
			'is_corrupted': False
		}]
	}
}

تشغيل جميع الإضافات ذات الصلة لخلية محددة

from regipy.plugins.utils import run_relevant_plugins
reg = RegistryHive('/Users/martinkorman/Documents/TestEvidence/Registry/SYSTEM')
run_relevant_plugins(reg, as_json=True)

{
	'routes': {},
	'computer_name': [{
		'control_set': 'ControlSet001\\Control\\ComputerName\\ComputerName',
		'computer_name': 'DESKTOP-5EG84UG',
		'timestamp': '2019-02-03T22:19:28.853219'
	}]
}

حالات التحقق

تقرير حالات التحقق

يجب أن تحتوي جميع الإضافات الجديدة على حالة تحقق أساسية واحدة أو أكثر (يمكن توسيعها في المستقبل)، على سبيل المثال:

from regipy.plugins.system.bam import BAMPlugin
from regipy_tests.validation.validation import ValidationCase


class NTUserUserAssistValidationCase(ValidationCase):
    # حدد فئة الإضافة الخاصة بك
    plugin = BAMPlugin
    # حدد اسم ملف الاختبار، الذي يجب أن يكون موجودًا في `regipy_tests/data`
    test_hive_file_name = "SYSTEM_WIN_10_1709.xz"

    # استخدم `expected_entries` لاختبار وجود بعض العينات من نتائج الإضافة
    expected_entries = [
        {
            "sequence_number": 9,
            "version": 1,
            "sid": "S-1-5-90-0-1",
            "executable": "\\Device\\HarddiskVolume2\\Windows\\System32\\dwm.exe",
            "timestamp": "2020-04-19T09:09:35.731816+00:00",
            "key_path": "\\ControlSet001\\Services\\bam\\state\\UserSettings\\S-1-5-90-0-1",
        }
    ]

    # أو استخدم `exact_expected_result` لاختبار نتيجة دقيقة:
    exact_expected_result = [
        {
            "sequence_number": 9,
            "version": 1,
            "sid": "S-1-5-90-0-1",
            "executable": "\\Device\\HarddiskVolume2\\Windows\\System32\\dwm.exe",
            "timestamp": "2020-04-19T09:09:35.731816+00:00",
            "key_path": "\\ControlSet001\\Services\\bam\\state\\UserSettings\\S-1-5-90-0-1",
        },
        {
            "sequence_number": 8,
            "version": 1,
            "sid": "S-1-5-90-0-1",
            "executable": "\\Device\\HarddiskVolume2\\Windows\\System32\\cmd.exe",
            "timestamp": "2020-04-19T09:09:34.544224+00:00",
            "key_path": "\\ControlSet001\\Services\\bam\\state\\UserSettings\\S-1-5-90-0-1",
        }
    ]

    expected_entries_count = 2

التطوير

الإعداد للتطوير

# استنساخ المستودع
git clone https://github.com/mkorman90/regipy.git
cd regipy

# التثبيت في وضع التطوير مع جميع التبعيات
pip install -e ".[full,dev]"

# تثبيت خطافات ما قبل الالتزام
pre-commit install

تشغيل الاختبارات

# تشغيل جميع الاختبارات
pytest

# تشغيل ملفات اختبار محددة
pytest regipy_tests/tests.py
pytest regipy_tests/cli_tests.py

# تشغيل التحقق من الإضافات
PYTHONPATH=. python regipy_tests/validation/plugin_validation.py

جودة الكود

# تشغيل المدقق
ruff check .

# تشغيل المنسق
ruff format .

# تشغيل مدقق الأنواع
mypy regipy/

اختبار إجراءات GitHub محلياً

لاختبار تغييرات سير العمل CI محلياً قبل الدفع، استخدم act:

# تثبيت act (Fedora)
sudo dnf install act-cli

# تثبيت act (macOS)
brew install act

# تثبيت act (أنظمة أخرى)
# راجع https://nektosact.com/installation/index.html

تأكد من تشغيل Docker، ثم:

# عرض المهام المتاحة
act -l

# تشغيل مهمة lint
act -j lint

# تشغيل جميع المهام لحدث push
act push

# تشغيل مهمة الاختبار بإصدار Python محدد
act -j test

# اختبار مهمة البناء من سير عمل النشر (يحاكي إصدارًا)
act release -j build --eventpath /dev/stdin <<< '{"action": "published"}'

ملاحظة: قد تتطلب بعض المهام أسرارًا. يمكنك توفيرها باستخدام:

act -j publish --secret PYPI_API_TOKEN=your_token

الترخيص

MIT

الفئات