MuiCache¶
Apa itu MuiCache¶
Ketika pengguna menjalankan sebuah program, Windows membaca version resource program tersebut untuk mendapatkan nama yang
harus ditampilkan shell (FileDescription, misalnya "Windows Command Processor" untuk
cmd.exe) dan menyimpannya dalam cache per pengguna di MuiCache. Windows 8 dan yang lebih baru juga menyimpan nama perusahaan
(CompanyName). Cache ini diberi kunci berdasarkan path lengkap program:
- Windows 8 dan yang lebih baru: dua nilai per program,
<path>.FriendlyAppNamedan<path>.AppCompany. - Windows Vista dan 7: satu nilai per program,
<path>, yang berisi nama ramah (friendly name). - Windows XP: bentuk yang sama, di
NTUSER.DAT.
MuiCache dapat memberikan petunjuk eksekusi program untuk sesi shell seorang pengguna, termasuk program di drive lepas pasang, network share, dan folder yang sudah tidak ada lagi, beserta nama dan perusahaan yang diberikan oleh berkas itu sendiri.
Kesimpulan terbaik: profil shell ini menyimpan path, deskripsi, dan perusahaan sebuah berkas dalam cache. Korelasikan dengan artefak eksekusi lainnya. Profil tersebut tidak mengidentifikasi akun yang digunakan untuk menjalankan proses. MuiCache tidak memiliki waktu per program dan tidak memiliki hitungan eksekusi.
Lokasi¶
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 (bahasa string yang di-cache) bukan program dan tidak disertakan. Nilai bernama
@<file>,-<number> (@shell32.dll,-22019) adalah resource string yang di-cache shell untuk menu
dan tipe berkasnya sendiri, bukan program; nilai ini tidak disertakan dan dihitung dalam ringkasan. Pada Windows Vista
dan yang lebih baru, NTUSER.DAT tidak memiliki MuiCache.
Kumpulkan UsrClass.dat (dan NTUSER.DAT) beserta log transaksinya untuk setiap profil, serta hive
SYSTEM dan SOFTWARE sistem untuk nama host dan nama pengguna.
Peringatan bagi analis¶
- Pemilik profil belum tentu akun proses. Program yang dijalankan dengan akun
lain dapat menampilkan jendela di sesi pengguna ini dan meninggalkan metadata di cache pengguna ini.
UserdanUserSidmengidentifikasi pemilik hive, bukan konteks keamanan proses. - Tidak ada waktu per program.
KeyLastWrittenUTCadalah last write kunci: perubahan terbaru pada salah satu programnya, bukan waktu program tertentu dijalankan. Prefetch, BAM, UserAssist, dan log peristiwa memberikan waktu. - Tidak hanya program yang dijalankan pengguna secara manual. DLL atau program yang dimuat oleh shell itu sendiri (untuk
Open with, shell extension, child dari installer) dapat muncul, sepertiexplorerframe.dllataushell32.dll. - Nama berasal dari berkas.
FriendlyAppNamedanAppCompanyadalah apa yang dinyatakan oleh version resource berkas saat dijalankan. Malware dapat mengklaim deskripsi dan perusahaan apa pun; alat yang diganti namanya tetap mempertahankan deskripsi aslinya, yang dapat mengungkapkannya (berkas bernamasvchost.exeyang friendly name-nya adalah alat akses jarak jauh). - Satu entri per path. Menjalankan program yang sama lagi tidak menambah entri; salinan di path lain akan menambah entri. Entri sebuah program dapat tetap ada setelah berkasnya dihapus.
- Kedua bentuk untuk satu path. Bila sebuah path memiliki friendly name dalam kedua bentuk (profil yang di-upgrade), masing-masing mendapatkan catatannya sendiri, sehingga tidak ada nilai yang hilang.
- Nilai yang rusak. Nilai yang bukan string, bukan UTF-16 yang valid, atau tidak dapat dibaca utuh tetap mempertahankan
byte-nya (
FriendlyAppNameRaw,AppCompanyRaw) dan dilaporkan diProblems. UTF-16 yang tidak valid juga dapat menghasilkan karakter pengganti pada teks yang ditampilkan; gunakan kolom mentah untuk byte aslinya.
Mengurai dengan 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"))'
Ringkasan mencantumkan program di luar folder Windows dan Program Files (folder pengguna,
drive lain, network share) beserta penggunanya, dan jumlah resource string yang tidak disertakan.
Folder Program Files dengan nama lain (pada Windows dalam bahasa lain) juga dicantumkan.
Path relatif dan path yang keluar dari folder environment variable tetap dicantumkan. Path drive
biasa diperiksa setelah meresolusi komponen . dan .. tanpa mengakses sistem berkas
milik pemeriksa.
Field keluaran¶
| Field | Interpretasi |
|---|---|
Host, User, UserSID, SourcePath |
Host, nama folder profil, SID pengguna (disebutkan oleh root key UsrClass.dat; jika tidak, dari ProfileList sistem), dan hive. |
HiveType |
UsrClass.dat atau NTUSER.DAT. |
Path |
Path program: nama nilai tanpa .FriendlyAppName atau .AppCompany. |
FriendlyAppName |
Deskripsi program, dari <path>.FriendlyAppName atau <path>. |
AppCompany |
Perusahaan program, dari <path>.AppCompany (Windows 8 dan yang lebih baru). |
KeyPath, KeyLastWrittenUTC |
Kunci MuiCache, dan last write-nya: perubahan terbaru pada salah satu programnya. |
FriendlyAppNameRaw, AppCompanyRaw |
Byte nilai (hex), bila byte tersebut bukan teks yang dapat didekode dengan bersih. |
TransactionLogStatus, LogsApplied |
Konteks pemulihan registry: replayed bila log menulis salah satu nilai program tersebut. |
Problems |
Nilai yang bukan string, bukan UTF-16 yang valid, atau tidak dapat dibaca. |
Strategi investigasi¶
- Perhatikan program di lokasi yang dapat ditulisi pengguna (
\Users\,Downloads,Temp,ProgramData), di drive lain dan di network share, serta alat administrasi, akses jarak jauh, dan pengarsipan. - Bandingkan nama berkas dengan friendly name dan perusahaannya: ketidakcocokan dapat mengungkap alat yang diganti namanya atau berkas yang menyamar.
- Korelasikan dengan Prefetch, BAM, dan UserAssist (kapan program dijalankan), Amcache dan ShimCache (hash
dan keberadaan berkas), serta
$MFT(apakah berkas masih ada). - Gunakan
parse-registry read --recover-deletedpadaUsrClass.datuntuk nilai MuiCache yang terhapus.