用途
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