Windows Registry Hives¶
What registry hives are¶
The Windows Registry stores system and user configuration in binary hive files. Keys form a tree; values under a key contain typed data. Registry artifacts describe persistence, installed software, services, accounts, network configuration, user activity, security settings, and almost every part of Windows state.
Juntei's generic reader decodes any primary hive, replays transaction logs, reports damage, and can recover deleted/free-cell, cell-slack, remnant, pre-replay, and transaction-log-only records.
Best conclusion: the hive contained or recoverably preserved the key/value state. A key last-write time shows the key changed, not which value changed or why.
Common hives and locations¶
| Hive | Typical path | Examples of evidence |
|---|---|---|
SYSTEM |
C:\Windows\System32\config\SYSTEM |
Services, drivers, control sets, host name, mounted devices, ShimCache |
SOFTWARE |
C:\Windows\System32\config\SOFTWARE |
Installed software, TaskCache, profiles, Windows configuration |
SAM |
C:\Windows\System32\config\SAM |
Local accounts and account metadata |
SECURITY |
C:\Windows\System32\config\SECURITY |
Local security policy/secrets metadata (access-dependent) |
DEFAULT |
C:\Windows\System32\config\DEFAULT |
Default system profile configuration |
NTUSER.DAT |
C:\Users\<user>\NTUSER.DAT |
User preferences, Run keys, RecentDocs, application activity |
UsrClass.dat |
%LOCALAPPDATA%\Microsoft\Windows\UsrClass.dat |
Shell classes, COM/user shell activity |
Amcache.hve |
C:\Windows\AppCompat\Programs\Amcache.hve |
Application inventory (use parse-registry amcache for semantic output) |
Collect adjacent .LOG, .LOG1, and .LOG2 files. A hive copied while Windows is running may be
dirty; transaction logs contain committed state that the primary file alone does not yet reflect.
Analyst cautions¶
- A key last-write timestamp applies to the key, not an individual value.
- Registry values usually have no independent timestamp.
CurrentControlSetis an analyst/Windows alias resolved throughSYSTEM\Select; it is not a literal stored key.- Deleted records can be partial, stale, duplicated across recovery sources, or overwritten.
- Transaction-log-only records show historical/intermediate state. Explain
recovered_from. - An
absent_valueresult means the queried key exists but lacks that value in the parsed state; it does not prove the value never existed. - Strings, paths, and command lines are configuration, not proof the configured action ran.
- A dirty hive without applicable logs can omit or expose stale state.
Parse with Juntei¶
Usage: juntei parse-registry read <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find primary registry hives
-f, --file <FILE> Parse one hive
--log1 <FILE> Supply first transaction log explicitly
--log2 <FILE> Supply second transaction log explicitly
--no-logs Intentionally read the primary file without replay
Filtering:
-k, --key <PATH> Exact key (case-insensitive)
--key-regex <REGEX> Key-path regular expression
--value <NAME> Exact value name ("" is default)
--value-regex <REGEX> Value-name regular expression
--data-regex <REGEX> Rendered-data regular expression
--timeline-start <DATE> Key last-write lower bound
--timeline-end <DATE> Key last-write upper bound
--recover-deleted Recover deleted and transaction-history records
Output:
-o, --output <FILE> Save CSV/JSON/JSONL
-t, --output-type <TYPE> csv, json, or jsonl
--raw-data Include exact bytes for every value
--qword-as-filetime Also render REG_QWORD as FILETIME
# Inspect one persistence key
juntei parse-registry read -f NTUSER.DAT \
-k 'Software\Microsoft\Windows\CurrentVersion\Run' -o run.csv
# Search allocated and recoverable values for a path/name
juntei parse-registry read -f SYSTEM --recover-deleted \
--data-regex 'powershell|cmd\.exe|users\\public' -t jsonl
# Show raw and decoded data for forensic validation
juntei parse-registry read -f SOFTWARE --raw-data -o software.jsonl -t jsonl
Output fields¶
| Field | Interpretation |
|---|---|
Host |
Host name derived from available system context; empty when Juntei cannot safely identify it. |
HiveType |
Detected hive category (SYSTEM, SOFTWARE, NTUSER.DAT, etc.). Use to interpret paths. |
SourcePath |
Exact input hive. Essential when directory mode combines hosts/users. |
RecordType |
key, value, default_value, or absent_value. Absence applies only to the query/state. |
KeyPath |
Path beneath the hive root. [unknown] marks unresolved deleted ancestry. |
KeyLastWrittenUTC |
Last modification of the key as a whole. It cannot identify which value changed. |
ValueName |
Named value; empty for a default/unnamed value. |
ValueType |
Registry type (REG_SZ, REG_DWORD, REG_BINARY, etc.). Type affects interpretation. |
ValueData |
Type-aware rendered value. Multi-strings remain lists in JSON. |
DataSize |
Size recorded by the value. Compare with raw bytes and Problems. |
ValueDataRaw |
Exact bytes when decoding fails or --raw-data is used. Preserve for validation. |
ValueU64 |
Whole numeric representation for DWORD/QWORD without JavaScript precision loss. |
ValueFiletimeUTC |
Optional QWORD-as-FILETIME rendering. Only meaningful when the key's schema defines FILETIME. |
AllocationStatus |
allocated, deleted_complete, deleted_partial, residual_value_only, or transaction_log_recovered. Controls confidence. |
RecoveredFrom |
free_cell, cell_slack, remnant_data, before_replay, or log entry such as SYSTEM.LOG1#1234. |
TransactionLogStatus |
clean, replayed, unchanged, or not_applied for this record/hive context. |
LogsApplied |
Transaction-log file names Juntei replayed. Record these in the report. |
Problems |
Damage, missing cells, type mismatch, unresolved lists/parents, or other limitations. |
Recovery-status interpretation¶
| Status | Meaning |
|---|---|
deleted_complete |
Deleted key/value was recovered with complete known path/data. Still historical, not active state. |
deleted_partial |
Some path, value list, value, or data was overwritten/unreadable. Do not fill gaps from reused cells. |
residual_value_only |
Value survived without enough key context; KeyPath may be absent. |
transaction_log_recovered |
State exists only in pre-replay/log versions and not in current allocated/free records. |
Investigation strategy¶
- Start with an exact semantic key when known; use regex/data searching for discovery.
- Check
TransactionLogStatus,AllocationStatus,RecoveredFrom, andProblemsbefore content. - Interpret data according to the key's documented schema;
REG_BINARYis not self-describing. - Correlate configuration with runtime evidence (event logs, Prefetch, SRUM, services/tasks).
- Preserve raw data for novel or disputed fields.