ShimCache (AppCompatCache)¶
Що таке ShimCache¶
Підсистема сумісності програм Windows (Application Compatibility) кешує шляхи до виконуваних файлів і метадані під час оцінювання сумісності/поведінки шимів. Кеш зберігається, навіть якщо файли перейменовано, видалено або від'єднано разом зі знімним томом. Його структура та доступні поля відрізняються у версіях від Windows XP до Windows 11.
ShimCache цінний для виявлення історичних шляхів і, якщо формат має надійний прапорець виконання, як додаткове підтвердження виконання. Кешований час зазвичай є часом останньої зміни файлу, а не часом, коли Windows побачила або запустила його.
Найобґрунтованіший висновок: Windows зафіксувала шлях під час обробки
сумісності. Сам лише запис є доказом наявності/спостереження; використовуйте Executed лише там, де це підтримується.
Розташування та збирання¶
Байти зберігаються в кущі реєстру SYSTEM, зазвичай у:
Збирайте SYSTEM, SYSTEM.LOG1 і SYSTEM.LOG2. Juntei читає всі набори керування та визначає
Select\Current, якщо це можливо.
Найновіших активних записів може не бути в кущі
Windows може утримувати оновлення ShimCache в пам'яті та записувати їх під час вимкнення/перезавантаження. Кущ, скопійований з працюючої системи, може не містити найновіших спостережень. Час останнього запису кешу в реєстрі допомагає описати, коли його було збережено, але не є часом виконання окремого запису.
Застереження для аналітика¶
- Запис кешу сам по собі не доводить виконання.
Executedможе мати значенняYes,NoабоNA; доступна семантика залежить від формату/версії.LastModifiedTimeUTCналежить файлу, на який посилається запис, а не спостереженню чи виконанню.- Порядок корисний, але не є універсальною точною хронологією; дублікати трапляються в різних наборах керування/slack.
- Записи
FromSlackвідновлено поза активним кешем, і вони потребують додаткової обережності. - «Брудний»
SYSTEMбез придатних журналів може не містити поточних записів. Читайте підсумок відновлення. - Знахідки вказують на підозрілі шаблони назв/шляхів, а не є вердиктом про шкідливе ПЗ.
Аналіз за допомогою Juntei¶
Usage: juntei parse-registry shimcache <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find SYSTEM hives
-f, --file <FILE> Parse SYSTEM or a raw AppCompatCache value
--no-logs Do not replay SYSTEM.LOG1/SYSTEM.LOG2
Output:
-o, --output <FILE> Save records
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-registry shimcache -f SYSTEM -o shimcache.csv
juntei parse-registry shimcache -d evidence/ -t jsonl \
| jq 'select(.Executed == true or (.Findings | length > 0))'
Поля виводу¶
| Поле | Інтерпретація |
|---|---|
ControlSet |
Номер набору керування, що містить кеш. Перш ніж вибрати один, порівняйте IsCurrent. |
CacheEntryPosition |
Позиція/порядок у декодованому кеші. Корисна для відносного впорядкування, але не є часом. |
Path |
Кешований шлях до виконуваного файлу/пакета. Основна точка переходу для пошуку загроз. |
LastModifiedTimeUTC |
Час зміни файлу, збережений у записі, — не час виконання/спостереження. |
Executed |
Yes, No або NA відповідно до прапорців підтримуваних форматів. Використовуйте лише з урахуванням версії. |
Duplicate |
Той самий запис уже траплявся в попередньому наборі керування або slack; допомагає уникнути подвійного підрахунку. |
SourceFile |
Вхідний кущ/необроблене значення. Необхідне для роботи з кількома хостами. |
FromSlack |
Запис відновлено зі slack значення кешу, а не з активного списку. Нижча достовірність, можливо, старіший запис. |
CacheFormat |
Декодована структура Windows/кешу. Визначає доступність і семантику полів. |
CacheLastWrittenUTC |
Час збереження ключа реєстру/кешу. Це спільний контекст, а не час запуску кожного запису. |
InsertFlags, ShimFlags |
Необроблені прапорці сумісності; Executed — інтерпретований Juntei результат там, де це підтримується. |
DataSize |
Розмір даних цього запису, корисний для структурної перевірки. |
Machine |
Архітектура, записана новішими форматами (x64, x86, ARM64). |
FileSize, LastUpdateTimeUTC |
Кешовані метадані, специфічні для Windows XP, якщо вони наявні. |
PackageName, PackageVersion, PackagePublisherID |
Ідентичність пакетної програми в записах, де це підтримується. Publisher ID є контекстом, а не доказом підпису. |
Findings |
Коди аномалій Juntei, як-от переміщений системний двійковий файл або підозрілий шлях підготовки (staging). Лише зачіпки. |
RegistryPath, RegistryValueName |
Точне джерело — ключ/значення куща. Зберігайте для перевірки. |
CacheValueSize |
Розмір усього значення реєстру, а не DataSize окремого запису. |
IsCurrent |
Чи збігається набір керування цього запису з SYSTEM\Select\Current; порожнє, якщо це не відомо напевно. |
SelectCurrent, SelectDefault, SelectLastKnownGood, SelectFailed |
Необроблені номери наборів керування з SYSTEM\Select для контексту та аналізу відновлення. |
JSON/JSONL додатково зберігають дані записів, теги, підзаписи пакетних програм, структуровані знахідки, проблеми кешу та подробиці відновлення.
Стратегія розслідування¶
- Надавайте перевагу поточному набору керування, але зберігайте інші набори та slack як історичні докази.
- Шукайте за шляхами та знахідками; не використовуйте
LastModifiedTimeUTCяк час виконання. - Якщо
Executed == Yes, підтверджуйте це за допомогою Prefetch, SRUM, журналів подій або інших слідів виконання. - Зіставляйте шляхи з
$MFT/USN, щоб визначити історію створення, видалення та метаданих. - У звіті вказуйте, чи було відтворено журнали транзакцій і чи міг активний кеш не бути записаний на диск.