深入解析UserAssist:Windows取证中的关键工件结构与应用

本文详细分析了Windows UserAssist工件的内部结构、数据不一致性原因及取证价值,涵盖FireEvent函数工作机制、UEME_CTLSESSION会话管理以及新发现的r0值用法百分比列表,为事件响应提供关键技术洞察。

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函数负责,该函数参数包括:

  1. GUID:指定UserAssist注册表子键
  2. 枚举值:定义更新的计数器类型
    • 0:更新运行次数和最后执行时间
    • 1:更新焦点次数
    • 2:更新焦点时间
    • 3:未知
    • 4:未知(可能用于删除条目)
  3. 可执行文件完整路径
  4. 焦点时间(毫秒,仅当参数2为2时有效)

该函数依赖s_Reads_Write函数进行注册表读写操作。

UserAssist数据更新工作流

程序交互触发四种事件类型:

  1. 程序执行
  2. 程序获得焦点
  3. 程序失去焦点
  4. 程序关闭

不同事件调用不同的函数调用栈,导致数据记录差异。

不一致性详细分析

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值的作用,有助于最大化利用其包含的数据。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计