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

标签 sqlite firefox-addon blob 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 文件,其中包含字符串 moz-extension://37a9788c-671d-4cae-ba5c-fbdb8788499a ,该 URL 在 Firefox 中打开时会显示附加组件的详细信息,因此我很确定该文件夹属于附加组件。

该文件夹包含一个 idb 目录,听起来像 Indexed Database API ,W3C 标准 apparently used since last year by Firefox 用于存储附加组件数据。
idb 文件夹仅包含一个空文件夹和一个 SQLite 文件。

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

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

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

最佳答案

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

先回答问题的技术部分:

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

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

    $ ./moz-idb-edit --extension "${EXT_ID}" --profile "${MOZ_PROFILE}" "${STORAGE_KEY}"
    

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

    目前也不支持写入数据。

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

    关于sqlite - 从 Linux bash 解析 FB-Purity 的 Firefox idb(索引数据库 API)object_data blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54920939/

    相关文章:

    vim - 我想在 Web 浏览器中使用类似 VI 的命令?

    java - Janusgraph 支持 Blob 数据类型吗?

    jax-rs - 离开Spring事务后从JDBC Blob中读取

    node.js - 无法从 FileSaver/Blob 与 Node 的 fs 获得相同的结果

    javascript - 在 firefox 插件弹出窗口中禁用任何对象的拖动

    javascript - 如何观看 nsIHandlerService.store(handlerInfo)

    导入 sqlite3 驱动程序时出现问题

    sql - 如何在 SQL 中使用集合?

    python - Django:时区支持处于事件状态时的原始日期时间(sqlite)

    android - 从databasehelper访问字符串资源