Перейти до змісту

MuiCache

Що таке MuiCache

Коли користувач запускає програму, Windows читає ресурси версії програми, щоб отримати назву, яку має показувати оболонка (FileDescription, наприклад «Windows Command Processor» для cmd.exe), і кешує її для кожного користувача в MuiCache. Windows 8 і новіші версії також кешують компанію (CompanyName). Ключем кешу є повний шлях до програми:

  • Windows 8 і новіші: два значення для кожної програми, <path>.FriendlyAppName і <path>.AppCompany.
  • Windows Vista і 7: одне значення для кожної програми, <path>, що містить зрозумілу назву.
  • Windows XP: та сама форма, у NTUSER.DAT.

MuiCache може давати зачіпки щодо виконання програм у сеансі оболонки користувача, зокрема програм на знімних дисках, мережевих спільних папках і в папках, яких уже не існує, з назвою та компанією, які вказав сам файл.

Найобґрунтованіший висновок: цей профіль оболонки кешував шлях, опис і компанію файлу. Зіставляйте це з іншими артефактами виконання. Профіль не визначає обліковий запис, від імені якого працював процес. MuiCache не має часу для кожної програми та лічильника запусків.

Розташування

C:\Users\<user>\AppData\Local\Microsoft\Windows\UsrClass.dat     Windows Vista and later
Local Settings\Software\Microsoft\Windows\Shell\MuiCache

C:\Documents and Settings\<user>\NTUSER.DAT                         Windows XP
Software\Microsoft\Windows\ShellNoRoam\MUICache

LangID (мова кешованих рядків) не є програмою, тому його пропущено. Значення з назвами @<file>,-<number> (@shell32.dll,-22019) — це рядки ресурсів, які оболонка кешувала для власних меню та типів файлів, а не програми; їх пропущено й підраховано в підсумку. У Windows Vista і новіших версіях NTUSER.DAT не містить MuiCache.

Збирайте UsrClass.dat (і NTUSER.DAT) разом із їхніми журналами транзакцій для кожного профілю, а також кущі SYSTEM і SOFTWARE системи для імен хоста та користувачів.

Застереження для аналітика

  • Власник профілю не обов'язково є обліковим записом процесу. Програма, запущена від імені іншого облікового запису, може показати вікно в сеансі цього користувача й залишити метадані в його кеші. User і UserSid визначають власника куща, а не контекст безпеки процесу.
  • Немає часу для кожної програми. KeyLastWrittenUTC — це останній запис ключа: найновіша зміна будь-якої з його програм, а не момент запуску конкретної програми. Час дають Prefetch, BAM, UserAssist і журнали подій.
  • Не лише програми, які користувач запустив вручну. Може з'явитися DLL або програма, яку завантажила сама оболонка (для Open with, розширення оболонки, дочірнього процесу інсталятора), як-от explorerframe.dll або shell32.dll.
  • Назва береться з файлу. FriendlyAppName і AppCompany — це те, що вказували ресурси версії файлу на момент запуску. Шкідливе ПЗ може заявити будь-який опис і компанію; перейменований інструмент зберігає свій початковий опис, що може його викрити (файл із назвою svchost.exe, зрозуміла назва якого вказує на засіб віддаленого доступу).
  • Один запис на шлях. Повторний запуск тієї самої програми не додає запису; копія за іншим шляхом — додає. Запис програми може залишатися після видалення файлу.
  • Обидві форми для одного шляху. Якщо шлях має зрозумілу назву в обох формах (оновлений профіль), кожна отримує окремий запис, тож жодне значення не втрачається.
  • Пошкоджені значення. Значення, яке не є рядком, не є коректним UTF-16 або не може бути прочитане повністю, зберігає свої байти (FriendlyAppNameRaw, AppCompanyRaw) і вказується в Problems. Некоректний UTF-16 також може давати символи заміни у відображуваному тексті; використовуйте стовпець з необробленими даними, щоб отримати вихідні байти.

Аналіз за допомогою Juntei

Usage: juntei parse-registry muicache <INPUT> [OPTIONS]

Input:
  -d, --directory <DIR>  Recursively find UsrClass.dat and NTUSER.DAT hives
  -f, --file <FILE>      Parse one UsrClass.dat or NTUSER.DAT
      --log1/--log2      Supply transaction logs explicitly
      --no-logs          Do not replay logs

Output:
  -o, --output <FILE>       Save records
  -t, --output-type <TYPE>  csv, json, or jsonl
juntei parse-registry muicache -d evidence/ -o muicache.csv
juntei parse-registry muicache -f UsrClass.dat -t jsonl \
  | jq 'select(.Path | test("\\\\(Users|ProgramData|Temp)\\\\"; "i"))'

Підсумок перелічує програми поза папками Windows і Program Files (папки користувачів, інші диски, мережеві спільні папки) разом із їхніми користувачами, а також кількість пропущених рядків ресурсів. Папки Program Files з іншими назвами (у Windows іншими мовами) також перелічуються. Відносні шляхи та шляхи, що виходять за межі папки зі змінної середовища, також залишаються в переліку. Звичайні шляхи дисків перевіряються після обробки компонентів . і .. без звернення до файлової системи комп'ютера аналітика.

Поля виводу

Поле Інтерпретація
Host, User, UserSID, SourcePath Хост, назва папки профілю, SID користувача (його називає кореневий ключ UsrClass.dat; інакше — ProfileList системи) і кущ.
HiveType UsrClass.dat або NTUSER.DAT.
Path Шлях до програми: назва значення без .FriendlyAppName або .AppCompany.
FriendlyAppName Опис програми з <path>.FriendlyAppName або <path>.
AppCompany Компанія програми з <path>.AppCompany (Windows 8 і новіші).
KeyPath, KeyLastWrittenUTC Ключ MuiCache та його останній запис: найновіша зміна будь-якої з його програм.
FriendlyAppNameRaw, AppCompanyRaw Байти значення (у шістнадцятковому вигляді), якщо вони не є текстом, що коректно декодується.
TransactionLogStatus, LogsApplied Контекст відновлення реєстру: replayed, якщо журнали записали одне зі значень програми.
Problems Значення, які не є рядками, не є коректним UTF-16 або не можуть бути прочитані.

Стратегія розслідування

  1. Перевірте програми в розташуваннях, доступних користувачу для запису (\Users\, Downloads, Temp, ProgramData), на інших дисках і в мережевих спільних папках, а також засоби адміністрування, віддаленого доступу та архівування.
  2. Порівняйте ім'я файлу з його зрозумілою назвою та компанією: невідповідність може викрити перейменований інструмент або файл, що маскується під інший.
  3. Зіставляйте з Prefetch, BAM і UserAssist (коли запускалася програма), Amcache і ShimCache (хеш і наявність файлу) та $MFT (чи файл досі існує).
  4. Використовуйте parse-registry read --recover-deleted для UsrClass.dat, щоб знайти видалені значення MuiCache.

Додаткові відомості