背景说明
某些 Anki deck 使用了加密保护,需要找到解密的 key 和 iv 才能提取内容。这些加密 deck 通常还包含防调试代码,会在检测到开发者工具时循环刷新页面。
完整操作步骤
第一步:绕过防调试代码
- 先打开 Chrome DevTools(按
F12) - 立即禁用所有断点:
- 在 Sources 面板,按快捷键
F8(或Ctrl+F8/Cmd+F8) - 或点击右上角的 “Deactivate breakpoints” 按钮(蓝色暂停图标)
- 此时按钮应该变灰,表示断点已禁用
- 在 Sources 面板,按快捷键
- 进入 Deck 页面(现在不会被防调试代码拦截)
第二步:定位解密函数
- 按
Ctrl+Shift+F(Mac:Cmd+Shift+F)打开全局搜索 - 搜索关键词:
≯#(加密内容的标记符) - 找到类似这样的代码段:
_0x3dc22f[_0x5271('0x47')]( (_0x3d4b22, _0x1e99f3) => {
let _0xe83f49 = this['akDecrypt'](
_0x3d4b22[_0x5271('0x1e')](0x2)[_0x5271('0x1e')](0x0, ...),
_0x292030, // ← key
_0x384624[_0x5271('0xd6')] // ← iv
);
_0x36a462 = _0x36a462[_0x5271('0x4a')](_0x3d4b22, _0xe83f49);
});第三步:打断点(关键!)
重要:断点要打在 forEach 或循环的外层,不要打在箭头函数内部
在这行打断点:
_0x3dc22f[_0x5271('0x47')]( (_0x3d4b22, _0x1e99f3) => { // ← 点击行号打断点或者打在更外层的 if 语句:
if (_0x3dc22f) { // ← 也可以在这里打断点第四步:重新启用断点并触发解密
- 按
F8重新启用断点(按钮变回蓝色) - 点击卡片翻转(Front → Back 或 Back → Front)
- 代码会在断点处暂停
第五步:查看 Key 和 IV
方法一:查看 Scope 面板(推荐)
在右侧 Scope 面板中:
- 展开 Closure 部分(而不是 Local)
- 找到:
_0x292030← 这是 key_0x384624← 展开这个对象,找到 iv 相关的值
方法二:直接在 Console 查询
在下方 Console 中输入:
javascript
_0x292030 // 查看 key
_0x384624 // 查看包含 iv 的对象
第六步:保存结果
将找到的 key 和 iv 复制保存,格式通常是:
- key: 一串字符串(如
"somekey123") - iv: 通常是
"12345679abcdefgj"或类似字符串
替代方法:使用 Logpoint(无需暂停)
如果不想让代码暂停执行:
- 在断点位置右键行号 → 选择 “Add logpoint”
- 输入表达式:
javascript
'Key:', _0x292030, 'IV:', _0x384624
- 点击翻转卡片
- Console 会直接打印出值,不会暂停执行
快速参考
步骤操作快捷键打开 DevTools开发者工具F12禁用/启用断点切换断点状态F8全局搜索搜索代码Ctrl+Shift+F打断点点击行号鼠标点击
常见问题
Q: 只看到箭头函数内的局部变量?
A: 断点打错位置了,应该打在 forEach 外层,然后查看 Closure 作用域。
Q: 页面一直刷新?
A: 进入页面前先按 F8 禁用断点,进入后再启用。
Q: 找不到 ≯# 符号?
A: 尝试搜索 akDecrypt 或 decrypt,找到调用这些函数的地方。
Q: Scope 里没有想要的变量?
A: 直接在 Console 输入变量名查看,或者展开 Closure 作用域。
参考资料
提示:找到 key 和 iv 后,可以使用解密脚本批量处理加密内容,具体使用方法参考上述 GitHub Gist。
发表回复