
Todo清单的本地数据库用 SQLCipher 加了密,但密钥是开发文档里的示例默认值,厂家没换。我解包源码拿到钥匙,读写双向打通:现在每天的清单由 AI 直接写进 App,晚上导出来复盘。2026 年 7 月 23 日,我在给自己的每日清单体系铺数据底座。体系一句话:早上 AI 定清单,晚上 AI 复盘,我只管执行。底座是数据,数据在我用了大半年的待办 App 里,Todo清单。它的任务存在我自己电脑的本地数据库里,加密的。我是野生码农,39 岁,程序员。这是AI 解密攻防系列第五篇。前面微信的密钥是 8 轮断点、794 次命中硬抠出来的,钉钉三行代码收场。轮到这个待办 App,我以为怎么也得耗一晚上。结果开场十分钟,我就拿到了钥匙。一、排雷:能想到的路,先划掉三条路线结果App 自带导出没这功能,出局云端 API未开放,出局模拟鼠标点界面微信时代就否掉了,脆弱丢人本地数据库SQLCipher 加密,但钥匙在源码里写回本地库能成,但比读难得多数据库文件在%APPDATA%/todo-list/task.db,SQLCipher 加密。SQLCipher 是给 SQLite 套透明加密的扩展,没有钥匙,打开就是一本乱码。二、钥匙:厂家忘了换的样品Electron 应用的源码打在一个叫 asar 的包文件里,相当于把全部界面代码装进一个压缩包。解开应用 v3.11.2 的 asar,翻数据库打开那段,密钥就躺在里面:驱动库开发文档里的示例占位符your-default-encryption-key,原样没改。对照钉钉篇,那次是钥匙和锁挂在同一扇门上。这次连挂都省了:锁是真锁,钥匙是说明书上印的样品钥匙。打开参数照源码抄,三行:const KEY process.env.DB_ENCRYPTION_KEY || your-default-encryption-key; db.pragma(key JSON.stringify(KEY)); db.pragma(legacy 4); // 兼容参数,与应用源码一致钥匙对上了,还差一步:驱动加载不了。三、插曲:借应用自己的引擎,开应用自己的锁better-sqlite3-multiple-ciphers 是原生模块,里面的better_sqlite3.node按应用自带 Electron 的 ABI 编译。ABI 是程序和运行环境之间的二进制接口约定,版本错一位,系统 Node v24 直接拒载。解法:不自己配环境,借应用自己的 Electron 当 Node 用:ELECTRON_RUN_AS_NODE1 Todo清单.exe export.js --all --mdELECTRON_RUN_AS_NODE1是让 Electron 脱掉浏览器外壳、当纯 Node 运行的开关。我从 asar 里抠出 3 个最小依赖放进 vendor 目录,脚本全部由应用自己的 exe 带着跑。借它的引擎,开它的锁。只读也做了隔离:先把 task.db 复制到临时文件,readonly 打开,应用在跑也能安全导,导完删副本。四、第一把全量导出,数据先教育了我890 条任务,含已删除,时间跨度 2025 年 11 月 25 日到 2026 年 7 月 23 日。我以为会看到执行力不行的证据。不含已删除 338 条,完成 303 条,完成率约 90%,相当能看。真正扎眼的是另一行:活跃记录日只有 76 天,八个月里占三成,最长连续记录 12 天。数据比自我感觉诚实:我的问题从来不是做不到,是断更。后来清单 AI 定、复盘 AI 做、我只执行这套机制,立项依据就是这行数。机制先治断更,再谈执行。五、写入才是硬仗:用它的笔迹给它递纸条读出来只是单向,我要的是双向:早上清单自动进 App,晚上完成数据自动出来。写入不是改数据,是模拟应用自身的新增动作。字段取值照 v3.11.2 渲染层源码还原。渲染层是 Electron 里跑界面的进程,新增任务的逻辑就写在里面:新任务statusadd、syncTime0、version0,taskId 按固定格式拼。应用重启后,会把 status 为 add 的行上传云端、置为 sync,再同步到手机。const taskId tid_${userId}${rand6()}_${now}; // statusadd, syncTime0, version0:照应用自己的新增逻辑填我不破解这个 App,是学会了它写字的格式,用它的笔迹给它递纸条。云端收到,以为是它自己写的。规矩三条:只 INSERT,不改不删;写前自动备份.bak-时间戳;排序值在当日最大值上每条加 1000,不抢位。六、两个坑,都是钱买不到的经验坑一,7 月 23 日当天。导入的任务在 App 里灰色不可点。查了半天的根因:少填了分类字段。UI 行为就是文档,灰色不可点等于应用在说这个字段必填。补了一张分类映射表,5 个分类,之后导入必带分类。坑二,7 月 31 日。凌晨导入次日清单,落点日期错一天,加上 App 没重启,第二天打开一片空白。整改三条:导入前校验落点和今天是否一致;写完逐条回读校验;补记功能支持直接写已完成。const landed fmtLocal(check.get(id).todoTime); if (landed ! spec.date) { bad; console.error(校验失败: ${id} 落点 ${landed}); }改别人的库,备份先行;写完不校验,等于没写。到 8 月 13 日,库里有效任务 470 条,已完成 408、未完成 62,已删除 553 条;导入规格文件从 7 月 28 日排到 8 月 21 日,16 份。第一次写入是 7 月 24 日,5 条。这条管道至今每天在用。七、五个判断点,谁再踩谁冤加密库先找钥匙来源。解包 asar 翻源码,示例默认值、硬编码是常态,别先假设对手很强。原生模块绑 ABI。版本错一位都加载不了,借应用自带的 Electron 以 Node 模式跑,最稳。只读用副本。复制出来再打开,应用运行中也能安全导。写入要装成应用自己。状态机字段照渲染层源码还原,从 add 等云端认领;只 INSERT,备份先行,写后回读校验。UI 行为就是规格书。灰色不可点,说明有必填暗字段没填。边界系列里每篇都说一遍:全程只在自己电脑、自己账号上操作。读是只读,副本打开不碰原库;写是模拟应用自身的新增逻辑,写进我自己的本地库,由应用自己走原有通道同步。产物不出本机。任务内容、分类真名一个字不写,上面代码都是脱敏后的关键片段。读写我自己的数据,天经地义。加密不等于安全,多数时候锁挡的是主人,不是贼。前提是,你得先翻一遍它的说明书。下一篇,全渠道综合:微信、钉钉、印象笔记、OPPO 便签、待办清单,我把所有数据接进了一套系统,8 月 22 日发。FAQ问:这个默认密钥现在还能用吗?我 8 月 13 日还在用,应用版本 v3.11.2。厂家哪天把默认值换掉,这套就得重来。什么时候换,我不知道,不猜。问:写任务时直接把 status 写成 sync 不行吗?不行。status 为 sync 等于告诉应用这条云端已有,可云端根本没有,同步就漏了。装就要装全套,从 add 开始,让应用自己走完整流程。问:普通人用得上吗?看你要不要AI 读写待办这条管道。只想备份任务,导出那一半就够;想让 AI 每天把清单写进 App,才需要写入这半。问:这算不算破解别人的软件?读的是自己电脑、自己账号的本地库;写是模拟应用自身逻辑写自己的数据,不碰他人账号,不绕付费功能。边界在哪,正文写明了。我是野生码农,AI 实战派。自研 AI 本地知识库系统、AI 数字员工团队、软考 AI 备考系统、量化交易系统,全程公开复盘。这个AI 解密攻防系列,微信、钉钉、印象笔记、OPPO 便签之后,这是第五战,下一篇 8 月 22 日,全渠道综合:我把所有数据接进了一套系统。8 月 30 日前后还有一份月报,所有系统跑了多少活、花了多少钱,真实数据全公开,难看也放。关注我,看真的。野生码农 · 全网同名 · AI 数字员工实战复盘,数据只报实测