SuperAPI AI 工具集

leveldb-ops

数据与分析

查看项目

更新于 10-15 07:45

技能介绍

用途

leveldb-ops 用于读取和解码 LevelDB 存储,主要针对 Chromium/Electron 应用的存储层,包括 Local Storage、IndexedDB 和 Session Storage。这些存储被磁盘上的每个 Electron 应用使用,例如 Claude Desktop、VS Code、Discord、Slack、Obsidian。该技能适合检查应用状态、定位缓存值、进行取证式探测,或理解桌面应用为何显示特定内容。

主要能力

  • 读取 Local Storage:扁平的键值字符串映射,按来源(origin)划分,最容易读取。
  • 读取 Session Storage:形状与 Local Storage 相同,按标签页划分。
  • 读取 IndexedDB:按来源划分的数据库,包含对象存储、索引和版本化模式,使用 v8 序列化编码,需要专门的读取器。
  • 提供可复用的脚本:scripts/dump_localstorage.py、scripts/dump_indexeddb.py、scripts/extract_keys.py。
  • 提供参考文档:references/claude-desktop-state.md(Claude Desktop 状态映射)、references/chromium-format.md(leveldb 磁盘格式、锁定、追加语义)。

使用方式

安全协议

LevelDB 使用独占 LOCK 文件。运行中的应用会持有该锁。尝试打开活动存储会失败,或静默返回过期快照。

始终先复制再读取:

# 将整个 leveldb 目录复制到临时位置
cp -r "$APPDATA/Claude/Local Storage/leveldb" /tmp/probe/local-storage-db
cp -r "$APPDATA/Claude/IndexedDB/https_claude.ai_0.indexeddb.leveldb" /tmp/probe/indexeddb

# 移除副本中的 LOCK 文件,以便读取器可以打开
rm -f /tmp/probe/local-storage-db/LOCK /tmp/probe/indexeddb/LOCK

cp -r 会对 LOCK 文件本身警告“Device or resource busy”,这没关系,数据文件会成功复制。

切勿在应用运行时写入活动存储。这会损坏 LSM 并导致应用崩溃。如果需要修改,请先退出应用。

环境设置

plyvel 等库需要原生编译,且缺少 Windows wheel。使用 ccl_chromium_reader——纯 Python,专为浏览器取证编写。

uv venv .venv --python 3.13
source .venv/Scripts/activate          # 或在 Unix 上使用 .venv/bin/activate
uv pip install "git+https://github.com/cclgroupltd/ccl_chrome_indexeddb.git"

该包不在 PyPI 上,需直接从 GitHub 安装。会引入 ccl-simplesnappy 和 brotli 作为传递依赖。

读取 Local Storage

存储键是来源 URL(例如 https://claude.ai)。记录是追加式的——重复的 script_key 条目表示较旧的版本;最后一条记录生效。

import pathlib
from ccl_chromium_reader import ccl_chromium_localstorage

ls = ccl_chromium_localstorage.LocalStoreDb(pathlib.Path("./local-storage-db"))

# 列出所有来源
for origin in sorted(set(ls.iter_storage_keys())):
    print(origin)

# 转储一个来源,最新值生效
latest = {}
for rec in ls.iter_records_for_storage_key("https://claude.ai"):
    latest[rec.script_key] = rec.value
for k, v in latest.items():
    print(f"{k}: {repr(v)[:200]}")

完整可复用脚本见 scripts/dump_localstorage.py。

读取 IndexedDB

IndexedDB 更复杂——包装的对象存储,值使用 v8 序列化。ccl_chromium_reader 可以干净地解析:

from ccl_chromium_reader import ccl_chromium_indexeddb

db = ccl_chromium_indexeddb.WrappedIndexDB(pathlib.Path("./indexeddb"))
for db_id in db.database_ids:
    wdb = db[db_id.dbid_no]
    print(f"DB: {wdb.name}")
    for store_name in wdb.object_store_names:
        store = wdb[store_name]
        for rec in store.iterate_records():
            print(f"  {rec.key!r} -> {repr(rec.value)[:200]}")

完整脚本见 scripts/dump_indexeddb.py。

常见 Chromium 存储位置

操作系统 路径
Windows %APPDATA%<App>\Local Storage\leveldb\
Windows %APPDATA%<App>\IndexedDB\https_<host>_0.indexeddb.leveldb\
macOS ~/Library/Application Support/<App>/Local Storage/leveldb/
Linux ~/.config/<App>/Local Storage/leveldb/

对于原始浏览器,<App> 是 Google/Chrome/User Data/Default、BraveSoftware/Brave-Browser/User Data/Default 等。

修改(高级)

写入需要以下之一:

  • 退出应用并使用 leveldb 写入器(Node level 包,或手动重建目录);或
  • 通过应用自身修补——许多 Electron 应用暴露 DevTools。使用 --remote-debugging-port=<n> 标志打开,附加,并调用 localStorage.setItem(key, value)。这会经过应用的正常写入路径,因此不会损坏 LSM。

对于 Claude Desktop,请参阅 references/claude-desktop-state.md 中发现的键映射。

决策框架

你想要 做法
只是看看有什么 复制 + ccl_chromium_reader
查找特定值 先用 strings + grep;如果结构重要则用读取器
应用运行时修改 不要。使用 DevTools 远程调试。
应用关闭时修改 退出,然后使用 Node level 包或通过重新打开的 leveldb 写回
跨账户恢复 只读取证;无法模拟服务器绑定的条目

反模式

  • 直接打开活动存储 → 静默过期或打开错误
  • 忘记从副本中移除 LOCK → 读取器失败
  • 信任键的第一次命中 → leveldb 是追加式的;遍历所有并保留最后一条
  • 使用 strings 进行结构化分析 → 遗漏键、混淆重复项、无法区分来源
  • 应用运行时写入 → LSM 损坏、应用崩溃、可能数据丢失

适用场景

  • 检查 Electron 应用(如 Claude Desktop、VS Code、Discord、Slack、Obsidian)的本地存储内容。
  • 解码 IndexedDB 或读取 .ldb 文件。
  • 排查桌面应用为何显示特定侧边栏内容,或缓存数据存储在哪里。
  • 对 Chrome、Edge、Brave 或 Electron 状态进行取证式探测。
  • 在应用关闭时重置或修改 Electron 应用状态。

限制

  • 无法在应用运行时安全写入活动存储,否则会损坏 LSM 并导致应用崩溃。
  • 跨账户恢复仅限只读取证,无法模拟服务器绑定的条目。
  • 需要先复制存储目录并移除 LOCK 文件,否则读取器无法打开。
  • IndexedDB 使用 v8 序列化,需要专门的读取器,不能简单用 strings 分析。
  • ccl_chromium_reader 不在 PyPI 上,需从 GitHub 直接安装。

参考

  • scripts/dump_localstorage.py — 完整的 Local Storage 转储
  • scripts/dump_indexeddb.py — 完整的 IndexedDB 转储
  • scripts/extract_keys.py — 定向键提取,最新值生效
  • references/claude-desktop-state.md — Claude Desktop 状态映射(存储键、侧边栏、会话、账户绑定)
  • references/chromium-format.md — leveldb 磁盘格式、锁定、追加语义
  • ccl_chromium_reader: https://github.com/cclgroupltd/ccl_chrome_indexeddb
  • LevelDB 规范: https://github.com/google/leveldb/blob/main/doc/impl.md