尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Hindsight开源工具:浏览器取证还原被清除的Chrome历史记录

发布时间:2026/9/29 13:57:19

资讯中心
01
ARTICLE

Hindsight开源工具:浏览器取证还原被清除的Chrome历史记录

Hindsight开源工具:浏览器取证还原被清除的Chrome历史记录
1. Hindsight是什么浏览器取证里的后见之明第一次听到Hindsight这个名字是在一次内部安全事件响应任务里。当时的场景很典型一台Windows办公主机被怀疑用来访问了某些异常站点但用户声称自己什么都没干而且浏览器历史记录已经被手动清空了。常规手段走到这里基本就卡住了——历史记录干干净净回收站空空如也IE缓存也没留下有价值的东西。但如果你知道浏览器底层的SQLite数据库长什么样就会明白清空历史这件事远没有看起来那么彻底。Hindsight这个工具就是干这个的。Hindsight是一款开源的数字取证分析工具核心功能是解析Chromium系浏览器Chrome、Edge、Brave、Chromium等在本地留下的各种痕迹数据然后以统一的时间线格式输出报告。它由安全研究员Ryan Benson开发在GitHub上以obsidianforensics/hindsight开源本质上是基于Python编写的一套浏览器数据分析引擎。它的名字本身就很有意思——hindsight后见之明。取证这件事本质上就是在事件发生之后把那些当时没人注意的碎片记录下来再从后往前把真相拼出来。这个工具适合谁用范围其实比想象中要广。安全应急响应人员可以用它在被入侵的主机上定位恶意软件访问过的C2域名企业内部审计可以用它查证员工是否在某个时间段访问过违规站点数字取证鉴定人员可以用它还原嫌疑人在特定时间段内的网络行为轨迹甚至普通用户也可以拿它做隐私自查——看看自己浏览器里到底被多少网站种下了Cookie哪些扩展在后台偷偷发过请求。它解决的核心问题只有一个把一个浏览器曾经发生过什么这件事从底层数据层面完整还原出来。和手动打开Chrome设置里的历史记录相比Hindsight做的完全是另一层面的事情。浏览器界面上能看到的只是数据库里未被删除且被UI层允许展示的那部分数据而Hindsight直接绕过UI从SQLite数据库的物理存储层面读取、解析、关联、恢复数据。这意味着即使记录被清除了只要底层存储块没有被新数据完全覆盖旧记录依然可以被挖出来。就凭这一点它和那些只能看表面历史的工具就不是一个段位。2. 核心原理拆解Chrome历史数据是怎么存的Hindsight怎么读的2.1 Chromium的SQLite存储体系要理解Hindsight为什么能挖出那么多东西首先得知道Chrome浏览器到底把数据存在哪。Chrome沿用了Linux世界一切皆文件的思路把用户的所有浏览数据都拆成一个个独立的SQLite数据库文件放在用户配置目录Profile下。以Windows系统为例核心数据目录在C:\Users\用户名\AppData\Local\Google\Chrome\User Data\Default\。这里面最值得关注的文件就几个文件存的是什么对取证的价值History浏览过的URL、访问时间、访问来源、下载记录、搜索关键词极高是核心分析对象Cookies所有站点种下的Cookie含加密后的内容高还原登录会话和跟踪行为Login Data保存的账号密码加密存储高但通常需要额外解密Bookmark书签和收藏夹JSON格式中能反映用户主动保存的行为Web Data自动填充表单数据、支付信息等中高Top Sites新标签页的常用站点缩略图记录低但可作为辅助佐证Favicon站点图标缓存低可作为访问过的旁证其中History文件是整个取证分析的核心。它内部包含几十张表最关键的是这几张urls表记录每个URL的完整地址、标题、总访问次数、首次/最后访问时间以及一个特别关键的字段typed_count——它表示这个URL是不是用户亲手在地址栏里输入的。这个字段在区分用户主动访问和程序自动跳转时非常有用。visits表记录每一次具体的访问事件每条记录包含访问时间、来源URL的visit_id、以及transition类型。transition类型标记了这次访问是直接在地址栏输入的、是从搜索页面跳转的、还是页面自动加载的也就是链接来源。visit_source表标记这条访问记录是本地产生还是从其他设备同步过来的。downloads表记录下载文件的URL、保存路径、文件大小、下载时间。keyword_search_terms表记录搜索引擎中的搜索关键词这是我个人最看重的一张表因为它能直接反映用户的意图。Hindsight做的事本质上就是把这几张表按时间和行为逻辑关联起来把什么时间、什么人、在什么页面上、输入了什么词、跳转到了哪个URL、下载了什么文件这条完整的行为链还原出来。2.2 时间戳的秘密为什么时间会差8个小时很多人第一次用Hindsight时会对时间字段感到困惑。Chrome的SQLite数据库里存的并不是常规的Unix时间戳而是一种叫做Windows FILETIME的格式从1601年1月1日UTC零时起算的微秒数。这里有个坑——Unix时间戳是从1970年1月1日起算的秒数两者起点差了11644473600秒。而且Chrome用的是微秒精度换算公式是这样unix_timestamp (filetime_in_microseconds / 1000000) - 11644473600这个换算本身不难难的是时区判定。很多采集工具直接把数据库里的时间当成系统本地时间展示但Chrome存的一律是UTC时间。如果你在UTC8的时区不做时区转换就直接看所有事件时间都会差8个小时。更麻烦的是取证时拿到的系统休眠镜像里系统本身记录的时区信息不一定可靠。所以Hindsight在输出时专门提供了时区指定参数这在我看来是它做得最贴心的设计之一——时间在取证里是定案的关键差一个数字结论就完全不一样。2.3 已删除记录为什么还能恢复回到开头那个场景浏览器历史被清除了为什么还能恢复这就要说到SQLite的存储机制了。SQLite在删除数据时并不会立刻把数据物理抹掉。它只是把那块存储区域标记为空闲放进一个叫freelist的空闲链表中等后续有新的数据写入时才可能覆盖它。关键在于如果用户清除了历史记录之后浏览器没有产生大量新的写入操作那些旧记录就依然物理存在于数据库文件里只是被标记为已删除而已。还有一个容易被忽略的点SQLite的WALWrite-Ahead Logging机制。Chrome默认开启WAL模式写入数据先追加到History-wal文件里等合适时机才合并回主数据库文件。如果取证时只复制了主文件而漏掉了-wal文件不仅会丢失最近一段时间的新记录还可能错过一些旧记录的残留副本。我在实际任务中见过好几次这种情况主库文件里空空如也但WAL文件里还藏着几万条访问记录。Chrome自带的清除浏览数据功能本质上就是对相关表执行DELETE操作。理解了SQLite的删除机制就知道——只要数据没被覆盖清除历史这四个字其实是打个折扣的。VACUUM操作才会真正挤压数据库并覆盖空闲页但浏览器不会闲着没事自动执行VACUUM所以在日常使用节奏下恢复的成功率其实相当高。2.4 Hindsight如何把碎片拼成时间线拿到一堆带时间戳的表数据之后Hindsight的下一步工作是把它们拼成一条完整的时间线。这个过程有点像把一张撕碎的纸条重新拼起来但它还多了一步要用胶水把每张碎片粘到正确的时间位置上。Hindsight会把urls表里的URL和visits表里的具体访问事件JOIN起来再通过keyword_search_terms表把搜索行为挂到对应的URL上从downloads表里把下载事件按时间插入到合适的位置甚至可以从Chrome的Storage目录里解析出LocalStorage等持久化数据。最终生成一条按时间排序的行为流几点几分打开了什么页面在哪个页面上执行了搜索接着跳转到了哪个域名又下载了哪个文件。它还把时间戳全部统一转换为人类可读的格式并标注了每条记录是现存记录还是已删除后恢复的记录。这种区分在取证报告里非常重要——现存记录只能证明浏览器访问过该URL而已删除记录的存在往往才能证明用户有故意销毁痕迹的意图。我在做案件分析时经常就是靠这些被标注为recovered deleted的记录让当事人在证据面前无法继续嘴硬。3. 实操记录用Hindsight还原一次完整的上网过程3.1 环境准备与安装Hindsight是Python项目最省事的运行方式是在隔离的取证分析机上跑一个Python 3环境。这里有一个原则要反复强调永远不要在嫌疑人的机器上安装或运行取证工具。你在上面装任何东西哪怕只是往磁盘写一个日志文件都会改变原始证据的哈希值这在法庭上会直接导致证据不被采信。我常用的做法是在一台干净的Ubuntu虚拟机里跑Hindsight。安装过程很简单# 克隆项目 git clone https://github.com/obsidianforensics/hindsight.git cd hindsight # 安装依赖 pip install -r requirements.txt依赖库主要是browser-history、pytz、jsonlines、xlsxwriter这类常用包。装完之后不需要额外编译python hindsight.py --help能看到完整参数就算就绪了。3.2 只读复制检材分析之前先把现场数据完好地取回来。这一步比Hindsight本身更值得用心因为工具跑得再好输入数据是坏的结果全都是白搭。需要复制的不是整个系统镜像而是浏览器Profile目录下的关键文件。Windows上用FTK Imager这类只读访问工具打开目标磁盘进入Users\用户名\AppData\Local\Google\Chrome\User Data\把整个Default目录复制出来。注意History、History-wal、History-shm三个文件必须一起复制——History-wal里存着未合并的写入记录History-shm是共享内存索引文件少任何一个都可能导致数据读不全或者报错。复制完成后记录每个文件的MD5和SHA-256哈希值。这一步是取证的标准动作目的是确保后面分析的数据和现场完全一致。我曾经在一个案子里因为复制时开启了某同步工具导致文件的时间戳被改动后来解释起来非常费劲。所以复制完立刻算哈希记录在分析笔记里。3.3 运行命令与参数数据备好之后正式运行Hindsight。基本命令格式python hindsight.py -i /cases/suspect_chrome_folder -o /cases/report -f html -t Asia/Shanghai各个参数的作用-i输入路径可以指向整个Chrome User Data目录也可以直接指向某一个Profile文件夹。如果你拿到的是单独一个History文件也可以直接指到文件上。-o输出目录Hindsight会把生成的报告写到这里。-f输出格式常用的是html、jsonl、xlsx和sqlite。第一次分析建议用html看起来直观批量处理或需要对接其他分析工具时用jsonl。-t指定时区按案件所在地选择Asia/Shanghai或UTC。这个参数直接影响报告里的时间展示必填。注意-i的输入路径要指向包含Chrome数据的目录而不是随便一个文件夹。如果你拿到的检材是单个History文件Hindsight也能识别但不如整个Profile目录分析得全面——毕竟Cookie、Storage这些数据都在同级目录下一起喂进去才能出完整报告。3.4 输出报告解读跑完之后输出目录里会有一个HTML报告。打开之后是一份按时间排列的浏览行为时间线每一行包含访问时间、URL、页面标题、访问次数、来源类型、记录状态等信息。我最先看的永远是两个板块搜索关键词和下载记录。搜索关键词反映了用户的真实意图——一个人可能记不清自己一周前在百度上搜过什么但数据库里罪证不会忘。下载记录则能把访问了可疑站点升级为从可疑站点下载了文件这在事件响应中是性质完全不同的两件事。报告中已删除记录的标注值得单独讲。Hindsight把恢复出来的、原本已被DELETE操作标记的记录单独归类展示。实战中我会把现存记录和已删除记录分别导出先看现存记录了解大致行为再看已删除记录补齐被刻意抹掉的部分。两条线交叉起来用户的真实轨迹就清楚了。HTML报告适合人看但如果信息量很大几万条记录会直接淹没人的耐心。我习惯跑一份jsonl格式的输出灌进Elasticsearch或者直接用Python脚本做过滤统计——把访问次数最多的域名、凌晨时段活跃的访问、包含敏感关键词的search_terms单独抽出来看效率高很多。4. 高级话题与避坑指南4.1 遇到加密数据怎么办Hindsight能很轻松地读出浏览历史和搜索关键词因为这些数据在SQLite里是明文存储的。但Cookie和密码这类敏感数据就不一样了——Chrome会对它们做加密处理。Windows平台上Chrome使用DPAPIData Protection API加密Cookie和密码密钥和当前Windows用户账户绑定。如果你只是复制了文件没有拿到用户的账户上下文Hindsight是解不开Cookie的。Linux和macOS平台类似用的是keychain或libsecret机制需要钥匙串密码才能解密。这时候要摆正心态Cookie解密不是Hindsight分析必须完成的一步。浏览历史、搜索关键词、下载记录、书签这些数据默认就是明文已经能还原出80%的行为轨迹了。Cookie解密更多是锦上添花——当你明确需要查看某个网站的登录态或跟踪记录时再去考虑绕解密的问题。Hindsight本身提供了-k参数可以在macOS上手动指定钥匙串密码Windows下的DPAPI则需要借助其他工具或用目标用户账户登录分析机来提取密钥。4.2 检材不完整时的补救思路现实取证很少给你集齐一套完整Profile目录的好事。更多时候是只有一个History文件或者只有一份WAL文件甚至文件本身都残缺不全。只拿到History文件没有WAL也没有Cookies——依然值得分析。History里面本身就包含了搜索、下载、历史访问三大类核心数据。先跑一遍把urls和visits表里的信息拿出来再结合案件背景判断这些URL是否能和网络流量日志对上。单靠一张表就能验证嫌疑人是否访问过某个站点这种问题。更极端的情况只有History-wal文件。这时候不能直接跑Hindsight因为WAL只是日志不是完整的数据库。可以把WAL文件和同名的History文件放在一起即使History是空壳SQLite也能从WAL里把未合并的数据读回来。原理是WAL里存着完整的页镜像SQLite引擎可以根据WAL帧恢复出数据库的最终状态。4.3 常见报错与排查速查表用Hindsight踩过的坑不少我把高频问题整理成一张速查表省去翻文档的时间现象原因处理办法file is not a database输入路径指错或者文件根本不是SQLite数据库确认-i指向的是Profile目录或History文件本身database disk image is malformed复制文件时没有带WAL/SHM数据库被截断重新复制完整的HistoryHistory-walHistory-shm三件套no such table: urls输入文件确实是SQLite数据库但不是Chrome的History库检查是不是把Cookies或Web Data当输入了报告时间全部差8小时忘记指定-t参数重新指定时区重新跑输出文件名加时区后缀区分Cookie相关报错平台加密机制导致解密失败不影响历史分析直接忽略确需解密再单独处理输出报告为空提取的Profile不是Chrome的Default目录确认路径下有chrome-extension等特征文件而不是一个空文件夹4.4 几个容易忽略却很有价值的细节关注typed_count字段。urls表里的这个字段记录了用户亲手在地址栏输入该地址的次数。如果一条URL的typed_count大于0意味着这是用户主动输入的行为而不是页面自动跳转或广告弹窗。在审计场景里主动访问和被动跳转的法律定性差异很大。善用from_visit字段逆推访问链。visits表里的from_visit指向来源记录的ID通过递归关联可以重建一条完整的点击链路用户从哪个页面出发经过了哪些跳转最终落到了哪个页面。我在一次钓鱼邮件分析中用这个方法完整还原了受害者的点击路径比单看访问记录有说服力得多。Extension活动也会在History里留下痕迹。很多恶意扩展会周期性访问C2服务器它们的请求也会被Chrome记进历史。如果History里出现大量低访问量、无标题的异常URL且集中于同一域名极可能是扩展的行为。检查chrome-extension://开头的URL记录往往能挖出意外收获。用-f jsonl代替-f html做二次分析。HTML报告看个大概没问题但要做统计、过滤、关联直接解析JSONL更灵活。我通常一次跑两个输出格式HTML用于人工查阅JSONL用于写脚本提取关键词和统计模式。写在最后做了这么多年的取证和应急响应我的体会是Hindsight这样的工具真正的价值不在于它能读出多少条历史记录而在于它把底层数据的组织方式摊开在你面前让每一步推断都可以被验证、被复述。技术本身并不神秘SQLite是公开格式Chrome的存储结构也有文档但一个封装良好的工具能帮你省掉大量重复劳动把注意力放在这些数据意味着什么这件事上。如果你正准备开始用这个工具做分析有两条小建议来自实操经验第一处理任何检材之前先把哈希算好、把分析过程记录好所有的报告输出路径和参数都要留痕——这些细节在需要出正式报告时比工具本身还重要。第二做时间线分析时永远不要让Hindsight的输出作为唯一证据最好和系统日志、网络设备日志交叉验证时间对上了结论才立得住。Hindsight这个名字起得很妙后见之明本来就是取证工作的核心使命。我们永远无法回到过去阻止那一次异常访问、那一笔违规操作但至少可以把事后的视角拉满让曾经发生过的行为无处遁形。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。