A question about arbitrary values in USB registry keys
我最近在堪培拉教授SANS FOR500 Windows取证分析课程时,被问到一个关于我们如何在注册表中追踪USB设备连接时间的问题。
我当时的回答是:“它们是任意的”,但我觉得我应该更深入地研究一下,而且我很高兴这么做了!这也是很久以前就被讨论过的话题,但我自己并没有真正深入研究过。
深入挖掘!
如果你进入注册表,在USB注册表键下,你可以找到一系列GUID,它们的子键包含十六进制字符。
对GUID进行一些搜索后,我找到了一个有趣的文件,我没想到它一直包含在Windows SDK中分发。我也意识到,如果我想弄清某个事物的细节,应该更经常地查看Windows SDK。
走进 devpkey.h
有一个名为 devpkey.h 的文件,在微软关于驱动程序安装的Learn文档中被引用,你可以在其中找到关于 FirstInstallDate 和 InstallDate 的规则(但我找不到关于另外两个的更多文档)。经过一番谷歌搜索后,我在一些GIST和GitHub仓库(与WINE相关)中找到了该文件,但随后意识到我实际上可以在Windows SDK中找到它。
之后就是搜索键名并找到对其命名空间和属性ID的清晰引用。这里可能不明显的是,命名空间是用逗号而不是破折号引用的,并且InstallDate、FirstInstallDate、LastArrivalDate和LastRemovalDate的键名是以十进制(100-103)引用的,而不是像注册表中那样是十六进制(0x64-0x67)。
有趣的是,Properties键下的其他一些子键并没有记录在该文件中,但至少我对于为什么这些十六进制值会出现在那里有了答案。
另一个需要注意的点
我们通常教人们取0x64作为首次安装时间。99.999%的情况下,这与0x65(即USB存储介质的实际FirstInstallDate值)是相同的。对于其他设备类型,这可能不成立,但在一次快速调查中,没有人见过USB存储介质的这两个值之间存在差异。Registry Explorer中的USB插件会将两个时间戳并排显示,以便你进行比较。