
Regipy は、オフラインレジストリハイブを解析するためのOS非依存のPythonライブラリです。
⚠️ v6.0.0 における破壊的変更
バージョン 6.0.0 には大幅なモダナイゼーションの変更が含まれています:
- Python 3.9 以上が必要 - Python 3.6、3.7、3.8 のサポートを終了
attrsライブラリを削除 - データクラスは Python 組み込みのdataclassesモジュールを使用するようになりました- 内部クラス (
Cell、VKRecord、Value、Subkey) をインポートし、attr.asdict()のようなattrs関数を使用している場合は、dataclasses.asdict()に切り替えてください詳細については CHANGELOG を参照してください。
Regipy は、オフラインのレジストリハイブ (REGF ヘッダーを持つ Hive ファイル) を解析するための Python ライブラリです。regipy には多くの機能があります:
Python 3.9 以上が必要です。
Regipy の最新バージョンは pypi からインストールできます:
pip install regipy[full]
注: regipy[full] はコンパイルツールを必要とする依存関係をインストールするため、時間がかかる場合があります。
[full] を省略することで、依存関係を緩和したバージョンをインストールすることも可能です。
また、リポジトリをクローンして以下を実行することで、ソースからインストールすることも可能です:
pip install --editable .[full]
コア REGF パーサーのオプションの Rust 実装が、オプトイン
バックエンドとして利用可能で、PyPI に
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.
これはドロップイン置換であり、テストハイブコーパス全体にわたって純粋な Python パーサーと 1:1 で検証されています — すべてのキーパス、タイムスタンプ、値、プラグイン出力が、一致する SHA-256 トラバーサルダイジェストによって公証されています (regipy_tests/comparison_test.py および regipy-rs/BENCHMARKS.md の Forensic parity evidence セクションを参照)。
値付きの完全なトラバーサル (recurse_subkeys)、3 回実行のベスト:
| 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 はその理由を示しています: Python バックエンドでは、トラバーサル時間はレコードごとの construct 構造体解析と値のデコードによって支配されていますが、Rust バックエンドではパーサーがプロファイルから完全に消え、残る Python のコストは返される Subkey データクラスの構築のみです。
完全なプロファイル、ハイブごとのダイジェスト、および少数の意図的な相違点 (破損したハイブでの例外タイプ、サイクルガードの動作) を文書化した免責事項は regipy-rs/BENCHMARKS.md にあります;
python regipy-rs/benchmark.py でレポート全体を再生成できます。
純粋な Python パーサーはデフォルトのままであり、Rust バックエンドがインストールされていない場合は影響を受けません。
regipy-parse-header ~/Documents/TestEvidence/Registry/SYSTEM
出力例:
╒════════════════════════╤══════════╕
│ 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
regipy-dump ユーティリティは、-t フラグを追加することで、JSON の代わりにタイムラインを出力することもできます
regipy-plugins-run ~/Documents/TestEvidence/Registry/SYSTEM -o /tmp/plugins_output.json
ハイブタイプは自動的に検出され、関連するプラグインが実行されます。 詳細についてはプラグインセクションを参照してください
同じタイプのレジストリハイブを比較し、CSV に出力します (-o が指定されていない場合、出力は画面に表示されます)
regipy-diff NTUSER.dat NTUSER_modified.dat -o /tmp/diff.csv
出力例:
[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
regipy-process-transaction-logs NTUSER.DAT -p ntuser.dat.log1 -s ntuser.dat.log2 -o recovered_NTUSER.dat
復元後、registry-diff でハイブを比較し、何が変更されたかを確認します
from regipy.registry import RegistryHive
reg = RegistryHive("/Users/martinkorman/Documents/TestEvidence/Registry/Vibranium-NTUSER.DAT")
for entry in reg.recurse_subkeys(as_json=True):
print(entry)
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