随记

在 MacBook 上恢复遗忘的 DMG 密码

适用于用户拥有或明确授权恢复的加密 DMG。目标是根据密码线索进行本地验证,支持 GPU 加速、断点续跑与结果核验。

1 确定目标与搜索范围

开始前记录:

  • DMG 的绝对路径、大小、修改时间。

  • 已知密码线索:前缀、后缀、长度、字符集、大小写、日期与符号位置。

  • 已完成的搜索范围。

  • 用户是否允许使用 GPU。

将自然语言转换成明确规则。例如:

前缀:example
后缀:4–6位数字
包含前导零:是
大小写:前缀保持小写
候选数:10^4 + 10^5 + 10^6 = 1,110,000

区分“密码总长少于6位”和“后缀少于6位”。“包含大小写”也需区分首字母大写、每段大写和任意字母大小写。

原始 DMG 保持不变。恢复数据存放在独立、权限受限的工作目录中。

2 检查工具与 GPU

使用支持 DMG 的 John the Ripper Jumbo。先检查实际安装版本和能力;不同发行包的格式、OpenCL 支持和参数可能不同。John Jumbo 支持 DMG 与 GPU 计算,但不能据此假设每台 Mac 都有可用的 GPU 后端。项目说明

"$JOHN" --list=build-info
"$JOHN" --list=formats
"$JOHN" --list=opencl-devices

完成条件:

  • CPU 格式列表包含 dmg。

  • 使用 GPU 时包含 dmg-opencl。

  • OpenCL 枚举结果显示实际设备。

  • 搜索启动日志确认使用了预期设备。

在受限执行环境中,设备不可见可能来自沙箱限制。按环境要求申请 GPU 访问权限,再重新枚举。

3 提取密码验证数据

umask 077
"$DMG2JOHN" "$IMAGE" > "$WORK/image.john"

验证提取是否成功,保留诊断信息。

提取文件包含测试候选密码所需的参数和加密数据片段,因此通常远小于原始 DMG。文件大小没有固定值;不能将某次得到的几十 KB 当作通用要求。

提取成功不等于验证链路正确。 某些 DMG 与提取器版本可能存在兼容问题。条件允许时,使用同类、已知密码的测试镜像检查 CPU 和 GPU 验证链路。上游曾报告提取成功但正确密码仍无法命中的问题。兼容问题记录

4 生成可审计的候选集

优先测试高概率、小范围候选,再逐步扩展。

生成阶段记录:

候选规则
准确数量
去重规则
字符编码
候选文件路径
生成脚本或掩码

数字组合必须保留前导零。片段拼接需要明确是否允许重复,以及最多拼接几段。

短候选集可以生成词表;大范围搜索可使用工具支持的掩码。使用掩码前,通过 --stdout 检查候选内容和数量,确认规则符合用户原意。参数说明

5 启动搜索并测量速度

词表模式示例:

"$JOHN" \
  --format=dmg-opencl \
  --wordlist="$WORK/candidates.txt" \
  --session="$WORK/search-001" \
  --pot="$WORK/found.pot" \
  "$WORK/image.john" \
  > "$WORK/search-001.console.log" 2>&1

每个会话使用独立名称。控制台日志与 John 自己生成的会话 .log 文件使用不同路径。

先测量真实目标的稳定速度,再估算:

预计剩余时间 = 剩余候选数 ÷ 实测速率

MacBook 型号、DMG 的密钥派生参数、候选批次和散热状态都会影响速度。GPU 不一定让很短的候选集更快。

若自动调优导致启动缓慢或批次过大,再调整工作组参数。在一次 Apple Silicon 实测中,--gws=8192 --lws=32 可稳定运行;其他设备应重新验证。

同一 GPU 优先运行一个搜索任务。

6 查询状态与报告结果

为每轮搜索维护以下状态之一:

prepared
running
paused
completed_without_match
matched_unverified
verified
failed

汇报内容包括当前规则、完成范围、实际速度和是否命中。

判断原则:

  • 会话启动成功,只能报告“已启动”。

  • 断点文件存在,不能证明任务仍在运行。

  • 进程退出,不能证明候选已全部测试。

  • 日志显示完成且无命中,才能报告该范围已排除。

  • 异常退出归类为失败或中断。

读取日志时过滤候选明文和恢复出的密码。

7 暂停与继续

暂停顺序:

  1. 停止会自动启动下一任务的调度脚本。

  2. 向目标 John 进程发送一次 SIGINT。

  3. 等待进程退出并保存断点。

  4. 重新检查相关进程,确认 GPU 搜索已停止。

使用启动时记录的 PID、完整命令行或精确会话路径识别进程。macOS 的 ps 输出可能截断,必要时使用 -ww。避免仅凭进程名批量终止任务。

John 支持通过会话文件恢复;再次发送中断信号可能使它来不及保存状态。停止与恢复说明

"$JOHN" --restore="$WORK/search-001"

恢复前检查原会话是否已经完成。首次运行参数中的时间限制,也应纳入恢复行为检查。

8 验证命中密码

通过 John 的 --show 读取结果,避免自行假设 pot 文件的哈希表示与提取文件完全一致。

将密码写入权限为 0600 的本地文件。随后:

  1. 查询当前 macOS 的磁盘映像工具帮助。

  2. 使用密码标准输入接口。

  3. 对原 DMG 执行只读、禁止挂载文件系统的附加操作。

  4. 成功后,仅弹出本次操作返回的设备。

完成原文件验证后,状态才改为 verified。在工具输出和聊天记录中默认隐藏密码,向用户提供受限本地文件的位置。

9 结束与交接

最终报告应说明:

目标镜像
已完成的准确搜索范围
尚未完成的范围
当前是否存在运行进程
断点与结果文件位置
密码是否经过原 DMG 验证

没有命中只说明已测试候选不正确。保留搜索清单,供下一轮 agent 跳过已完成范围。

在 MacBook 上恢复遗忘的 DMG 密码 | jn.gL