TL;DR. 各 Windows 世代は AppCompatCache 構造を書き換えました。XP は 0xDEADBEEF マジックと固定 552 バイトレコードを使います。Server 2003、Vista/2008、Windows 7/2008 R2、Windows 8/8.1 はそれぞれ独自のヘッダとエントリレイアウトを持ちます。パーサはヘッダマジックで分岐しなければなりません。単一のフォーマットは存在しません。
ほとんどの ShimCache ドキュメントは Windows 10/11 レイアウト を扱います。これがワークステーションで調査員が目にするものだからです。それから Windows 7 ドメインコントローラ、Server 2008 R2 アプリケーションボックス、または業務コードを実行している時折の XP アプライアンスからの SYSTEM ハイブを渡され、モダンなパーサは丁寧に拒否します。これがそれらのケースのためのリファレンスです。
単一のフォーマットがない理由
ShimCache は公開仕様のない Windows 内部構造です。Microsoft は shim インフラの進化に伴い、リリース間で形を作り変えてきました。レジストリ値名とパスも移動しました。堅牢なパーサは単一のエントリを読む前にヘッダからバージョンを識別します。Eric Zimmerman の AppCompatCacheParser はすべてのバージョンを処理します。Mandiant の Shim Cache Parser はほとんどを処理します。バージョン検出ステップなしで自作することは、サイレント破損を生み出す方法です。
バージョン別チートシート
| Windows | レジストリ値 | ヘッダマジック | エントリ形状 |
|---|---|---|---|
| XP(32 ビット) | …\AppCompatibility\AppCompatCache | 0xDEADBEEF | 固定 552 バイトレコード、最大 96 |
| Server 2003 | …\AppCompatCache\AppCompatCache | 0xBADC0FFE | 24 バイト(x86)/ 32 バイト(x64)エントリ |
| Vista / 2008 | …\AppCompatCache\AppCompatCache | 0xBADC0FFE | 2003 と同様、異なるフラグ |
| Windows 7 / 2008 R2 | …\AppCompatCache\AppCompatCache | 0xBADC0FEE | 32 バイトヘッダ、エントリは挿入フラグを保持 |
| Windows 8 / 2012 | …\AppCompatCache\AppCompatCache | 0x00000080 | 可変長 00ts エントリシグネチャ |
| Windows 8.1 / 2012 R2 | …\AppCompatCache\AppCompatCache | 0x00000080 | 10ts エントリシグネチャ |
Windows 10/11 の 10ts モダンレイアウトは 別途 詳しく扱っています。
XP、はみ出し者
Windows XP は後続のすべてと異なります。0xDEADBEEF マジック、固定幅 552 バイトレコード、エントリ 96 件の厳格上限、固定長にパディングされた UTF-16 パス。最終更新タイムスタンプとファイルサイズフィールドも保存しており、後のバージョンはそれを廃止しました。0xDEADBEEF を見たら XP 領域にいて、モダンな解析ロジックは適用されません。レジストリパスも移動しました:XP は AppCompatCache ではなく AppCompatibility 配下に値を保持します。
Windows 7、最もよく出会うもの
Windows 7 と Server 2008 R2 は IR で依然として一般的です。マジック 0xBADC0FEE、32 バイトヘッダ、パス、ファイルの最終更新時刻、(独自に有用な)Windows 8 以降で削除された実行フラグを含むエントリごとのレコード。Windows 7 では実行フラグが設定されていることが実行の妥当な裏付けとなります、絶対ではありませんが。新しいシステムへの外挿はやめてください。ShimCache は実行を証明するか で説明されています。
Windows 7 ハイブはまた AmCache の前身である RecentFileCache.bcf とペアになります。Win7 SYSTEM があれば、その隣に有用な RecentFileCache.bcf がある可能性が高いです。
8 / 8.1 移行
Windows 8 はエントリごとのシグネチャ(00ts)を持つ可変長エントリを導入し、8.1 はそれを 10ts に引き上げました。これは Windows 10/11 フォーマットの構造的祖先で、8.1 を処理するパーサは 10 を処理するまでのほとんどの道のりを進んでいます。ヘッダマジックは 0x00000080(最初のエントリのオフセット)に移動し、これがモダンハイブが保持した慣習です。
Server 2003 と Vista
マジック 0xBADC0FFE。エントリは小さく(x86 で 24 バイト、x64 で 32 バイト)。Vista は 2003 にはなかったフラグワードを追加しました。両方ともモダンなインシデント対応では珍しいですが、レガシーインフラの lift-and-shift 移行で現れます。
ツールチェーンなしで解析する
Shimcache Parser はヘッダマジックを自動検出し、XP、2003、Vista、7、8、8.1、10/11 用の正しいデコーダに分岐します。古いツールをセットアップせずにブラウザでレガシー SYSTEM ハイブを読めます。これらの古いシステムでの収集ガイダンスについては SYSTEM ハイブの取得 を参照してください。レガシーボックスでのより広範なレジストリトリアージには registry parser が古いハイブフォーマットの癖を扱います。
さらに読む
- Mandiant の Caching Out the Val:オリジナルのバージョン別リバースエンジニアリング。
- Eric Zimmerman の AppCompatCacheParser:すべてのバージョンを処理、良い ground truth。