Fcrackzip中文手册

文章发布时间:

最后更新时间:

文章总字数:
4.1k

页面浏览: 加载中...

工具介绍

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 方法
  • 假阳性过滤: 使用 unziplibzip 验证密码,减少无效结果
  • 基准测试: 内置性能基准,便于优化硬件配置或比较不同破解方法

性能对比

根据官方在旧硬件(如 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
# 使用 Homebrew 安装(支持 Apple Silicon 和 Intel)
brew install fcrackzip

# 验证安装
fcrackzip -h

Linux 安装

1
2
3
4
5
6
7
8
9
# Ubuntu/Debian/Kali
sudo apt install fcrackzip

# CentOS/RHEL/Fedora(需启用 EPEL 仓库)
sudo dnf install epel-release # 或 yum install epel-release
sudo dnf install fcrackzip # 或 yum install fcrackzip

# Arch Linux
sudo pacman -S fcrackzip

源码编译

尽管原作者的官方网站(software.schmorp.de)和 CVS 仓库(cvs.schmorp.de)可能难以访问或已过时,但仍可通过 GitHub 上的镜像仓库获取源代码进行编译。

1
2
3
4
5
6
7
8
9
# 从 GitHub 镜像克隆仓库
git clone https://github.com/hyc/fcrackzip.git
cd fcrackzip

# 编译安装(需要 gcc 和 make)
make

# 将可执行文件复制到系统路径(可选)
sudo 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
# 最简单的暴力破解,使用默认字符集 'a1' (小写字母+数字)
fcrackzip -b test.zip

# 使用详细模式,显示破解速度(如 100k p/s)
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

# 自定义字符集(例如,只包含 a,b,c 和数字)
fcrackzip -b -c 1:abc test.zip

指定密码长度

1
2
3
4
5
6
7
8
# 破解固定长度为 6 的密码
fcrackzip -b -l 6-6 test.zip

# 破解长度为 4 到 8 的密码
fcrackzip -b -l 4-8 test.zip

# 破解长度为 1 到 10 的密码,使用大小写字母和数字
fcrackzip -b -c aA1 -l 1-10 test.zip

使用初始密码

1
2
3
4
5
6
# 从指定密码 'abc123' 开始破解(可用于中断后恢复)
fcrackzip -b -p abc123 test.zip

# 从 'pass' 开始,破解总长度为 8 的密码
# 注意:fcrackzip 会自动补全到指定长度,这里会从 'passaaaa' 开始
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
# 示例1: 破解纯数字密码(CTF 常见),长度为4到6位,并使用unzip验证
fcrackzip -b -c 1 -l 4-6 -v -u document.zip

# 示例2: 破解常见的字母数字混合密码,长度为6到10位
fcrackzip -b -c aA1 -l 6-10 -v -u backup.zip

# 示例3: 从已知前缀开始破解(社会工程学获取)
fcrackzip -b -c aA1 -p admin -v -u secret.zip

# 示例4: 破解包含特殊字符的密码
fcrackzip -b -c 'aA1!' -l 8-12 -v -u complex.zip

# 示例5: 多文件破解,提高准确性
fcrackzip -b -c a1 -l 5-7 -v -u file1.zip file2.zip file3.zip

# 示例6: 为旧 ZIP 文件指定 zip1 方法
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

# 使用详细模式和 unzip 验证
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
# 创建纯数字字典(0000-9999)
seq -w 0000 9999 > numbers.txt
fcrackzip -D -p numbers.txt test.zip

# 创建日期字典(1980-2025 年,格式 YYYYMMDD)
for 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 工具生成复杂字典(需额外安装 crunch)
crunch 6 8 aA1 -o mixed.txt
fcrackzip -D -p mixed.txt test.zip

高级功能

性能测试

1
2
3
4
5
6
7
# 执行默认方法的性能测试(通常是 zip2)
fcrackzip -B

# 查看不同方法的性能
fcrackzip -B -m cpmask
fcrackzip -B -m zip1
fcrackzip -B -m zip2

选择破解方法

1
2
3
4
5
# 使用 zip1 方法(适用于旧文件)
fcrackzip -b -m zip1 test.zip

# 使用 zip2 方法 (默认,适用于新文件)
fcrackzip -b -m zip2 test.zip

CP Mask 模式(针对加密图像)

CP Mask 是一种用于混淆图像(或其部分)的方法。此模式用于破解这类文件的密码。

  • 输入文件必须是PPM 图像格式
  • 根据官方文档,此方法只能处理由大写字母组成的密码
1
2
# 破解 CP Mask 加密的图片,密码为4个大写字母,从 'AAAA' 开始
fcrackzip --method cpmask --charset A --init-password AAAA test.ppm

分布式破解(实验性)

--modulo r/m 参数允许将密码空间分割成 m 份,并只计算第 r 份。这需要用户手动在不同机器上运行多个实例。

1
2
3
4
5
6
# 在机器1上,计算密码空间的第1/4部分
fcrackzip -b -2 1/4 -c a1 -l 6 test.zip

# 在机器2上,计算密码空间的第2/4部分
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  # 总长 8

案例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 格式的图像文件
  • 性能仍有提升空间:作者承认,虽然经过优化,但代码仍有速度提升的潜力

常见问题解答

为什么破解失败?

  1. 密码太复杂: 长度超过 12 位或使用了非常大的字符集,穷举所需时间可能长得不切实际
  2. 字符集不匹配: 实际密码包含的字符未在 -c 参数中指定(例如,密码中含 @ 但字符集只有 aA1
  3. 加密算法不支持: ZIP 文件使用了 AES 加密(由 WinZip、7-Zip 等现代工具创建)。fcrackzip 不支持 AES,可以尝试使用 John the Ripper (--format=ZIP) 或 hashcat
  4. 文件损坏: ZIP 文件本身已损坏。可以使用 zip -T test.zip 来测试文件完整性
  5. 假阳性未过滤: 如果没有使用 -u 参数,程序可能会报告一个因哈希碰撞而产生的错误密码

如何提高破解成功率?

  1. 收集信息: 进行社会工程学,了解密码可能的规律(如生日、姓名、公司名等),并据此生成针对性字典
  2. 使用高质量字典: SecLists 等大型密码列表库是首选
  3. 组合攻击: 先用字典攻击,如果失败,再尝试暴力破解
  4. 多文件验证: 如果可能,提供 2-3 个用相同密码加密的文件,可以极大减少假阳性
  5. 选择正确的工具: 如果怀疑是 AES 加密,应立即切换到支持 AES 的工具

性能优化建议

  1. 合理设置参数: 准确地使用 -l(长度)和 -c(字符集)参数可以极大缩小搜索空间
  2. 启用 -u 参数: 虽然会稍微降低速度(因为需要调用外部 unzip 程序),但可以避免在错误的密码上浪费时间,最终提高效率
  3. 硬件优化: 在多核 CPU 上并行运行多个 fcrackzip 实例(见下文),并将字典文件放在高速 SSD 上

并行处理(使用 GNU parallel)

如果需要破解一个较大的密码范围,可以使用 parallel 工具在多个核心上同时运行。

1
2
# 在4个核心上并行破解长度为 4, 5, 6, 7 的密码
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 &
# ... 继续其他字母

参考链接