UserAssist¶
什麼是 UserAssist¶
Windows Explorer 會計算使用者從 Explorer 殼層啟動的程式與捷徑:「開始」功能表、工作列、
桌面,以及在資料夾中按兩下。它將這些計數保存在使用者的 NTUSER.DAT 中。每個項目具有:
- 執行次數;
- 在 Windows 7 及之後的版本中,取得焦點的次數與時間長度(以毫秒計);
- 最後一次執行的時間。
值名稱以 ROT13 編碼。程式名稱通常以已知資料夾的 GUID 開頭
({1AC14E77-…} 即 System32)。
UserAssist 顯示特定使用者以互動方式啟動了什麼,而大多數其他執行證據並不會將執行歸屬到某位使用者。
最佳結論:使用者曾透過 Explorer 啟動此程式或捷徑, 共計此次數,最後一次在此時間。以其他方式(命令列、服務、排程工作、其他程式)啟動的程式不會被計入。
位置¶
C:\Users\<user>\NTUSER.DAT
Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count
| GUID | 保存的內容 |
|---|---|
{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA} |
程式(executable),Windows 7 及之後版本 |
{F4E57C4B-2036-45F0-A9AB-443BCFE33D9F} |
捷徑(shortcut),Windows 7 及之後版本 |
{75048700-EF1F-11D0-9888-006097DEACF9} |
程式與捷徑(active_desktop),Windows 2000 至 Vista |
{5E6AB780-7743-11CF-A12B-00AA004AE837} |
網際網路工具列(internet_toolbar),Windows 2000 至 Vista |
其他 GUID 會回報為 other。請收集每個設定檔的 NTUSER.DAT 及其交易記錄檔,以及提供使用者
SID 的系統 SOFTWARE 登錄區。
分析注意事項¶
- 新設定檔會被預先植入項目。 在 Windows 7 及之後的版本中,新設定檔一開始就有預設項目 (Getting Started、小算盤、小畫家、便利貼……)。它們的執行次數從 14 開始遞減,且全部共用同一個 最後執行時間,大約在設定檔建立的時候。它們並非使用者活動。
- 版本 3 從 5 開始計數(Windows 2000 至 Vista)。所儲存的計數從 5 開始,因此會從中減去 5。
所儲存的計數小於 5 時,會在
Problems中回報。 - 路徑使用已知資料夾的預設路徑(
%windir%\system32、%ProgramFiles%、%APPDATA%\…)。被重新導向至其他位置的資料夾仍會顯示其預設路徑。應用程式 ID (Microsoft.Windows.Explorer、Microsoft.WindowsNotepad_8wekyb3d8bbwe!App)與控制台 項目(::{…})沒有路徑。 - 追蹤功能可以被關閉,方法是
Explorer\AdvancedStart_TrackProgs= 0、Policies\ExplorerNoInstrumentation= 1,或UserAssist\SettingsNoLog= 1。摘要會 列出追蹤功能已關閉的登錄區。在活躍的設定檔上,空白或缺少的 UserAssist 可能代表反鑑識行為。 NoEncrypt= 1 會讓 Windows 不經 ROT13 寫入名稱。這類名稱會被錯誤解碼,因此該登錄區的 每個項目都會在Problems中註明(當記錄輸出至 stdout 時,也會顯示在 stderr 上)。- 最後執行時間與計數是依項目保存的,但機碼的最後寫入時間(
KeyLastWrittenUTC)只是任一項目 最近一次更新的時間。 - 對於只取得過焦點的項目,執行次數可能為 0。焦點次數與時間只存在於版本 5(Windows 7 及之後版本)。
使用 Juntei 剖析¶
Usage: juntei parse-registry user-assist <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find NTUSER.DAT hives
-f, --file <FILE> Parse one 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 user-assist -d evidence/ -o userassist.csv
juntei parse-registry user-assist -f NTUSER.DAT -t jsonl \
| jq 'select(.Path? // "" | test("\\\\(Users|ProgramData|Temp)\\\\"; "i"))'
摘要會列出最後執行的項目(由新到舊)及其使用者,以及 UserAssist 已關閉的登錄區。
輸出欄位¶
| 欄位 | 判讀 |
|---|---|
Host、User、UserSID、SourcePath |
主機、設定檔資料夾的名稱、取自系統 ProfileList 的使用者 SID(需有系統的 SOFTWARE 登錄區),以及登錄區。 |
GUID、Kind |
{GUID} 機碼及其保存的內容(executable、shortcut、active_desktop、internet_toolbar、other)。 |
NameRot13、Name |
所儲存的值名稱,以及解碼後的名稱。 |
Path |
以路徑表示的解碼名稱,已知資料夾的 GUID 已替換為其預設路徑;應用程式 ID 與 Shell 項目則為空。 |
RunCount |
從 Explorer 啟動的次數(版本 3:所儲存的計數減 5)。 |
FocusCount、FocusTimeMs |
取得焦點的次數,以及以毫秒計的時間長度(版本 5)。 |
LastRunUTC |
最後一次啟動的時間。Windows 儲存為 0 時,或所儲存的時間超過 9999 年時為空(此時 Problems 會提供該值,DataRaw 會保留其位元組)。 |
Format、SessionID |
資料的配置(5:72 位元組,3:16 位元組),以及最後一次寫入時的工作階段編號。 |
KeyLastWrittenUTC |
Count 機碼的最後寫入時間:其任一項目最近一次更新的時間。 |
DataRaw |
無法解碼時,該值的位元組(十六進位)。 |
TransactionLogStatus、LogsApplied |
登錄復原脈絡。 |
Problems |
大小未知的資料、與機碼 Version 不符的大小、小於 5 的版本 3 計數、超過 9999 年的最後執行時間、NoEncrypt。 |
調查策略¶
- 依
LastRunUTC排序,並將預先植入的項目排除:它們共用同一個時間,大約在設定檔建立的時候。 - 尋找位於使用者可寫入位置(
%USERPROFILE%、Downloads、Temp、ProgramData)、卸除式磁碟機與網路路徑上的程式,以及系統管理與遠端存取工具。 - 與 Prefetch(含執行時間的執行紀錄)、Amcache 與 ShimCache(存在跡證)、
Jump Lists 與 LNK 檔案(以它們開啟了什麼),以及程式檔案的
$MFT進行關聯分析。 - 檢查追蹤功能已關閉的登錄區,以及 UserAssist 為空的設定檔,確認是否遭到清除。
- 使用
parse-registry read --recover-deleted找出已刪除的 UserAssist 值。