
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 هي مكتبة بايثون لتحليل خلايا التسجيل غير المتصلة (ملفات 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.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 يُظهر السبب: في الخلفية بلغة بايثون، يهيمن وقت التجول على تحليل هيكل 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