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 のアプライアンスに遭遇します。それらのホストのオンディスク構造は本質的に異なります。これがバージョン別リファレンスです。
なぜ単一のフォーマットがないのか
ShimCache は公開仕様のない Windows 内部構造です。Microsoft は shim インフラの進化に合わせてリリースごとに作り直しました。レジストリ値の名前とパスも移動しています。堅牢なパーサーは、エントリを 1 件読む前にヘッダからバージョンを特定します。
バージョン別チートシート
| 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/00ts レイアウトは別記事で詳述。)
XP — 例外
Windows XP は後続のどれとも似ていません。マジック 0xDEADBEEF、固定幅 552 バイトのレコード、96 エントリの厳格な上限、固定長にパディングされた UTF-16 パス。後のバージョンが廃止した最終更新タイムスタンプとファイルサイズフィールドも保存していました。0xDEADBEEF を見たら XP 領域であり、現代的な解析ロジックは一切当てはまりません。
Windows 7 — 最も遭遇するもの
Windows 7 / Server 2008 R2 は IR でいまだ一般的です。マジック 0xBADC0FEE、32 バイトヘッダ、そしてパス・ファイルの最終更新時刻・特に有用な 実行フラグ(Windows 8 以降で削除)を含むエントリレコード。Windows 7 ではフラグが立っていれば実行の妥当な(絶対ではない)裏付けになります。新しいシステムへ外挿しないでください。ShimCache は実行を証明するかで説明しています。
8 / 8.1 の移行
Windows 8 はエントリごとの署名(00ts)を持つ可変長エントリを導入し、8.1 はそれを 10ts に上げました。これは Windows 10/11 フォーマットの構造的祖先であり、8.1 を扱えるパーサーは 10 を扱う準備がほぼできています。
ツールチェーンなしで解析する
Shimcache Parser はヘッダのマジックを自動検出し、XP、2003、Vista、7、8、8.1、10/11 の正しいデコーダへ分岐します — 古いツールを用意せずにレガシーな SYSTEM ハイブをブラウザで読めます。これら古いシステムでの収集についてはSYSTEM ハイブの取得を参照。
さらに読む
- Mandiant: leveraging the ShimCache — バージョン別のオリジナルのリバースエンジニアリング。
- Eric Zimmerman の AppCompatCacheParser — 全バージョンに対応;良い基準。