
Regipy est une bibliothèque python indépendante du système d'exploitation pour analyser les ruches de registre hors ligne.
⚠️ Changements majeurs dans la v6.0.0
La version 6.0.0 inclut des changements de modernisation importants :
- Python 3.9+ requis - Abandon du support de Python 3.6, 3.7 et 3.8
- Bibliothèque
attrssupprimée - Les classes de données utilisent désormais le moduledataclassesintégré à Python- Si votre code importe des classes internes (
Cell,VKRecord,Value,Subkey) et utilise des fonctionsattrscommeattr.asdict(), passez àdataclasses.asdict()Consultez le CHANGELOG pour tous les détails.
Regipy est une bibliothèque Python pour analyser des ruches de registre hors ligne (fichiers Hive avec en-tête REGF). regipy possède de nombreuses capacités :
Nécessite Python 3.9 ou supérieur.
La dernière version de Regipy peut être installée depuis pypi :
pip install regipy[full]
NOTE : regipy[full] installe des dépendances qui nécessitent des outils de compilation et peut prendre un certain temps.
Il est possible d'installer une version avec des dépendances allégées, en omettant [full].
Il est également possible d'installer depuis les sources en clonant le dépôt et en exécutant :
pip install --editable .[full]
Une implémentation Rust optionnelle du parseur REGF principal est disponible en tant que
backend opt-in, publiée séparément sur PyPI sous le nom
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.
C'est un remplacement direct validé 1:1 par rapport au parseur pur Python sur
l'ensemble du corpus de ruches de test — chaque chemin de clé, horodatage, valeur et sortie de plugin,
notarié par des empreintes de parcours SHA-256 correspondantes (voir
regipy_tests/comparison_test.py et la section Forensic parity evidence
de regipy-rs/BENCHMARKS.md).
Parcours complet avec valeurs (recurse_subkeys), meilleur de 3 exécutions :
| 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 montre pourquoi : dans le backend Python, le temps de parcours est dominé par
l'analyse de structure construct par enregistrement et le décodage des valeurs ; avec le backend Rust,
le parseur disparaît complètement du profil et le seul coût Python restant
est la construction des dataclasses Subkey retournées.
Les profils complets, les empreintes par ruche et un avertissement documentant les quelques
divergences intentionnelles (types d'exceptions sur les ruches corrompues, comportement de garde contre les cycles)
sont dans regipy-rs/BENCHMARKS.md ;
python regipy-rs/benchmark.py régénère le rapport complet.
Le parseur pur Python reste la valeur par défaut et n'est pas affecté lorsque le backend Rust n'est pas installé.
regipy-parse-header ~/Documents/TestEvidence/Registry/SYSTEM
Exemple de sortie :
╒════════════════════════╤══════════╕
│ 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
L'utilitaire regipy-dump peut également produire une chronologie au lieu d'un JSON, en ajoutant le flag -t
regipy-plugins-run ~/Documents/TestEvidence/Registry/SYSTEM -o /tmp/plugins_output.json
Le type de ruche sera détecté automatiquement et les plugins pertinents seront exécutés. Voir la section plugins pour plus d'informations
Comparer des ruches de registre du même type et produire un CSV (si -o n'est pas spécifié, la sortie sera affichée à l'écran)
regipy-diff NTUSER.dat NTUSER_modified.dat -o /tmp/diff.csv
Exemple de sortie :
[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