最近在堪培拉教授SANS FOR500 Windows取证分析课程时,我被问到一个问题:我们如何在注册表中追踪USB设备的连接时间?
当时我的回答是“它们是任意的”,但我觉得应该更深入地研究一下,而我也确实这么做了,并且很高兴我这样做了!这也是一个很久以前就被讨论过的话题,但我自己从未真正深入研究过。
深入挖掘
如果你进入注册表,在USB注册表键下,你会发现一系列GUID及其子键,其中包含十六进制字符:
![USB注册表键示例]
对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存储介质在这两个值之间存在差异。注册表资源管理器中的USB插件会并排显示这两个时间戳,以便你进行比较。