从 Linux bash 解析 FB-Purity 的 Firefox idb(索引数据库 API)object_data blob

Nic*_*oul 5 sqlite blob firefox-addon indexeddb firefox-addon-webextensions

我想从 Linux bash 脚本读取由名为 FB-Purity 的特定 Firefox 附加组件存储的结构化数据。

我找到了一个名为的文件夹.mozilla/firefox/b8eab5j0.default/storage/default/moz-extension+++37a9788c-671d-4cae-ba5c-fbdb8788499a^userContextId=4294967295/,其中包含一个.metadata包含 string的文件moz-extension://37a9788c-671d-4cae-ba5c-fbdb8788499a,一个 URL 在 Firefox 中打开时会显示附加组件的详细信息,所以我很确定这个文件夹属于附加组件。

该文件夹包含一个idb目录,听起来像Indexed Database API,这是一种 W3C 标准,显然自去年以来 Firefox使用它来存储附加组件数据。

idb文件夹仅包含一个空文件夹和一个 SQLite 文件。

不幸的是,SQLite 文件不包含很多应用程序结构化数据,但该object_data表包含一个 95KB 的 blob,其中可能包含真正的结构化数据:

INSERT INTO `object_data` VALUES (1,'0pmegsjfoetupsf.742612367',NULL,NULL,
X'e08b0d0403000101c0f1ffe5a201000400ffff7b00220032003100380035003000320022003a002
2005300610074006f0072007500200055007205105861006e00690022002c00220036003100350036
[... 95KB ...]
00780022007d00000000000000');
Run Code Online (Sandbox Code Playgroud)

问题:知道这个 blob 的格式是什么吗?如何将其(使用命令行或任何库或 Linux 工具)提取为 JSON 或任何其他可读格式?

ntn*_*nja 7

好吧,我今天度过了愉快的一天,并最终创建了一个 Python 工具,该工具可以从这些 indexedDB 数据库文件中读取数据并打印它们(在某些时候可能还会更多):https ://gitlab.com/ntninja/moz -idb-编辑

先回答问题的技术部分:

  • 名称key(name) 和data(value) 均使用 Mozilla 专有格式,此时其唯一文档似乎是其源代码。
  • 这些键使用了一种特殊的专用用例编码,其粗略描述可在mozilla-central/dom/indexedDB/Key.cpp 中找到——该文件还包含唯一已知的实现。它的独特卖点似乎是它相对紧凑,同时与网站可能抛出的所有可能的索引类型兼容,并且默认情况下处于正确的二进制排序顺序。
  • 这些值使用 SpiderMonkey 的内部 StructuredClone 表示存储,该表示也用于在浏览器中的进程之间移动值时。同样没有文档可言,但可以阅读源代码,幸运的是它很容易理解。然而,在被添加到数据库之前,生成的二进制文件是使用谷歌的Snappy 压缩即时压缩的,该压缩“不旨在最大压缩 [而是……] 旨在实现非常高的速度和合理的压缩”——考虑到这可能不是一个坏主意我们正在处理浪费的网络内容。
  • 要为扩展的本地存储数据定位正确的 indexedDB 文件,需要将扩展​​的静态 ID 解析为所谓的“内部 UUID”,其值在每个浏览器配置文件实例中都不同(使基于已安装插件的跟踪变得更加困难) )。此映射表存储为pref(“extensions.webextensions.uuids”)在prefs.js 中。IDB 路径为${MOZ_PROFILE}/storage/default/moz-extension+++${EXT_UUID}^userContextId=4294967295/idb/3647222921wleabcEoxlt-eengsairo.sqlite

对于所有实际意图和目的,您可以通过下载上述项目来读取任何扩展的单个存储密钥的值。基本用法是:

$ ./moz-idb-edit --extension "${EXT_ID}" --profile "${MOZ_PROFILE}" "${STORAGE_KEY}"
Run Code Online (Sandbox Code Playgroud)

${EXT_ID}扩展的静态 ID在哪里(如果不确定,请检查其manifest.json文件或查看about:support#extensions-tbody)、${MOZ_PROFILE}Firefox 配置文件目录(也在 中about:support)以及${STORAGE_KEY}您要查询的密钥的名称(不幸的是,尚不支持查询所有密钥) .

目前也不支持写入数据。

当我实现更多功能时,我会更新这个答案(或者在项目页面上给我一个问题!)。