Anki 加密 Deck 解密 Key 查找指南

背景说明

某些 Anki deck 使用了加密保护,需要找到解密的 keyiv 才能提取内容。这些加密 deck 通常还包含防调试代码,会在检测到开发者工具时循环刷新页面。

完整操作步骤

第一步:绕过防调试代码

  1. 先打开 Chrome DevTools(按 F12
  2. 立即禁用所有断点
    • Sources 面板,按快捷键 F8(或 Ctrl+F8 / Cmd+F8
    • 或点击右上角的 “Deactivate breakpoints” 按钮(蓝色暂停图标)
    • 此时按钮应该变灰,表示断点已禁用
  3. 进入 Deck 页面(现在不会被防调试代码拦截)

第二步:定位解密函数

  1. Ctrl+Shift+F(Mac: Cmd+Shift+F)打开全局搜索
  2. 搜索关键词≯#(加密内容的标记符)
  3. 找到类似这样的代码段
_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) {  // ← 也可以在这里打断点

第四步:重新启用断点并触发解密

  1. F8 重新启用断点(按钮变回蓝色)
  2. 点击卡片翻转(Front → Back 或 Back → Front)
  3. 代码会在断点处暂停

第五步:查看 Key 和 IV

方法一:查看 Scope 面板(推荐)

在右侧 Scope 面板中:

  1. 展开 Closure 部分(而不是 Local)
  2. 找到:
    • _0x292030这是 key
    • _0x384624 ← 展开这个对象,找到 iv 相关的值

方法二:直接在 Console 查询

在下方 Console 中输入:

javascript

_0x292030  // 查看 key
_0x384624  // 查看包含 iv 的对象

第六步:保存结果

将找到的 keyiv 复制保存,格式通常是:

  • key: 一串字符串(如 "somekey123"
  • iv: 通常是 "12345679abcdefgj" 或类似字符串

替代方法:使用 Logpoint(无需暂停)

如果不想让代码暂停执行:

  1. 在断点位置右键行号 → 选择 “Add logpoint”
  2. 输入表达式

javascript

'Key:', _0x292030, 'IV:', _0x384624
  1. 点击翻转卡片
  2. Console 会直接打印出值,不会暂停执行

快速参考

步骤操作快捷键打开 DevTools开发者工具F12禁用/启用断点切换断点状态F8全局搜索搜索代码Ctrl+Shift+F打断点点击行号鼠标点击

常见问题

Q: 只看到箭头函数内的局部变量?
A: 断点打错位置了,应该打在 forEach 外层,然后查看 Closure 作用域。

Q: 页面一直刷新?
A: 进入页面前先按 F8 禁用断点,进入后再启用。

Q: 找不到 ≯# 符号?
A: 尝试搜索 akDecryptdecrypt,找到调用这些函数的地方。

Q: Scope 里没有想要的变量?
A: 直接在 Console 输入变量名查看,或者展开 Closure 作用域。


参考资料


提示:找到 key 和 iv 后,可以使用解密脚本批量处理加密内容,具体使用方法参考上述 GitHub Gist。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注