UserAssist工件回顾
UserAssist是Windows中用于记录GUI程序执行的知名取证工件,存储以下关键数据:
- 程序名称:完整程序路径
- 运行次数:程序执行次数
- 焦点次数:程序被置为焦点的次数
- 焦点时间:程序处于焦点状态的总时间
- 最后执行时间:最后一次执行的时间戳
该工件位于每个NTUSER.DAT注册表配置单元的Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\
路径下,包含以GUID命名的子键,其中最重要的两个GUID为:
{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}
:记录执行的EXE文件{F4E57C4B-2036-45F0-A9AB-443BCFE33D9F}
:记录执行的LNK文件
每个子键包含名为"Count"的子键,其值使用ROT-13密码加密程序路径,值数据为包含运行次数、焦点次数、焦点时间和最后执行时间的结构化二进制数据(CUACount对象)。
数据不一致性分析
在实际调查中发现UserAssist数据存在五种组合模式:
案例 | 运行次数 | 焦点次数 | 焦点时间 | 最后执行时间 |
---|---|---|---|---|
1 | ✓ | ✓ | ✓ | ✓ |
2 | ✓ | ✕ | ✕ | ✓ |
3 | ✕ | ✓ | ✓ | ✕ |
4 | ✓ | ✕ | ✓ | ✓ |
5 | ✕ | ✕ | ✓ | ✕ |
工作流分析
Shell32函数深度解析
UserAssist数据更新由shell32.dll中的CUserAssist::FireEvent
函数负责,该函数参数包括:
- GUID:指定UserAssist注册表子键
- 枚举值:定义更新的计数器类型
- 0:更新运行次数和最后执行时间
- 1:更新焦点次数
- 2:更新焦点时间
- 3:未知
- 4:未知(可能用于删除条目)
- 可执行文件完整路径
- 焦点时间(毫秒,仅当参数2为2时有效)
该函数依赖s_Read
和s_Write
函数进行注册表读写操作。
UserAssist数据更新工作流
程序交互触发四种事件类型:
- 程序执行
- 程序获得焦点
- 程序失去焦点
- 程序关闭
不同事件调用不同的函数调用栈,导致数据记录差异。
不一致性详细分析
1. 完整数据
GUI程序通过双击正常执行并关闭,触发所有四种事件类型。
2. 仅运行次数和最后执行时间
GUI程序通过双击执行,但焦点切换到其他程序(如通过LNK快捷方式启动)。
3. 仅焦点次数和焦点时间
GUI程序通过非双击方式执行(如命令行)。
4. 运行次数、最后执行时间和焦点时间
CLI程序通过双击执行后立即关闭。
5. 仅焦点时间
CLI程序通过非双击方式执行,生成conhost.exe进程后立即关闭。
CUASession和UEME_CTLSESSION
UEME_CTLSESSION值包含CUASession类的统计信息,数据结构为:
- 0x0偏移:总会话统计(16字节)
- 会话ID(4字节)
- 总启动次数(4字节)
- 总切换次数(4字节)
- 总用户时间(4字节)
- 0x10偏移:三个NMax条目(1596字节)
NMax条目
每个NMax条目结构:
- 程序运行次数(4字节)
- 程序焦点次数(4字节)
- 程序焦点时间(4字节)
- 程序名称/完整路径(Unicode,520字节)
NMax条目跟踪最常使用、最常切换和最高N值的程序。
UserAssist重置
当总用户时间达到2天阈值时,UserAssist数据(包括UEME_CTLSESSION)会被重置,会话ID递增。
使用百分比和计数器
UserAssist二进制数据修订结构:
- 0x0:会话ID(4字节)
- 0x4:运行次数(4字节)
- 0x8:焦点次数(4字节)
- 0xC:焦点时间(4字节)
- 0x10-0x34:使用百分比列表(10个元素,各4字节)
- 0x38:使用百分比列表最后写入索引(4字节)
- 0x3C:最后执行时间(8字节)
- 0x44:未知值(4字节)
使用百分比(r0值)计算公式: r0值[索引] = 程序的N值 / 会话中最常用程序的N值
取证价值
r0值提供宝贵的用户程序使用信息:
- 多个1值:用户最常使用的程序
- 多个0值:用户最少使用或放弃的程序
- 多个-1值:新程序,数据未在2天内重置
UserAssist数据模板
新程序首次执行时使用UEME_CTLCUACount:ctor值作为模板创建UserAssist条目。
新解析器
基于本研究发现开发了新解析器,可解析UEME_CTLSESSION值为JSON文件,解析UserAssist数据为CSV文件。
结论
UserAssist工件是事件响应活动的宝贵工具,本研究揭示了其数据结构、不一致性原因及UEME_CTLSESSION值的作用,有助于最大化利用其包含的数据。