一个纯 C++ 标准库实现、双击即用、不需要显卡和任何运行库的哈希反查小工具。
支持 39 种标准哈希算法,自带字典反查、暴力破解、NTLMv1/NTLMv2 破解和 584 组标准向量自检。
一、为什么又造一个轮子
在 CTF、应急响应、内网渗透和取证分析里,经常遇到同一个场景:手上只有一串哈希,想知道它背后的明文。
能用的方案无非三类:
- hashcat / john:功能强,但依赖显卡驱动和运行库,环境稍微干净一点就跑不起来,参数也多;
- 在线彩虹表网站:把哈希上传到别人的服务器,涉密数据、授权测试中拿到的凭据都不能这么干;
- 自己写脚本:两行 Python 只会 MD5/SHA-1,碰到 NTLM、SM3、BLAKE3、Streebog 就得现找库。
MD5Crack3 的定位很明确:一个纯 C++ 标准库写成、编译后只有一个 exe、覆盖 39 种标准哈希算法,并且把”字典反查 + 暴力破解 + NetNTLM”三件事都做掉的小工具。不依赖 OpenSSL,不依赖 Python,所有算法手写实现,拷到任意 Windows 机器上双击就能用。
源码只有一个 md5crack3.cpp 加几个 .inc 片段,clang++ / g++ / MSVC 都能直接编译。
二、功能总览
| 功能 | 说明 |
|---|---|
| 字典反查 | 逐行读取字典,计算哈希并与目标比对,多线程并行 |
| 自动识别 | 只给哈希、不选算法,按十六进制长度自动尝试所有可能的算法 |
| 暴力破解 | 自选字符集(大小写/数字/符号/自定义)、长度区间,支持已知前后缀 |
| NetNTLM | 直接粘贴 Responder / hashcat 的 NTLMv1、NTLMv2 整行即可破解(含 ESS) |
| 字符串加密 | 输入一段明文,正向算出它的哈希(可一次输出全部 39 种) |
| 自检 | 584 组来自 RFC / 官方测试集 / 独立实现的测试向量,一键验证 |
| 两种用法 | 中文交互式菜单,或命令行一次性调用(带退出码,方便脚本集成) |
三、支持的 39 种算法
基本把常见和不常见的标准哈希都覆盖了:
- MD 家族:MD2、MD4、MD5
- RIPEMD:RIPEMD-128 / 160 / 256 / 320
- SHA-1 家族:SHA-0、SHA-1、HAS-160(韩国 TTA 标准)
- SHA-2:SHA-224 / 256 / 384 / 512、SHA-512/224、SHA-512/256
- SHA-3:SHA3-224 / 256 / 384 / 512
- Keccak:Keccak-224 / 256 / 384 / 512(以太坊用的原始版本,和 SHA-3 填充不同)
- SHAKE:SHAKE128(取 32 字节)、SHAKE256(取 64 字节)
- BLAKE:BLAKE2s-256、BLAKE2b-256 / 384 / 512、BLAKE3-256
- 国产与国际标准:SM3、Whirlpool、Tiger
- 俄罗斯标准:GOST R 34.11-94(CryptoPro 与测试参数两套)、Streebog-256 / 512
- Windows 认证:NTLM(NT 哈希,
MD4(UTF-16LE(密码)))
另外单独支持 NTLMv1 / NTLMv2 挑战-应答值(下一节详述)。
十六进制长度只可能是 32 / 40 / 48 / 56 / 64 / 80 / 96 / 128 这 8 种。
自动识别模式下,同长度的算法会全部尝试——比如 32 位长度会依次试 MD2、MD4、MD5、RIPEMD-128、NTLM,命中后告诉你实际是哪一种。
没有包含的算法
Tiger2、Snefru、MD6、Skein、Edon-R、HAVAL、Panama、RadioGatún 这类”非标准 / 多变体 / 竞赛候选”没有收录,原因很简单:同一长度下存在多个版本,无法唯一确定,猜错了反而误导。CRC32/64 属于校验和,LM 哈希属于已废弃算法,也都不在范围内。
四、几个用起来很顺的细节
1. 输入校验
填哈希时会先检查格式,不合规直接说原因并让你重输:
!! 格式不正确: 第 1 个字符 'z' 不是十六进制字符 (只允许 0-9 a-f A-F)
!! 格式不正确: 长度不对: 该算法应为 64 个十六进制字符, 你输入了 33 个
大小写不敏感,自动去掉首尾空格、0x 前缀和粘贴带进来的 UTF-8 BOM。空串的哈希(d41d8cd98f00b204e9800998ecf8427e)也能正确破解。
2. 中文交互菜单
算法按家族分组,既能输入编号,也能直接写算法名或别名:md5、sha3-256、rmd160、blake2b、ntlm……
3. 多线程字典扫描
大字典按行边界切块并行读取,不漏行、不重复;超过约 2 MB 自动启用多线程,线程数可在菜单里随时改。
4. 命令行也能用
md5crack3.exe <哈希> [字典] [算法]
省略算法就自动识别,省略字典就依次尝试当前目录的 rockyou.txt、test.txt。命中返回 0,未命中返回 1,方便写进脚本。
五、暴力破解:不只是”跑字典”
字典里没有的密码,可以直接按字符集枚举。主菜单输入 b 进入:
请选择算法: 3
请输入要破解的哈希: 8a8bb7cd343aa2ad99b7d762030857a2
选择字符集 (可多选):
[1] 小写字母 a-z (26 个)
[2] 大写字母 A-Z (26 个)
[3] 数字 0-9 (10 个)
[4] 符号 !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ (33 个)
[5] 自定义字符
例: 1,3 = 小写+数字; 直接输入 abc123 则整个作为自定义字符集
请输入: 1,3
最小长度 (1-64, 回车=1): 1
最大长度 (回车=最小长度): 2
已知前缀:
已知后缀:
几个设计上比较实用的点:
- 字符集自由组合:
1,3、1+3、13、1 3等价;也可以直接把abc123整串当字符集; - 长度区间:可以只爆一个长度,也可以从 1 扫到 N;
- 已知前后缀:密码里已经确定的部分不用再枚举,候选词 = 前缀 + 枚举串 + 后缀;
- 空间预警:预估超过 1e12 条时会先提醒并让你确认,避免误开一个跑到天荒地老的任务;
- 结束暂停:跑完会停住,回车回主菜单、输入
q退出,答案不会被刷走。
一个真实例子:CTF 里的 MD5 flag
某题给了一个 MD5 值和一段提示,已知 flag 格式为 flag{...},并且前缀、后缀都能猜出来:
已知前缀 : "flag{www_shiyanbar_com_is_very_good_"
已知后缀 : "}"
字符集 : 95 个字符(可见 ASCII 全集)
长度 : 4 - 4
搜索空间 : 81,450,625 条
开始暴力破解 ... (线程 16)
-------------------- 结果 --------------------
[+] 破解成功!
明文 : flag{www_shiyanbar_com_is_very_good_@8Mu}
算法 : MD5
用时 : 0.815 秒
已尝试 : 32,896,712 条
速度 : 40.39 M 条/秒
原本 95⁴ ≈ 8145 万条的空间,因为前后缀固定,只需要枚举中间 4 位,0.8 秒出结果。
六、NetNTLM:直接粘贴 Responder 的结果
NTLMv1 / NTLMv2 不是固定长度的普通哈希,单独一段十六进制无法反查,必须带上服务器挑战(v2 还要 blob)。所以工具不需要在菜单里选算法,只要输入里带冒号,就自动按挑战-应答值处理:
NTLMv1: user::domain:LM响应:NT响应:challenge (48/48/16 位十六进制)
NTLMv2: user::domain:challenge:NTProofStr:blob (16/32/≥32 位十六进制)
也接受单冒号形式 user:domain:... 和 DOMAIN\user::...。
ESS 支持:NTLMv1 的 LM 字段如果是”客户端挑战 + 16 个 0”,会自动按扩展会话安全计算,实际挑战 = MD5(服务器挑战 ‖ 客户端挑战)[0..7],不需要手动处理。
计算方式严格按协议来:
NT 哈希 = MD4(UTF-16LE(密码))NTLMv1 = DESL(NT 哈希, challenge)NTLMv2 = HMAC-MD5( HMAC-MD5(NT 哈希, UPPER(用户名)+域名), challenge+blob )
命令行同样支持,整行用引号包住即可:
md5crack3.exe "user::WORKGROUP:0000...:b67957d9...:1122334455667788" rockyou.txt
限制:NT 响应全 0 的纯 LMv1、以及 LM 哈希(hashcat
-m 3000)暂不支持。
七、正确性:584 组外部测试向量
哈希工具最怕”算错了还告诉你没找到”。所以项目里所有算法的常数和实现都做了交叉验证,自检包含 584 组测试向量,全部来自独立于本实现的权威来源:
| 来源 | 覆盖范围 |
|---|---|
| RFC 1319 / RFC 1320 原文测试套件 | MD2、MD4 |
| RFC 6986 第 10 章示例 | Streebog-256/512 |
RHash 官方测试集 librhash/test_lib.c | Tiger、GOST-94、Keccak、HAS-160、Whirlpool、BLAKE2/3、Streebog 等 |
| Node.js crypto(OpenSSL 3) | MD5、SHA-1/2/3、SHAKE、BLAKE2、RIPEMD-160、SM3 |
Python hashlib / blake3 包 + BLAKE3 官方向量 | BLAKE2 全系列、BLAKE3(含 0–100 KB 多分块树结构) |
npm crypto-api | MD2、MD4、RIPEMD-128/160/256/320、HAS-160、SHA-0、Whirlpool |
Windows certutil(CryptoAPI) | NTLM(含中文、带变音符的 UTF-16LE 用例) |
.NET DES(Windows CNG) | NTLMv1 及 ESS 变体 |
Python hmac + hashlib.md5 | NTLMv2 的 NTProofStr |
随时可以自己验证:
md5crack3.exe --selftest
:: 自检结束: 共 584 项, 失败 0 项 -> 全部通过
八、性能实测
测试机:16 线程 CPU(无显卡参与)。
| 场景 | 速度 |
|---|---|
| MD5 暴力破解(短串) | 60–63 M 条/秒 |
| SHA-256 字典反查(rockyou 1400 万条 / 139 MB) | 约 0.4 秒扫完 |
| MD5 字典反查 | 同量级,随命中位置提前结束 |
| NTLMv1(每个候选 3 次 DES) | 约 1.2 M 条/秒 |
| NTLMv2(HMAC-MD5 ×2) | 约 1.2 M 条/秒 |
坦白说,纯 CPU 肯定跑不过 GPU 版 hashcat。它的优势是零依赖、即开即用、数据不出本机,在临时环境、客户现场、只能远程桌面的机器上特别省事。
九、编译与下载
源码用 C++17,任选一个编译器:
clang++ -std=c++17 -O2 -pthread md5crack3.cpp -o md5crack3.exe
g++ -std=c++17 -O2 -pthread md5crack3.cpp -o md5crack3.exe
cl /nologo /std:c++17 /O2 /EHsc md5crack3.cpp /Fe:md5crack3.exe
或者直接双击 build.bat,脚本会自动寻找可用编译器。
下载地址
- 蓝奏云:https://fanlepian.lanzouw.com/b0sz1vuxe
- 提取密码:
gyvd
压缩包内含源码、编译好的 md5crack3.exe、build.bat 和说明文档。建议第一次运行时先执行 md5crack3.exe --selftest 确认环境正常。
十、适用场景与边界
适合:
- CTF 杂项 / 密码学题目里还原哈希;
- 应急响应、取证时快速确认某个哈希对应的弱口令;
- 内网渗透中拿到 NetNTLM 后做离线破解(需授权);
- 教学演示:直观看到不同算法的摘要长度、填充差异;
- 开发自查:
--hash all一次算出 39 种结果,方便对比接口实现。
边界:
- 只按字典原样计算,不做规则变形(大小写变换、加数字后缀等);
- 能否破解取决于字典质量和搜索空间,哈希本身不可逆;
- SHAKE 是可变输出算法,本工具固定取 32 / 64 字节;
- NTLM 会把字典行按 UTF-8 转 UTF-16LE,GBK 字典需先转码;
- 纯 LM 响应和 LM 哈希不支持。
最后:哈希破解技术本身是中性的,请只在自己拥有或已获得明确授权的系统与数据上使用。未经授权对他人系统进行渗透、破解或取证,都可能触犯法律。
工具用 C++ 写成,算法实现、测试向量与文档都在压缩包里,欢迎自行审计和二次开发。



