深入解析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 焦点时间

我们观察到五种数据组合模式:

  1. 完整数据:GUI程序通过双击执行并正常关闭
  2. 仅执行记录:双击启动但焦点转移至其他程序
  3. 仅焦点数据:通过非资源管理器方式启动的GUI程序
  4. 执行记录+焦点时间:双击后立即关闭的CLI程序
  5. 仅焦点时间:通过子进程方式执行的CLI程序

UEME_CTLSESSION机制

该1612字节的二进制值包含全局会话统计:

  • 0x00偏移:会话ID、总启动次数、总焦点切换次数、总使用时间
  • 0x10偏移:三个NMax条目(各532字节),分别记录:
    1. 执行最频繁的程序
    2. 焦点切换最频繁的程序
    3. N值最高的程序(N值=执行次数×(总时间/总启动) + 焦点时间 + 焦点次数×(总时间/总切换))

新增r0值解析

程序UserAssist数据中0x10-0x37偏移处新发现10个r0值(浮点数),计算公式:

r0[Index] = 程序N值 / 当前会话最高N值

该列表记录程序在过去10个会话中的相对使用频率,取证价值包括:

  • 持续高r0值:用户常用程序
  • 持续低r0值:可能被弃用的可疑程序
  • -1值:新安装程序

重置机制

当累计焦点时间达48小时,系统会:

  1. 递增UEME_CTLSESSION会话ID
  2. 重置大多数统计值(保留最后执行时间)
  3. 将当前r0值存入列表并重置计数器

新型解析工具

基于研究成果开发的新版解析器可输出:

  • UEME_CTLSESSION的JSON结构化数据
  • 含r0值列表的CSV格式报告

结论

本研究首次完整揭示UserAssist工件的工作机制,特别是:

  1. 数据不一致性与FireEvent触发场景的对应关系
  2. UEME_CTLSESSION的会话管理机制
  3. r0值列表的取证应用价值
    这些发现为事件响应提供了新的调查维度。
    更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
    公众号二维码
posted @ 2025-07-31 14:01  qife  阅读(11)  评论(0)    收藏  举报