简介这是一款面向Windows系统安全分析与数字取证初学者的本地化痕迹检测工具适用于IT运维人员、网络安全爱好者及计算机取证入门学习者用于快速梳理个人设备近期使用行为轨迹。资源包共39个文件含5个核心可执行程序如RegistryFinder.exe、查看器.exe、4个功能批处理脚本如ContextMenu-Add.bat、17个界面图标资源ico/svg及配置类文件config、ini、xml等整体体积仅4.5MB轻量便携无需安装即可运行。已有1660人下载学习全部功能基于本地注册表读取实现不联网、不上传、不修改系统保障隐私安全。用户可直接获取完整的痕迹分析能力包括数月乃至数年内的目录/文件访问记录、开始菜单关键词搜索历史、USB设备接入日志并附带配套说明文档!readme.txt、资源管理器上下文菜单集成方案及崩溃报告支持模块开箱即用结构清晰便于理解Windows痕迹留存机制与取证逻辑。1. Windows使用痕迹检测工具不是“监控软件”而是系统行为考古学的实操入口你刚接手一台二手办公机想确认前任是否删过敏感文件、改过系统时间、连过陌生WiFi或是某次蓝屏后需要回溯崩溃前30分钟所有进程启动链又或者在做合规审计时得证明某台终端从未安装过非授权远程控制类程序——这时候靠手动翻“最近使用的文档”或查“事件查看器”里密密麻麻的日志效率低、漏点多、还容易被刻意清理。而这份 Windows 使用痕迹检测工具本质是一套基于系统底层持久化机制的行为取证框架它不依赖杀软白名单、不走常规API调用路径而是直接解析注册表 hive、NTFS $MFT 元数据、Prefetch 文件、JumpList 缓存、ShellBags 二进制结构、以及 Windows 10/11 新增的 Timeline 数据库。它能还原出“谁在什么时间、用什么方式、打开了哪个文件、连了哪台设备、执行了哪条命令”甚至能识别出已被删除但未覆写的痕迹残留。适合一线运维、内部审计人员、数字取证初学者以及需要做终端行为基线建模的开发同学。它不是黑匣子所有解析逻辑开源可验也不是“一键报警”型产品你需要理解每条痕迹背后的操作语义——这恰恰是它比商业EDR轻量却更可控的关键。2. 工具架构与核心模块为什么选本地解析而非日志转发这套工具的设计哲学很明确不引入新代理、不依赖网络回传、不修改系统服务状态。它把 Windows 自身留下的“数字指纹”当作原始证据源通过离线解析完成行为重建。这种思路在断网环境、高敏终端、或需规避EDR Hook干扰的场景下反而成了不可替代的优势。下面拆解它的四个主干模块及其技术选型依据。2.1 注册表痕迹提取模块聚焦 UserAssist、TypedPaths、RecentDocs 等关键键值Windows 用户交互行为大量沉淀在注册表中但并非所有键都值得深挖。本工具只抓取三类高价值、低误报、难彻底清除的注册表项HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist记录所有通过资源管理器、开始菜单、任务栏启动的GUI程序含执行次数、最后运行时间即使程序已卸载其GUID仍保留在该键下HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\TypedPaths保存用户在地址栏手动输入过的所有路径包括UNC路径和本地磁盘路径是发现非常规访问行为的关键线索HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs按文件类型分组存储最近打开文档的完整路径时间戳支持解析.lnk快捷方式指向的真实目标。提示UserAssist 的值是ROT13加密Base64编码的二进制数据且不同Windows版本Win7/Win10/Win11的结构略有差异。本工具内置多版本解码器自动识别当前系统版本并选择对应解析逻辑避免因版本错配导致时间戳全为1601年1月1日的“玄学翻车”。2.2 文件系统元数据解析模块绕过回收站直读 $MFT 与 $LogFile很多用户以为清空回收站就等于物理删除其实NTFS文件系统会保留大量元数据。本模块不调用GetFileAttributes等高层API而是直接读取卷的主文件表$MFT和日志文件$LogFile从中提取文件创建、修改、访问、MFT修改四类时间戳MACB时间文件大小、父目录索引号、是否被标记为“已删除”即$MFT中记录的InUse标志位为0若文件曾被硬链接或符号链接引用还能还原其原始路径别名。实际操作中我们用Python调用pytsk3库封装了Sleuth Kit底层C代码实现裸设备读取import pytsk3 def parse_mft_from_volume(drive_letter: str) - list: try: img pytsk3.Img_Info(f\\\\.\\{drive_letter}:) fs pytsk3.FS_Info(img) mft fs.open_dir(/$MFT) # 遍历MFT中每个记录过滤出已删除但未覆写的条目 deleted_entries [] for entry in mft: if not entry.info.meta.flags pytsk3.TSK_FS_META_FLAG_ALLOC: # 提取文件名、时间戳、父目录ID name_attr entry.info.name if name_attr: deleted_entries.append({ filename: name_attr.name, created: entry.info.meta.crtime, modified: entry.info.meta.mtime, parent_id: entry.info.meta.parent_id }) return deleted_entries except Exception as e: print(f[ERROR] Failed to read $MFT from {drive_letter}: {e}) return []这段代码的关键在于pytsk3.TSK_FS_META_FLAG_ALLOC判断是否为已分配节点entry.info.meta.flags是原始位标志比Windows API返回的FILE_ATTRIBUTE_ARCHIVE等属性更底层、更真实。若你遇到权限拒绝错误请确保脚本以管理员身份运行并关闭Windows Defender实时保护它会拦截对$MFT的直接读取。2.3 Prefetch与ShellBags解析模块还原图形界面操作链Prefetch文件.pf是Windows为加速程序启动而生成的缓存但它同时记录了程序完整路径含参数、首次/最后执行时间加载的DLL列表可用于识别注入行为启动时的父进程PID可向上追溯到explorer.exe或cmd.exe。ShellBags则更隐蔽它保存了用户在资源管理器中展开过哪些文件夹、排序方式、视图模式、窗口大小甚至包括已删除U盘的卷标和序列号。这些数据藏在注册表NTUSER.DAT的BagMRU和Bags子键中是二进制格式无官方文档。本工具采用逆向分析得出的结构体定义进行解析字段名类型说明SignatureDWORD固定为0x00000001用于校验有效性VersionDWORD当前为0x00000005Win10 RS5起FolderPathOffsetDWORD相对于结构体起始位置的偏移量指向UTF-16路径字符串LastAccessTimeFILETIME该文件夹最后一次被用户点击展开的时间解析时必须严格按字节偏移读取任何一字节错位都会导致整个路径乱码。这也是为什么很多开源项目解析ShellBags失败——它们试图用字符串查找代替精确偏移计算。2.4 Timeline与ActivityCache数据库解析模块适配Win10/11新行为模型从Windows 10 1803开始系统引入了ActivitiesCache.dbSQLite数据库存储用户跨设备活动如Edge浏览页、Office文档编辑、邮件草稿。它位于%LocalAppData%\ConnectedDevicesPlatform\SID\ActivitiesCache.db。本模块直接连接该数据库查询activity表中的payload字段JSON格式提取activityType: “Document” / “Website” / “Email”displayText: 用户看到的标题如“合同终稿_v2.docx”activationUri: 可直接跳转的URI如ms-word:ofe|u|https://xxx/contract.docxactiveDurationSeconds: 实际编辑时长判断是否真正在用而非仅打开。注意该数据库受Windows账户SID绑定不能直接复制到另一台机器解析且若用户禁用了“跨设备同步”此库将为空。因此工具在启动时会先检查该库是否存在且可读不存在则跳过此模块避免误报“未发现Timeline活动”。3. 快速上手从下载到生成首份痕迹报告的六步实操本工具为纯Python项目无需编译但依赖若干底层库。以下步骤经某高校实验室在32台不同配置Win10/Win11机器上实测通过平均耗时4分17秒SSD盘i5-8250U16GB内存。3.1 环境准备仅需Python 3.8与管理员权限工具不打包成exe原因有三一是避免UPX加壳触发杀软误报二是方便用户按需增删模块比如你只关心网络痕迹可注释掉Timeline解析三是便于调试——当某台机器解析失败时你能直接看到是哪个模块抛出异常。推荐使用Python 3.9兼容性最好安装命令如下# 创建独立虚拟环境避免污染全局pip python -m venv wintrace_env wintrace_env\Scripts\activate.bat # 安装核心依赖注意pytsk3需预编译wheel pip install --upgrade pip pip install pytsk320220718 pefile2023.2.7 python-registry1.3.1 pysqlite3-binary0.5.0注意pytsk3在Windows上安装常因缺少VC构建工具失败。若pip install pytsk3报错直接下载预编译wheel访问 https://download.lfd.uci.edu/pythonlibs/ 搜索pytsk3下载对应Python版本和CPU架构cp39-win_amd64的.whl文件再用pip install xxx.whl安装。这是血泪经验——某次现场排查因VS2019没装完整折腾两小时才搞定。3.2 下载源码与配置文件结构清晰开箱即用项目仓库结构极简无冗余文件wintrace/ ├── main.py # 主入口协调各模块执行 ├── config/ │ ├── default.yaml # 默认配置启用全部模块输出HTMLCSV │ └── audit_mode.yaml # 审计模式禁用Timeline只输出JSON供SIEM接入 ├── modules/ │ ├── registry_parser.py # 注册表解析主逻辑 │ ├── mft_reader.py # $MFT读取与解析 │ ├── prefetch_parser.py # .pf文件解析 │ └── timeline_reader.py # ActivitiesCache.db解析 ├── output/ │ └── reports/ # 运行后自动生成报告目录 └── README.md直接克隆仓库即可git clone https://github.com/xxx/wintrace.git cd wintrace无需修改任何代码所有行为由config/default.yaml控制。例如若你只想分析注册表和Prefetch跳过耗时的$MFT扫描编辑该文件modules: registry: true mft: false # 设为false prefetch: true timeline: true output: format: [html, csv] path: ./output/reports/3.3 执行扫描支持单机与批量结果自动归档最简命令扫描当前系统使用默认配置python main.py输出示例[INFO] Starting Windows usage trace analysis... [INFO] Loading config: config/default.yaml [INFO] Running Registry Parser... ✓ (127 entries) [INFO] Running Prefetch Parser... ✓ (89 files processed) [INFO] Skipping MFT Reader (disabled in config) [INFO] Running Timeline Reader... ✓ (42 activities) [INFO] Generating HTML report to ./output/reports/20240520_142311_report.html [INFO] Report generated successfully.若需扫描指定驱动器如D盘为数据盘加--drive D参数python main.py --drive D批量扫描多台机器工具支持--target-list参数读取文本文件中的IP或主机名列表需提前配置WinRM或PsExec免密echo 192.168.1.101 targets.txt echo 192.168.1.102 targets.txt python main.py --target-list targets.txt --output-dir ./batch_reports/此时工具会自动通过WMI远程执行main.py并将每台机器的报告按IP命名存入./batch_reports/。这是某公司IT部用于季度终端合规巡检的标准流程。3.4 报告解读HTML报告的三个核心视图生成的HTML报告不是简单日志堆砌而是按行为维度组织的可交互视图Timeline视图横向时间轴纵轴分组为“程序启动”、“文档打开”、“网络连接”、“USB设备接入”。鼠标悬停显示详情点击可定位到原始数据源如“该Chrome启动来自C:\Windows\Prefetch\CHROME.EXE-XXXXXX.pf”关联图谱视图以“用户账户”为中心节点向外辐射出其启动的程序、打开的文档、访问的域名、连接的设备。图中边权重发生频次帮你一眼识别高频行为模式原始数据表格视图支持按任意列排序、关键词高亮、导出为CSV。特别地“可疑度评分”列由规则引擎动态计算如程序路径含temp且签名无效 → 3分访问域名在威胁情报库中 → 5分阈值可配置。提示HTML报告内嵌了轻量级JavaScript无需联网。若你在离线环境打开报错请右键→“在Internet Explorer模式下重新加载”Win11默认禁用IE内核但报告JS兼容IE11。3.5 输出格式定制JSON供自动化对接CSV供Excel人工核查除默认HTML外工具原生支持三种输出格式通过config/default.yaml的output.format字段切换格式适用场景关键字段说明html快速人工研判、汇报演示含可视化图表、评分、跳转链接csvExcel筛选、制作台账、导入BI工具每行一条痕迹字段含source_module来源模块、timestampISO8601、action_typeopen/execute/connect、target_path目标路径json对接SIEM如Splunk/Elasticsearch、编写自动化响应剧本结构化嵌套event对象下含registry_key、prefetch_file等具体上下文timestamp字段已转为ES兼容格式例如一条Chrome启动的JSON片段{ event: { module: prefetch, action: execute, program_name: chrome.exe, full_path: C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe, command_line: \C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe\ --no-sandbox, first_run: 2024-05-19T08:22:15.123Z, last_run: 2024-05-20T14:18:44.567Z }, timestamp: 2024-05-20T14:18:44.567Z, host: {hostname: DESKTOP-ABC123} }该结构可直接用Logstash的jsoncodec摄入Elasticsearch无需额外字段映射。3.6 首次运行排错五个必查点新手首次运行失败80%集中在以下五点。请按顺序逐一验证权限不足报错PermissionError: [WinError 5] Access is denied。→ 原因pytsk3读$MFT、注册表解析需SYSTEM级权限。→ 解决右键“Windows Terminal (Admin)”或“命令提示符(管理员)”再运行python main.py。Python架构不匹配报错ImportError: DLL load failed while importing _tsk3。→ 原因32位Python尝试加载64位pytsk3库或反之。→ 解决运行python -c import platform; print(platform.architecture())确认Python位数下载对应pytsk3wheel。注册表hive损坏报错Registry.RegistryParse.ParseException: Invalid hive file。→ 原因NTUSER.DAT被其他程序占用如Explorer正加载该用户配置。→ 解决切换到另一用户账户如Administrator运行或重启进入安全模式再执行。Timeline数据库被锁报错sqlite3.OperationalError: database is locked。→ 原因Windows正写入ActivitiesCache.db如用户刚关闭Edge。→ 解决加--delay 30参数让脚本等待30秒后再读库或直接禁用Timeline模块审计场景通常不需要。输出路径无写入权报错OSError: [Errno 13] Permission denied: ./output/reports/。→ 原因当前目录为C:\Windows\System32等系统目录。→ 解决cd到有写权限的目录如C:\temp再运行。4. 避坑指南五个真实踩坑记录与根因修复这些不是理论假设而是某次客户现场交付时连续三天熬夜填的坑。每一条都附带复现方法和永久解决方案避免你重蹈覆辙。4.1 现象$MFT解析出的时间戳全是1601-01-01 00:00:00→ 原因pytsk3在读取NTFS时间戳时错误地将FILETIME结构的低32位和高32位顺序颠倒。Windows的FILETIME是100纳秒间隔的64位整数高位在前big-endian但某些pytsk3预编译版本的struct unpack逻辑写反了。→ 解决在mft_reader.py中找到parse_timestamp函数将原代码# 错误写法会导致时间归零 low, high struct.unpack(II, data[0:8])改为# 正确写法NTFS FILETIME是高位在前需用IQ high, low struct.unpack(II, data[0:8]) timestamp (high 32) | low并添加校验若timestamp 1164447360000000001601年1月1日UTC的100纳秒值则视为解析失败跳过该记录。4.2 现象UserAssist中出现大量{CEBFF5CD-810F-413A-B6EC-F885102FA9AB}这类GUID无法对应程序名→ 原因Windows 10 1809启用了“应用容器隔离”部分UWP应用如Mail、Photos的启动记录不再写入明文路径而是写入其Package Family NamePFN的哈希GUID。→ 解决工具新增uwp_resolver.py模块内置常见UWP应用的PFN映射表如microsoft.windows.photos→Photos并支持从HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModel\Deployment\Packages中动态读取已安装UWP包列表实现GUID到应用名的实时反查。4.3 现象ShellBags解析出的路径包含??\C:\前缀且中文显示为乱码→ 原因??\C:\是Windows内核对象管理器的符号链接路径需转换为\\?\C:\才能被Python正常处理乱码则是UTF-16字符串未指定encodingutf-16-le导致。→ 解决在shellbags_parser.py中对读取的路径字符串强制解码# 原始二进制数据raw_path path_str raw_path.decode(utf-16-le).replace(??\\, \\\\?\\) # 再用os.path.normpath标准化 clean_path os.path.normpath(path_str)4.4 现象Timeline报告中出现activationUri: ms-appx:///无法判断具体应用→ 原因ms-appx:///是UWP应用的内部协议不指向具体功能。需结合packageId字段如Microsoft.Windows.Photos_8wekyb3d8bbwe!App才能定位。→ 解决工具在解析ActivitiesCache.db时增加对packageId字段的提取并建立映射关系8wekyb3d8bbwe→Microsoft.Windows.Photos。映射表定期从微软官方文档同步更新避免硬编码失效。4.5 现象批量扫描时某台机器报告为空日志只显示[INFO] Connected to 192.168.1.105后无后续→ 原因目标机器防火墙阻止了WMI端口TCP 135或DCom端口动态分配或WinRM未启用。→ 解决提供一键检测脚本check_remote.ps1运行后返回详细诊断Test-NetConnection 192.168.1.105 -Port 135→ 检测端口连通性Get-Service WinRM→ 检查WinRM服务状态winrs -r:http://192.168.1.105 -u:admin -p:pwd cmd /c echo test→ 测试远程命令执行。用户只需复制该脚本到目标机运行即可获知具体阻塞点。5. 进阶技巧用痕迹数据构建终端行为基线识别“异常但合法”的操作真正有价值的不是罗列所有痕迹而是从中提炼出“这个人/这台机器的日常行为模式”再标记偏离基线的操作。本工具内置轻量基线引擎无需额外部署数据库仅靠本地CSV就能实现。5.1 构建个人行为基线三步生成“你的数字指纹”基线不是静态快照而是动态统计模型。以某开发者A同学为例我们用他连续7天的扫描报告生成基线采集原始数据每天定时执行python main.py --config config/audit_mode.yaml --output-format csv生成7个CSV文件report_20240514.csv至report_20240520.csv聚合统计特征运行baseline_builder.py它会自动计算每类行为的频次分布程序启动TOP10如chrome.exe日均启动23次vscode.exe日均17次文档打开路径的目录层级深度分布如C:\Users\A\Documents\Projects\占比68%C:\Temp\占比仅2%网络连接域名的熵值高熵域名随机如a1b2c3.d4e5f6.net低熵固定域名如gitlab.internal生成基线文件输出baseline_A.json含标准差、95%置信区间等统计量。{ user: A, period: 2024-05-14 to 2024-05-20, features: { exec_chrome_count: {mean: 23.0, std: 4.2, upper_bound: 31}, doc_path_depth: {mean: 4.2, std: 0.8, lower_bound: 2.6}, domain_entropy: {mean: 2.1, std: 0.3, upper_bound: 2.7} } }5.2 实时偏差检测当“合法操作”突然变味第8天扫描后工具自动加载baseline_A.json对新报告做偏差分析。例如chrome.exe启动次数达47次超upper_bound31出现C:\Users\A\AppData\Local\Temp\update.exe路径深度5但baseline中Temp目录占比仅2%本次占38%访问域名x9y8z7.q1w2e3.net的熵值4.8超upper_bound2.7。此时报告中该条目会标红并在“可疑度评分”列显示83分来自频次异常3分来自路径异常2分来自熵异常。这不是断言“这是恶意软件”而是提示“这个操作与你过去7天的习惯显著不同请人工核查”。提示基线引擎支持“冷启动”——若无历史数据它会用当天报告的中位数作为临时基线并标注[BASELINE: FIRST_DAY]。从第二天起自动滚动更新为7日滑动窗口。5.3 导出基线为YAML供Ansible/Puppet统一部署安全团队常需将基线推送到数百台终端。工具支持将baseline_A.json转为Ansible可读的YAMLpython baseline_builder.py --input baseline_A.json --export-yaml输出baseline_A.yml--- baseline_user: A baseline_period: 2024-05-14 to 2024-05-20 exec_chrome_count_upper_bound: 31 doc_path_depth_lower_bound: 2.6 domain_entropy_upper_bound: 2.7Ansible Playbook中可直接引用- name: Deploy user As behavior baseline copy: src: baseline_A.yml dest: /etc/wintrace/baseline.yml owner: root mode: 0644这样当某台机器执行python main.py --baseline /etc/wintrace/baseline.yml时就自动启用A同学的基线策略。5.4 与现有SIEM联动用Sysmon日志补全“未登录时段”空白Sysmon能记录进程创建、网络连接等实时事件但无法覆盖用户未登录时段如系统启动时自启的服务。而本工具的痕迹检测是离线的能捕获关机前最后一刻的行为。二者互补将Sysmon日志EVTX格式用sysmon2json.py转为JSON流接入Elasticsearch将本工具的每日扫描报告JSON格式也接入同一ES索引在Kibana中创建联合仪表盘左侧显示Sysmon实时流近1小时右侧显示本工具的离线痕迹过去24小时中间用host.hostname和user.name字段关联。某次实战中正是靠这种联动发现某服务账户在凌晨3点启动了powershell.exeSysmon记录而本工具在次日扫描中还原出该PowerShell曾读取C:\Windows\Temp\cred.xml痕迹在$MFT中最终确认为凭证窃取行为——Sysmon只看到“谁启动了什么”本工具补上了“它读了什么”。从那以后我每次做终端审计都强制走一遍“Sysmon日志本工具离线扫描”双轨验证哪怕多花10分钟。因为真正的异常往往藏在两个数据源的交集里而不是单个日志的孤证中。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?