钉钉的钥匙挂在门上,这个待办 App 的钥匙印在说明书上

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_NODE=1 "Todo清单.exe" export.js --all --md

ELECTRON_RUN_AS_NODE=1 是让 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 里跑界面的进程,新增任务的逻辑就写在里面:新任务 status="add"syncTime=0version=0,taskId 按固定格式拼。应用重启后,会把 status 为 add 的行上传云端、置为 sync,再同步到手机。

const taskId = `tid_${userId}${rand6()}_${now}`;
// status='add', syncTime=0, version=0:照应用自己的新增逻辑填

我不破解这个 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 条。这条管道至今每天在用。

七、五个判断点,谁再踩谁冤

  1. 加密库先找钥匙来源。解包 asar 翻源码,示例默认值、硬编码是常态,别先假设对手很强。
  2. 原生模块绑 ABI。版本错一位都加载不了,借应用自带的 Electron 以 Node 模式跑,最稳。
  3. 只读用副本。复制出来再打开,应用运行中也能安全导。
  4. 写入要装成应用自己。状态机字段照渲染层源码还原,从 add 等云端认领;只 INSERT,备份先行,写后回读校验。
  5. 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 数字员工实战复盘,数据只报实测

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值