
regipy v6.3.0
Regipy es una biblioteca de Python independiente del sistema operativo para analizar registry hives sin conexión.
regipy
⚠️ Cambios importantes en la v6.0.0
La versión 6.0.0 incluye cambios significativos de modernización:
- Se requiere Python 3.9+ - Se eliminó el soporte para Python 3.6, 3.7 y 3.8
- Se eliminó la librería
attrs- Las clases de datos ahora usan el módulo integradodataclassesde Python- Si tu código importa clases internas (
Cell,VKRecord,Value,Subkey) y usa funciones deattrscomoattr.asdict(), cambia adataclasses.asdict()Consulta el CHANGELOG para obtener todos los detalles.
Regipy es una librería de Python para analizar colmenas de registro offline (archivos Hive con cabecera REGF). regipy tiene muchas capacidades:
- Uso como librería:
- Recorrer recursivamente la colmena del registro, desde la raíz o desde una ruta dada, y obtener todas las subclaves y valores
- Leer subclaves y valores específicos
- Aplicar registros de transacciones sobre una colmena del registro
- Herramientas de línea de comandos
- Volcar una colmena del registro completa a json
- Aplicar registros de transacciones sobre una colmena del registro
- Comparar colmenas del registro
- Ejecutar plugins desde un sistema de plugins robusto (es decir: amcache, shimcache, extraer nombre de equipo...)
Requiere Python 3.9 o superior.
Instalación
La última versión de Regipy se puede instalar desde pypi:
pip install regipy[full]
NOTA: regipy[full] instala dependencias que requieren herramientas de compilación y puede tardar algún tiempo.
Es posible instalar una versión con dependencias relajadas, omitiendo [full].
Además, es posible instalar desde el código fuente clonando el repositorio y ejecutando:
pip install --editable .[full]
Backend acelerado con Rust (alfa)
Hay disponible una implementación opcional en Rust del analizador REGF principal como
backend opcional, publicada por separado en PyPI como
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.
Es un reemplazo directo validado 1:1 contra el analizador en Python puro sobre
todo el corpus de colmenas de prueba — cada ruta de clave, marca de tiempo, valor y salida de plugin,
notarizado mediante digests de recorrido SHA-256 coincidentes (consulta
regipy_tests/comparison_test.py y la sección Forensic parity evidence
de regipy-rs/BENCHMARKS.md).
Recorrido completo con valores (recurse_subkeys), mejor de 3 ejecuciones:
| 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 muestra por qué: en el backend de Python, el tiempo de recorrido está dominado por
el análisis de estructuras construct por registro y la decodificación de valores; con el backend
de Rust, el analizador desaparece por completo del perfil y el único
coste restante en Python es la construcción de las dataclasses Subkey devueltas.
Los perfiles completos, los digests por colmena y un descargo de responsabilidad que documenta las pocas
divergencias intencionales (tipos de excepción en colmenas corruptas, comportamiento del guardián de ciclos) están en regipy-rs/BENCHMARKS.md;
python regipy-rs/benchmark.py regenera el informe completo.
El analizador en Python puro sigue siendo el predeterminado y no se ve afectado cuando el backend de Rust no está instalado.
CLI
Analizar la cabecera
regipy-parse-header ~/Documents/TestEvidence/Registry/SYSTEM
Salida de ejemplo:
╒════════════════════════╤══════════╕
│ 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
- Al analizar la cabecera de una colmena, también se realizan la validación de checksum y las validaciones de transacciones
Volcar la colmena completa a disco (esto puede tardar algún tiempo)
regipy-dump ~/Documents/TestEvidence/Registry/NTUSER-CCLEANER.DAT -o /tmp/output.json
La utilidad regipy-dump también puede generar una línea de tiempo en lugar de un JSON, añadiendo el flag -t
Ejecutar plugins relevantes en la colmena
regipy-plugins-run ~/Documents/TestEvidence/Registry/SYSTEM -o /tmp/plugins_output.json
El tipo de colmena se detectará automáticamente y se ejecutarán los plugins relevantes. Consulta la sección de plugins para más información
Comparar colmenas del registro
Compara colmenas del registro del mismo tipo y genera un CSV (si no se especifica -o, la salida se imprimirá en pantalla)
regipy-diff NTUSER.dat NTUSER_modified.dat -o /tmp/diff.csv
Salida de ejemplo:
[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