Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
regipy — Regipy est une bibliothèque python indépendante du système d'exploitation pour analyser les ruches de registre hors ligne. | Kitploit
Outils/GitHubGitHub/mkorman90/regipy
Analyse ForensiqueCriminalistique NumériqueRenseignement sur les MenacesRéponse aux Incidents
GitHubmkorman90/regipy

regipy

Regipy est une bibliothèque python indépendante du système d'exploitation pour analyser les ruches de registre hors ligne.

Voir le dépôt
2775935il y a 4 joursVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager
# regipy

[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/mkorman90/regipy/badge)](https://securityscorecards.dev/viewer/?uri=github.com/mkorman90/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 `attrs` supprimée** - Les classes de données utilisent désormais le module `dataclasses` intégré à Python
> - Si votre code importe des classes internes (`Cell`, `VKRecord`, `Value`, `Subkey`) et utilise des fonctions `attrs` comme `attr.asdict()`, passez à `dataclasses.asdict()`
>
> Consultez le [CHANGELOG](https://github.com/mkorman90/regipy/blob/master/CHANGELOG.md) 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 :

```bash
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 :

```bash
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`](https://pypi.org/project/regipy-rs/) :

```bash
pip install regipy[rust]
```

```python
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](https://github.com/mkorman90/regipy/blob/master/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](https://github.com/mkorman90/regipy/blob/master/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

```bash
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)

```bash
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

```bash
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**](https://github.com/mkorman90/regipy/blob/master/docs/PLUGINS.md)

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

```bash
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
```

## Récupérer une ruche de registre à l'aide des journaux de transaction

```bash
regipy-process-transaction-logs NTUSER.DAT -p ntuser.dat.log1 -s ntuser.dat.log2 -o recovered_NTUSER.dat
```

Après la récupération, comparez les ruches avec registry-diff pour voir ce qui a changé

## Utilisation en tant que bibliothèque

#### Initialiser l'objet ruche de registre

```python
from regipy.registry import RegistryHive

reg = RegistryHive("/Users/martinkorman/Documents/TestEvidence/Registry/Vibranium-NTUSER.DAT")
```

#### Parcourir récursivement toute la ruche, depuis la clé racine

```python
for entry in reg.recurse_subkeys(as_json=True):
    print(entry)
```

#### Parcourir une clé et récupérer toutes les sous-clés et leur date de modification

```python
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
```

#### Récupérer les valeurs d'une clé

```python
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},
]
```

#### Utilisation en tant que plugin

```python
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,
            }
        ],
    }
}
```

#### Exécuter tous les plugins pertinents pour une ruche spécifique

```python
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",
        }
    ],
}
```

## Cas de validation

[Rapport des cas de validation](https://github.com/mkorman90/regipy/blob/master/regipy_tests/validation/plugin_validation.md)

Tous les nouveaux plugins doivent avoir un ou plusieurs cas de validation de base (qui pourront être étendus à l'avenir), par exemple :

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


class NTUserUserAssistValidationCase(ValidationCase):
    # define your plugin class
    plugin = BAMPlugin
    # define the test file name, which should be present in `regipy_tests/data`
    test_hive_file_name = "SYSTEM_WIN_10_1709.xz"

    # Use `expected_entries` to test for presence of a few samples from the plugin results
    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",
        }
    ]

    # OR use `exact_expected_result` to test for an exact 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
```

## Développement

### Configuration pour le développement

```bash
# Clone the repository
git clone https://github.com/mkorman90/regipy.git
cd regipy

# Install in development mode with all dependencies
pip install -e ".[full,dev]"

# Install pre-commit hooks
pre-commit install
```

### Exécution des tests

```bash
# Run all tests
pytest

# Run specific test files
pytest regipy_tests/tests.py
pytest regipy_tests/cli_tests.py

# Run plugin validation
PYTHONPATH=. python regipy_tests/validation/plugin_validation.py
```

### Qualité du code

```bash
# Run linter
ruff check .

# Run formatter
ruff format .

# Run type checker
mypy regipy/
```

### Tester GitHub Actions localement

Pour tester localement les modifications des workflows CI avant de pousser, utilisez [act](https://github.com/nektos/act) :

```bash
# Install act (Fedora)
sudo dnf install act-cli

# Install act (macOS)
brew install act

# Install act (other)
# See https://nektosact.com/installation/index.html
```

Assurez-vous que Docker est en cours d'exécution, puis :

```bash
# List available jobs
act -l

# Run the lint job
act -j lint

# Run all jobs for a push event
act push

# Run the test job with a specific Python version
act -j test

# Test the build job from publish workflow (simulates a release)
act release -j build --eventpath /dev/stdin <<< '{"action": "published"}'
```

Remarque : certains jobs peuvent nécessiter des secrets. Vous pouvez les fournir avec :

```bash
act -j publish --secret PYPI_API_TOKEN=your_token
```

## Licence

MIT
Télécharger l’outil