工具介绍 Fcrackzip 是一个免费、快速的 ZIP 密码破解工具,由 Marc Lehmann (pcg@goof.com ) 开发,专门用于破解 ZIP 格式的加密压缩文件。该工具设计的初衷是作者对当时已有工具(如 fzc、zipcrack)的不满,它们要么速度慢,要么不开源,于是作者决定创造一个可移植、免费且可扩展的高速 ZIP 密码破解器。最新版本为 1.0,自发布以来未有重大更新,但仍广泛用于渗透测试和 CTF 场景中,如 Kali Linux 默认包含。
核心特性
免费开源 : GPL-2.0 许可,源代码公开可用,可自由定制和改进
高性能 : 部分核心代码使用 x86 汇编语言优化,在同代硬件上性能优于大多数同类工具
跨平台 : 使用 ISO-C 编写,支持 Linux、macOS、FreeBSD 等 Unix 系统,甚至 64 位平台。Windows 用户可通过 Cygwin 或 WSL 运行
多模式支持 :
暴力破解(brute-force)模式 :逐个尝试所有可能组合
字典攻击(dictionary)模式 :基于预设密码列表尝试
CP Mask 图像破解模式 :针对特定加密图像文件(PPM 格式)
灵活配置 : 支持自定义字符集、密码长度、多文件同时破解、分布式破解(部分支持)
多种破解方法 : 支持不同的 ZIP 加密格式 (zip1, zip2, cpmask)。默认使用 zip2 方法
假阳性过滤 : 使用 unzip 或 libzip 验证密码,减少无效结果
基准测试 : 内置性能基准,便于优化硬件配置或比较不同破解方法
性能对比 根据官方在旧硬件(如 Pentium-90 和 Pentium-II)上的测试数据:
在 Pentium-90 机器上,纯 C 版本比当时最快的 fzc 慢 12%
经过汇编优化后,比 fzc 快约 4-12%
在 Pentium-II 机器上,速度几乎是 fzc 的两倍
相比其他商业破解工具,fcrackzip 提供完整源代码和自由扩展能力
现代硬件更新 :在现代 CPU(如 Intel i7-12700H)上,暴力破解 6 位数字密码可达数百万次/秒(具体取决于字符集)。与 John the Ripper 或 hashcat 相比,fcrackzip 更专注于传统 ZIP 加密,速度相当但更轻量。建议使用 -B 参数在目标机器上自行基准测试。
ZIP 加密原理详解 ZIP 文件格式的加密基于 PKWARE 的 ZipCrypto 算法,这是一种基于密码的对称加密,但已知存在严重缺陷(如易受已知明文攻击)。加密过程:
使用用户提供的密码生成一个内部密钥流,用于加密文件内容
为了快速验证密码,ZIP 文件头包含一个 12 字节的校验区域。该区域由 10 或 11 个随机字节和 1 或 2 个已知值的字节组成
破解时,工具只需用尝试的密码解密这 12 字节,并检查最后的一或两个字节是否与已知值匹配
早期版本(PKZIP 1.xx)使用 2 字节校验,密码猜测错误的概率约为 1/65536 (≈0.01%)。后期版本(PKZIP 2.xx 及以后)只使用 1 字节校验,错误率提高到 1/256 (≈0.4%)
破解钩子 :fcrackzip 利用此机制,只解密头部进行快速检查。如果匹配,则认为密码“可能”正确,并通过 -u 参数调用 unzip 进行完整性验证,从而过滤掉假阳性
不支持 AES 加密 :fcrackzip 仅支持传统的 ZipCrypto 算法,不支持 WinZip AE-x 或 7-Zip 使用的 AES 加密标准
更多细节见 Wikipedia ZIP 加密页面。
安装方法 macOS 安装 1 2 3 4 5 brew install fcrackzip fcrackzip -h
Linux 安装 1 2 3 4 5 6 7 8 9 sudo apt install fcrackzipsudo dnf install epel-release sudo dnf install fcrackzip sudo pacman -S fcrackzip
源码编译 尽管原作者的官方网站(software.schmorp.de)和 CVS 仓库(cvs.schmorp.de)可能难以访问或已过时,但仍可通过 GitHub 上的镜像仓库获取源代码进行编译。
1 2 3 4 5 6 7 8 9 git clone https://github.com/hyc/fcrackzip.gitcd fcrackzip makesudo cp fcrackzip /usr/local/bin/
基本语法 1 fcrackzip [选项] 文件名.zip...
支持多个 ZIP 文件同时破解。提供多个使用相同密码加密的文件可以显著提高破解准确率,因为程序可以交叉验证,几乎消除假阳性。
参数详解 基本参数
参数
长参数
功能说明
-h
--help
显示帮助信息和版本号,包括可用方法列表
-v
--verbose
详细模式,显示更多信息(如进度、速度)。每个 -v 增加详细度
-V
--validate
验证破解算法的基本功能是否正常工作(用于开发和调试)
-B
--benchmark
执行一个简短的性能测试,输出每秒可尝试的密码数量
破解模式参数
参数
长参数
功能说明
-b
--brute-force
使用暴力破解模式。这是默认模式,可省略
-D
--dictionary
使用字典破解模式。字典文件需每行一个密码,建议按字母排序
字符集参数(仅暴力模式)
参数
长参数
功能说明
-c
--charset
指定暴力破解时使用的字符集
字符集说明 :
a: 小写字母 [a-z](26 个)
A: 大写字母 [A-Z](26 个)
1: 数字 [0-9](10 个)
!: 特殊字符 !:$%&/()=?{[]}+*~#(15 个)
:: 冒号后直接包含自定义字符(如 :abc@# 添加 a,b,c,@,#)。这允许包含任意字符(除了 null 字节)
组合示例 :
a1: 小写字母 + 数字(36 个字符)
aA1: 小写 + 大写 + 数字(62 个字符)
aA1!: 所有预设字符(77 个字符)
1:@#: 数字 + @ + #(12 个字符)
提示 :字符集越大,破解所需时间呈指数级增长。计算复杂度:(字符集大小) ^ (密码长度)
密码参数
参数
长参数
功能说明
-p
--init-password
在暴力模式下,设置初始密码(从指定字符串开始搜索);在字典模式下,指定字典文件的路径
-l
--length
设置密码长度范围,格式为 min-max。如果省略 max,则只测试长度为 min 的密码
高级参数
参数
长参数
功能说明
-u
--use-unzip
在找到可能正确的密码后,调用 unzip 程序尝试解压第一个文件以进行验证。这能有效过滤假阳性,强烈推荐启用
-m
--method
指定破解方法。可用方法包括 cpmask, zip1, zip2。默认是 zip2。使用 -h 查看完整列表
zip1 : 适用于旧版 PKZIP 1.xx 创建的压缩包
zip2 : 适用于新版 PKZIP 2.xx 创建的压缩包 | -2 | --modulo | 分布式破解,格式为 r/m。只计算密码空间的第 r 个部分(共 m 个部分)。这是一个实验性功能,尚未完全支持 |
暴力破解模式详解 暴力模式从初始密码开始,穷举所有组合。速度取决于硬件、字符集和密码长度。
基本暴力破解 1 2 3 4 5 fcrackzip -b test.zip fcrackzip -b -v test.zip
指定字符集的暴力破解 1 2 3 4 5 6 7 8 9 10 11 fcrackzip -b -c a test.zip fcrackzip -b -c aA1 test.zip fcrackzip -b -c aA1! test.zip fcrackzip -b -c 1:abc test.zip
指定密码长度 1 2 3 4 5 6 7 8 fcrackzip -b -l 6-6 test.zip fcrackzip -b -l 4-8 test.zip fcrackzip -b -c aA1 -l 1-10 test.zip
使用初始密码 1 2 3 4 5 6 fcrackzip -b -p abc123 test.zip fcrackzip -b -p pass -l 8-8 test.zip
完整的暴力破解示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 fcrackzip -b -c 1 -l 4-6 -v -u document.zip fcrackzip -b -c aA1 -l 6-10 -v -u backup.zip fcrackzip -b -c aA1 -p admin -v -u secret.zip fcrackzip -b -c 'aA1!' -l 8-12 -v -u complex.zip fcrackzip -b -c a1 -l 5-7 -v -u file1.zip file2.zip file3.zip fcrackzip -b -m zip1 -c aA1 -l 4-6 -v -u oldarchive.zip
当找到密码时,输出会显示 PASSWORD FOUND!!!!: pw == foundpass。
字典破解模式详解 字典模式从一个给定的密码列表中读取密码并逐个尝试,非常适合破解常用或有规律的密码。
准备字典文件 1 2 3 4 5 6 7 8 9 10 11 12 13 cat > password_dict.txt << EOF 123456 password admin 123456789 qwerty abc123 password123 admin123 root guest EOF
基本字典破解 1 2 3 4 5 fcrackzip -D -p password_dict.txt test.zip fcrackzip -D -p password_dict.txt -v -u test.zip
常用字典文件
Kali 自带 : /usr/share/wordlists/rockyou.txt(包含超过 1400 万个常见密码)
1 fcrackzip -D -p /usr/share/wordlists/rockyou.txt -v -u data.zip
SecLists 仓库 : GitHub 上一个活跃维护的密码列表集合
1 2 3 4 git clone https://github.com/danielmiessler/SecLists.git fcrackzip -D -p SecLists/Passwords/Common-Credentials/10-million-password-list-top-1000000.txt test.zip
创建高质量字典 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 seq -w 0000 9999 > numbers.txt fcrackzip -D -p numbers.txt test.zipfor year in {1980..2025}; do for month in {01..12}; do for day in {01..31}; do echo "${year} ${month} ${day} " done done done > dates.txt fcrackzip -D -p dates.txt test.zip crunch 6 8 aA1 -o mixed.txt fcrackzip -D -p mixed.txt test.zip
高级功能 性能测试 1 2 3 4 5 6 7 fcrackzip -B fcrackzip -B -m cpmask fcrackzip -B -m zip1 fcrackzip -B -m zip2
选择破解方法 1 2 3 4 5 fcrackzip -b -m zip1 test.zip fcrackzip -b -m zip2 test.zip
CP Mask 模式(针对加密图像) CP Mask 是一种用于混淆图像(或其部分)的方法。此模式用于破解这类文件的密码。
输入文件必须是PPM 图像格式
根据官方文档,此方法只能处理由大写字母组成的密码
1 2 fcrackzip --method cpmask --charset A --init-password AAAA test.ppm
分布式破解(实验性) --modulo r/m 参数允许将密码空间分割成 m 份,并只计算第 r 份。这需要用户手动在不同机器上运行多个实例。
1 2 3 4 5 6 fcrackzip -b -2 1/4 -c a1 -l 6 test.zip fcrackzip -b -2 2/4 -c a1 -l 6 test.zip
实际应用案例 案例1: 破解数字密码(CTF 入门) 场景:已知密码是 4-6 位数字
1 fcrackzip -b -c '1' -l 4-6 -v -u document.zip
预计时间:几秒(~1 百万组合)
案例2: 破解常见密码(备份文件) 场景:密码可能是常见的字母数字组合
1 fcrackzip -b -c 'aA1' -l 6-10 -v -u backup.zip
案例3: 已知部分密码(泄露前缀) 场景:已知密码以 “pass” 开头,剩余 4 位数字
1 fcrackzip -b -c '1' -p 'pass' -l 8 -v -u secret.zip
案例4: 使用字典破解(大规模) 场景:使用 RockYou 字典
1 fcrackzip -D -p /usr/share/wordlists/rockyou.txt -v -u data.zip
案例5: 混合攻击(字典失败后暴力,脚本自动化) 1 2 fcrackzip -D -p rockyou.txt -u test.zip || fcrackzip -b -c 'aA1' -l 6-8 -v -u test.zip
案例6: 破解加密图像(CP Mask) 场景:加密 PPM 图像
1 fcrackzip -m 0 -c 'aA' -l 4-6 -v image.ppm
已知限制与Bugs 根据官方文档,fcrackzip 存在一些已知的局限性:
没有停止/恢复功能 :程序中断后无法自动从断点恢复,需要手动使用 -p 参数指定上一个密码
不支持自动解压检查 :除非使用 -u 参数,否则程序本身不会验证密码的正确性
CRC 区分问题 :无法自动区分使用 16 位和 8 位 CRC 校验的 ZIP 文件
基准测试不通用 :-B 参数在某些系统上可能无法正常工作
CP Mask 限制 :cpmask 方法只接受 PPM 格式的图像文件
性能仍有提升空间 :作者承认,虽然经过优化,但代码仍有速度提升的潜力
常见问题解答 为什么破解失败?
密码太复杂 : 长度超过 12 位或使用了非常大的字符集,穷举所需时间可能长得不切实际
字符集不匹配 : 实际密码包含的字符未在 -c 参数中指定(例如,密码中含 @ 但字符集只有 aA1)
加密算法不支持 : ZIP 文件使用了 AES 加密(由 WinZip、7-Zip 等现代工具创建)。fcrackzip 不支持 AES,可以尝试使用 John the Ripper (--format=ZIP) 或 hashcat
文件损坏 : ZIP 文件本身已损坏。可以使用 zip -T test.zip 来测试文件完整性
假阳性未过滤 : 如果没有使用 -u 参数,程序可能会报告一个因哈希碰撞而产生的错误密码
如何提高破解成功率?
收集信息 : 进行社会工程学,了解密码可能的规律(如生日、姓名、公司名等),并据此生成针对性字典
使用高质量字典 : SecLists 等大型密码列表库是首选
组合攻击 : 先用字典攻击,如果失败,再尝试暴力破解
多文件验证 : 如果可能,提供 2-3 个用相同密码加密的文件,可以极大减少假阳性
选择正确的工具 : 如果怀疑是 AES 加密,应立即切换到支持 AES 的工具
性能优化建议
合理设置参数 : 准确地使用 -l(长度)和 -c(字符集)参数可以极大缩小搜索空间
启用 -u 参数 : 虽然会稍微降低速度(因为需要调用外部 unzip 程序),但可以避免在错误的密码上浪费时间,最终提高效率
硬件优化 : 在多核 CPU 上并行运行多个 fcrackzip 实例(见下文),并将字典文件放在高速 SSD 上
并行处理(使用 GNU parallel) 如果需要破解一个较大的密码范围,可以使用 parallel 工具在多个核心上同时运行。
1 2 parallel -j 4 "fcrackzip -b -c aA1 -l {}-{} -v -u test.zip" ::: 4 5 6 7
分段破解(手动分布式) 1 2 3 4 5 fcrackzip -b -c 'aA1' -l 8-10 -p 'a' -v -u test.zip & fcrackzip -b -c 'aA1' -l 8-10 -p 'b' -v -u test.zip & fcrackzip -b -c 'aA1' -l 8-10 -p 'c' -v -u test.zip &
参考链接