📂 软件›安全

MD5Crack3:零依赖的 39 种哈希反查 / 爆破 / NetNTLM 破解工具

一个纯 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.cTiger、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-apiMD2、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.md5NTLMv2 的 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,脚本会自动寻找可用编译器。

下载地址

压缩包内含源码、编译好的 md5crack3.exe、build.bat 和说明文档。建议第一次运行时先执行 md5crack3.exe --selftest 确认环境正常。


十、适用场景与边界

适合:

  • CTF 杂项 / 密码学题目里还原哈希;
  • 应急响应、取证时快速确认某个哈希对应的弱口令;
  • 内网渗透中拿到 NetNTLM 后做离线破解(需授权);
  • 教学演示:直观看到不同算法的摘要长度、填充差异;
  • 开发自查:--hash all 一次算出 39 种结果,方便对比接口实现。

边界:

  • 只按字典原样计算,不做规则变形(大小写变换、加数字后缀等);
  • 能否破解取决于字典质量和搜索空间,哈希本身不可逆;
  • SHAKE 是可变输出算法,本工具固定取 32 / 64 字节;
  • NTLM 会把字典行按 UTF-8 转 UTF-16LE,GBK 字典需先转码;
  • 纯 LM 响应和 LM 哈希不支持。

最后:哈希破解技术本身是中性的,请只在自己拥有或已获得明确授权的系统与数据上使用。未经授权对他人系统进行渗透、破解或取证,都可能触犯法律。


工具用 C++ 写成,算法实现、测试向量与文档都在压缩包里,欢迎自行审计和二次开发。

安全工具 哈希破解 MD5 NTLM CTF

左右滑动换一页 · 点赞优先