
regipy v6.3.0
Regipy est une bibliothèque python indépendante du système d'exploitation pour analyser les ruches de registre hors ligne.
regipy
⚠️ 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 :
- Utilisation en tant que bibliothèque :
- Parcourir récursivement la ruche de registre, depuis la racine ou un chemin donné, et récupérer toutes les sous-clés et valeurs
- Lire des sous-clés et valeurs spécifiques
- Appliquer des journaux de transaction sur une ruche de registre
- Outils en ligne de commande
- Exporter une ruche de registre entière en json
- Appliquer des journaux de transaction sur une ruche de registre
- Comparer des ruches de registre
- Exécuter des plugins depuis un système de plugins robuste (ex : amcache, shimcache, extraction du nom d'ordinateur...)
Nécessite Python 3.9 ou supérieur.
Installation
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]
Backend accéléré en Rust (alpha)
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é.
CLI
Analyser l'en-tête
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
- Lors de l'analyse de l'en-tête d'une ruche, la validation de la somme de contrôle et les validations de transaction sont également effectuées
Exporter une ruche entière sur disque (cela peut prendre un certain temps)
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
Exécuter les plugins pertinents sur une ruche
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
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