深入解析UserAssist取证工件:结构解析与取证应用
引言
作为全球应急响应团队(GERT)成员,UserAssist是我们日常调查中至关重要的取证工件。该注册表项记录GUI程序执行信息,但现有研究存在数据解读、日志触发条件等知识空白。本文通过逆向分析shell32.dll组件,首次完整揭示其工作机制。
UserAssist工件回顾
该工件位于注册表路径Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\
下,核心GUID子项包括:
{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}
:记录EXE执行{F4E57C4B-2036-45F0-A9AB-443BCFE33D9F}
:记录LNK文件
每个子项的"Count"键包含ROT-13加密的程序路径值,其二进制数据结构(CUACount对象)包含:
- 执行次数(Run Count)
- 焦点次数(Focus Count)
- 焦点时间(Focus Time)
- 最后执行时间(Last Execution Time)
数据不一致性分析
通过逆向shell32.dll发现,CUserAssist::FireEvent函数是更新数据的核心,其第二个参数决定更新类型:
参数值 | 更新内容 |
---|---|
0 | 执行次数和最后执行时间 |
1 | 焦点次数 |
2 | 焦点时间 |
我们观察到五种数据组合模式:
- 完整数据:GUI程序通过双击执行并正常关闭
- 仅执行记录:双击启动但焦点转移至其他程序
- 仅焦点数据:通过非资源管理器方式启动的GUI程序
- 执行记录+焦点时间:双击后立即关闭的CLI程序
- 仅焦点时间:通过子进程方式执行的CLI程序
UEME_CTLSESSION机制
该1612字节的二进制值包含全局会话统计:
- 0x00偏移:会话ID、总启动次数、总焦点切换次数、总使用时间
- 0x10偏移:三个NMax条目(各532字节),分别记录:
- 执行最频繁的程序
- 焦点切换最频繁的程序
- N值最高的程序(N值=执行次数×(总时间/总启动) + 焦点时间 + 焦点次数×(总时间/总切换))
新增r0值解析
程序UserAssist数据中0x10-0x37偏移处新发现10个r0值(浮点数),计算公式:
r0[Index] = 程序N值 / 当前会话最高N值
该列表记录程序在过去10个会话中的相对使用频率,取证价值包括:
- 持续高r0值:用户常用程序
- 持续低r0值:可能被弃用的可疑程序
- -1值:新安装程序
重置机制
当累计焦点时间达48小时,系统会:
- 递增UEME_CTLSESSION会话ID
- 重置大多数统计值(保留最后执行时间)
- 将当前r0值存入列表并重置计数器
新型解析工具
基于研究成果开发的新版解析器可输出:
- UEME_CTLSESSION的JSON结构化数据
- 含r0值列表的CSV格式报告
结论
本研究首次完整揭示UserAssist工件的工作机制,特别是:
- 数据不一致性与FireEvent触发场景的对应关系
- UEME_CTLSESSION的会话管理机制
- r0值列表的取证应用价值
这些发现为事件响应提供了新的调查维度。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码