我朋友问我有一个很重要的 excel 忘记密码了,能不能找回来了,对他很重要,我记得老早之前 hashcat 是可以破解的,顺便查了一下,记录一下用法。
简单叙述如何使用强大的密码破解工具 John the Ripper (JtR) 来恢复忘记密码的 XLSX 文件,覆盖 John 的几种核心破解模式。
前提条件#
- John the Ripper: 确保你已经下载并解压了 John the Ripper。强烈推荐使用社区增强版 "Jumbo John",因为它支持更多的哈希类型和 GPU 加速。https://github.com/openwall/john
- 目标文件: 你需要破解密码的
.xlsx
文件。
第一步:从 XLSX 文件中提取哈希#
John a Ripper 无法直接处理 .xlsx
文件,它需要一个特殊格式的 “哈希” 字符串。我们使用 office2john.py
脚本来提取它。
- 打开你的终端(Windows 上的 PowerShell 或 CMD)。
- 使用
cd
命令进入 John the Ripper 的run
目录。 - 运行以下命令:
# 将 "C:\path\to\your\file.xlsx" 替换为你的 Excel 文件完整路径
python .\office2john.py "C:\path\to\your\file.xlsx" > hash.txt
这个命令会生成一个名为 hash.txt
的文件,里面包含了 John a Ripper 需要的加密信息。
第二步:选择破解模式并执行#
John the Ripper 拥有多种破解模式,针对不同场景选择合适的模式是成功的关键。
John 的核心破解模式#
1. 字典模式 (Wordlist Mode)#
这是最常用的模式。你提供一个包含常用密码的字典文件(wordlist),John 会逐一尝试。还可以配合规则(Rules)对字典词汇进行变形(如 pass
-> P@ss123
),极大提升成功率。
# --wordlist=后接你的字典文件路径
john --wordlist=password.lst hash.txt
2. 增量模式 (Incremental Mode)#
纯粹的暴力破解。它会尝试所有可能的字符组合,理论上只要时间足够,一定能破解。但对于稍长的密码,会非常非常慢。
# 尝试所有8位以内的小写字母组合
john --incremental=Lower --max-len=8 hash.txt
3. 掩码模式 (Mask Mode) - 本次使用的模式#
当你对密码结构有一定了解时,这是最高效的模式。你可以定义密码的格式,极大地缩小搜索范围。
?d
: 代表一位数字 (0-9)?l
: 代表一位小写字母 (a-z)?u
: 代表一位大写字母 (A-Z)?s
: 代表一位特殊符号 (!@#$)
示例: 破解一个 6 位纯数字密码。‘
参考可以查阅:https://in.security/2022/06/20/hashcat-pssw0rd-cracking-brute-force-mask-hybrid/
https://github.com/openwall/john/blob/bleeding-jumbo/doc/RULES
(非常复杂,建议直接问 AI)
john --mask=?d?d?d?d?d?d hash.txt
简单来说:
? 符号本身不是一个字符,而是一个 “特殊指令” 或 “前缀”,它告诉 John:“请注意,跟在我后面的那个字母不是普通字母,而是一个代表特定字符集的占位符。”
把它想象成一个填空题:
__ __ __ __ __ __
?d?d?d?d?d?d 这个掩码就等于在说:
- 在第一个空 __ 里,填一个数字(digit) (?d)
- 在第二个空 __ 里,填一个数字(digit) (?d)
- ... 依此类推,填满六个空。
详细分解#
让我们来深入看一下 ? 和它后面字母的组合。
1. 内置的标准占位符#
John the Ripper 预定义了一些字母,当它们跟在 ? 后面时,就代表了特定的字符集。最常用的有:
占位符 | 代表的字符集 | 解释 | 示例字符 |
---|---|---|---|
?d | Digits | 数字 | 0, 1, 2, ... 9 |
?l | Lower | 小写字母 | a, b, c, ... z |
?u | Upper | 大写字母 | A, B, C, ... Z |
?s | Special | 特殊符号(ASCII) | !, @, #, $ ... |
?a | All | 所有可打印的字符(?l+?u+?d+?s) | a, A, 1, ! ... |
?h | Hex, lower | 小写的十六进制字符 | 0-9, a-f |
?H | Hex, upper | 大写的十六进制字符 | 0-9, A-F |
?b | All 8-bit | 所有可能的 ASCII 字符 (0-255) | (所有字符) |
2. 如何组合它们?#
你可以自由地组合这些占位符来构建你认为可能的密码结构。
示例 1:一个首字母大写,后跟 7 个小写字母的密码 (例如 Password)
--mask=?u?l?l?l?l?l?l?l
示例 2:一个 4 位数字的 ATM 密码,后面跟着两个大写字母 (例如 1234AB)
--mask=?d?d?d?d?u?u
3. 如果密码里就包含一个普通字母怎么办?#
任何没有 ? 前缀的字符都会被当作普通(或 “字面”)字符来处理。John a Ripper 会认为这个位置的字符是固定不变的。
示例 3:你知道密码以 pass- 开头,后面是 4 个数字 (例如 pass-1234)
--mask=pass-?d?d?d?d
在这个例子里,p, a, s, s, - 都是固定不变的,只有后面的四个 ?d 位置会被 John 暴力破解。这极大地减少了搜索空间!
4. 更高级的用法:自定义字符集#
你甚至可以定义自己的占位符 ?1, ?2, ?3 等。
示例 4:你知道密码只有 8 位,且只包含 a, b, c, 1, 2, 3 这几个字符。
你可以定义一个自定义字符集 ?1,然后重复它 8 次。
john --mask='?1?1?1?1?1?1?1?1' --mask-char-?1='abc123' hash.txt
- <font style="color:rgb(26, 28, 30);">--mask-char-?1='abc123'</font><font style="color:rgb(26, 28, 30);">:这部分定义了</font><font style="color:rgb(26, 28, 30);"> </font><font style="color:rgb(26, 28, 30);">?1</font><font style="color:rgb(26, 28, 30);"> </font><font style="color:rgb(26, 28, 30);">这个占位符代表的字符集就是</font><font style="color:rgb(26, 28, 30);"> </font><font style="color:rgb(26, 28, 30);">'abc123'</font><font style="color:rgb(26, 28, 30);">。</font>
- <font style="color:rgb(26, 28, 30);">--mask='?1?1?1?1?1?1?1?1'</font><font style="color:rgb(26, 28, 30);">: 这部分告诉 John a Ripper 密码由8个来自</font><font style="color:rgb(26, 28, 30);"> </font><font style="color:rgb(26, 28, 30);">?1</font><font style="color:rgb(26, 28, 30);"> </font><font style="color:rgb(26, 28, 30);">字符集的字符组成。</font>
? 符号它本身没有意义,但它赋予了紧跟其后的字母特殊的含义,让你可以从 “盲目地暴力破解所有可能” 转变为 “精确地、有策略地暴力破解特定格式”,从而将破解时间从几年缩短到几秒钟。
4. 单一破解模式 (Single Crack Mode)#
John 默认最先尝试的模式,速度极快。它会利用哈希文件中的用户名等信息进行简单的变换和猜测。
# 不加任何模式参数,默认就会启用
john hash.txt
实战演练:破解一个 6 位数字密码的 XLSX 文件#
在我们的实战中,我们知道密码是 6 位数字,所以选择掩码模式。
理想的命令是:
.\john --mask=?d?d?d?d?d?d hash.txt
常见问题与解决方案#
错误 : Error: UTF-16 BOM seen in input file.
#
- 问题: John 无法识别
hash.txt
的文件编码。 - 原因: 使用 Windows PowerShell 的
>
重定向符创建文件时,默认编码是UTF-16
,而 John 需要UTF-8
或ASCII
。 - 解决方案:
- 用记事本打开
hash.txt
文件。 - 选择 "文件" -> "另存为"。
- 在弹出的窗口下方,将 “编码” 从
UTF-16 LE
修改为UTF-8
。 - 保存并覆盖原文件。
- 用记事本打开
第三步:查看破解结果#
当命令成功执行后,你会看到类似下面的输出:
Warning: detected hash type "Office", but the string is also recognized as "office-opencl"
Use the "--format=office-opencl" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 1 password hash (Office, 2007/2010/2013 [SHA1 256/256 AVX2 8x / SHA512 256/256 AVX2 4x AES])
Cost 1 (MS Office version) is 2007 for all loaded hashes
Cost 2 (iteration count) is 50000 for all loaded hashes
Will run 32 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
933728 (微信登记1 (1).xlsx)
1g 0:00:00:29 DONE (2025-09-05 19:45) 0.03344g/s 20067p/s 20067c/s 20067C/s 616778..351115
结果解读:
- 破解的密码:
933728
- 花费时间:
0:00:00:29
,即 29 秒。
如果之后想再次查看已破解的密码,可以运行:
.\john --show hash.txt
至此,结束。
PS:
外面第三方软件有很多,我找了一下找到了一个 Passper for Excel.exe 的软件,看了一下应该也是调用的 John,支持 GUI 图形化,建议有需要直接使用这个,搜索相关 Passper for Excel crack。