利用 7-Zip(7z.dll)对加密压缩包进行密码测试的工具,从密码字典中批量尝试密码,支持多线程并行测试与快速测试(优先测试最小的加密文件以加快验证速度)。
- 支持格式:7z、Zip、RAR(RAR4 / RAR5)
- 支持分卷压缩包:
xxx.7z.001、xxx.zip.001、xxx.part1.rar(测试时传入第一分卷) - 支持自解压格式(SFX):exe 封装的压缩包,自动在 PE stub 之后定位压缩数据
- 支持 header 加密压缩包(如 7z
-mhe=on、RAR-hp密码模式) - 自带 7-Zip 引擎:下载单个 exe 即可使用,无需预装 7-Zip(也可用系统已安装的版本或
-lib指定) - 不压缩加密数据快速判错:RAR4 没有密码校验字段、ZipCrypto 只有 1 字节校验,两者都只能靠解完整个文件 才能否决错误密码。对「不压缩(store)+ 未加密文件名」的包,工具改为只解密首块并比对文件格式签名, 实测 RAR4 约 1000 个/秒、ZipCrypto 约 40 万/秒,比完整解包快 1–2 个数量级; 命中的候选仍由 7-Zip 完整解包确认(边界见快速判错的边界)
- 慢速场景提前预警:7z 若使用 Copy(不压缩)编码且未加密文件名,每个错误密码都要解完整个数据 (实测 1.2GB + 250 万字典约 100 小时,加并行度也无效)。工具会在开始前按字典条数估算并明确告知, 而不是让用户静默等待
- 自动查找系统中已安装的 7-Zip,也可手动指定 7z.dll 路径;三者全无时给出官方下载引导(可选一键打开浏览器)
- 界面语言按系统自动切换:English / 简体中文 / 日本語 / Français / Русский
- 窗口标题反映真实进度:
ArchivePasswordTestTool v2.3.0 · 测试密码 42%,切到别的窗口也能从任务栏看出跑到哪了;结束时停在「已找到密码 / 未找到密码」。从终端启动时,退出后会把标题还给 shell,不留痕迹 - 控制台显示适配:启动时把代码页切到 UTF-8,并按实测字宽自动切换等宽字体(Consolas 等),避免中文 Windows 默认字体下
± · ×被画成两格导致的面板折行与进度条错位;程序退出时把字体与代码页还原成启动前的样子 - 程序图标由
build/AppIcon.svg在构建期用 resvg 栅格化成多分辨率透明 ICO(16/20/24/32/40/48/64/256),不随源码存放二进制图标;图标源是标准 SVG,可随意使用渐变、贝塞尔曲线、transform 等特性
ArchivePasswordTestTool.exe -D <字典文件> -F <压缩包文件>
| 参数 | 说明 |
|---|---|
-D |
密码字典文件路径,默认为 PasswordDictionary.txt,每行一个密码 |
-F |
要测试的压缩包路径,分卷包请传入第一个分卷 |
-lib |
可选,指定 7z.dll 路径,默认自动查找已安装的 7-Zip |
-Api |
可选,覆盖在线密码共享服务地址(默认 OnlineService.DefaultServiceUrl) |
-NoQuery |
关闭"测试前按哈希请求在线共享密码"(默认开启) |
-NoReport |
关闭"找到密码后自动回传"(默认开启) |
-FallbackFullDecode |
快速筛选按文件签名排除全部候选后,直接用 7-Zip 完整解密复核(默认询问) |
无任何参数直接启动(如双击 exe)时进入交互引导:把密码本与压缩包拖入窗口即自动识别路径开始测试(无需回车); 拖放后控制台窗口自动回到前台,无需再手动点击窗口。带参启动则完全按参数行事(缺失必需参数报错退出)。 双击启动出现错误时(如未安装 7-Zip),窗口会等待按键确认后才关闭,并给出 7-Zip 下载页引导;从终端运行则直接退出不等待。
数据模型:一个压缩包哈希对应一个密码。计算完压缩包哈希后会立即向在线服务查询该哈希的共享密码,
命中则优先测试;找到密码后自动回传供他人共享。两个功能默认开启、尽力而为
(网络失败只提示不阻断),可用 -NoQuery / -NoReport 分别关闭。
示例:
ArchivePasswordTestTool.exe -D dict.txt -F secret.7z
ArchivePasswordTestTool.exe -D dict.txt -F split.7z.001
ArchivePasswordTestTool.exe -D dict.txt -F installer.exe -lib "C:\Program Files\7-Zip\7z.dll"
测试完成时间与结果会直接输出;正式版还会询问是否保存测试结果文件(<压缩包名>[results].txt)。
字典编码自动识别:UTF-8、UTF-16(有 BOM)以及 GBK/ANSI(简中 Windows 记事本另存的默认编码)都能正确读取,无需手动转码。
| 变量 | 说明 |
|---|---|
APTT_PARALLELISM |
限制并行度(进程内线程数/工作进程数共用的总并发上限),设为 1 表示单线程执行 |
APTT_WORKERS |
指定 7z 测密的工作进程数(默认 = 逻辑核心数,取值 1 时退回进程内线程模式) |
APTT_TRACE |
设为 1 时将 COM 回调跟踪日志输出到 stderr,用于问题诊断 |
APTT_FORCE_EMBEDDED_7Z |
设为 1 时跳过系统已安装的 7-Zip,强制用内置的 7z.dll(系统那份版本过旧/损坏时可用) |
APTT_NO_FAST_FILTER |
设为 1 时关闭不压缩数据的快速判错(RAR4 / ZipCrypto),退回 7-Zip 完整解包(怀疑筛选误判时用于对照) |
APTT_NO_UPGRADE_CHECK |
设为 1 时跳过启动时的后台更新检查(离线/内网环境用) |
更新检查在启动最初发起(每小时最多请求一次,同一版本只提示一次),发现新版本会立即在后台下载:传输与测密全程并行,不占测密时间,结束时通常已经就绪。下载并校验通过后,本次测试结束(或中断)时会自动完成自我替换并重启一次,重启后只提示新版本号,不会重新跑一遍测密;若因目录只读、断网等原因没能立刻应用,则留到下次启动自动装上。下载失败只提示不重试阻塞,下个周期自动重试。配置(含检查时间戳与已提示版本)保存在 %LOCALAPPDATA%\ArchivePasswordTestTool\config.json,不会写入程序目录。
测密会自动选择并行方式,无需配置:
- 7z + 大字典:自动启动多个工作进程绕开 7z.dll 内部的密钥派生全局锁,吞吐随进程数接近线性 (实测 20 进程约 1300 个/秒)
- RAR / Zip:进程内多线程,并行度按物理核数给(
ProcessorCount-1会把 SMT 逻辑核算进来, 实测 8 核 16 线程上 15 线程比 8 线程慢约 40%);同时遵守进程亲和性掩码 (任务管理器「设置相关性」限制到 2 个核时只用 2 线程) - 不压缩加密数据(RAR4 store / ZipCrypto store):只解密首块 + 比对文件格式签名, 实测 RAR4 约 1000 个/秒(同一 1.2GB 包走完整解包只有 10 个/秒)、 ZipCrypto 约 40 万/秒(完整解包 1200 个/秒)
- 压缩编码(LZMA/LZMA2/BZip2/PPMd)与 WinZip AES 本来就快:错误密码在首块即被压缩流 结构或 2 字节校验值否决,与文件大小无关(实测 200MB 单文件 835–3754 个/秒)
- 工具允许多开,各实例独立测试互不干扰
只有一个组合会真正慢:7z 使用 Copy(不压缩)编码 + 未加密文件名。此时密文没有任何可校验结构, 每个错误密码都要解完整个文件才能靠文件尾 CRC 判错,实测 200MB 单文件每候选读满 126MB, 增加并行度也无效(瓶颈从密钥派生转到内存带宽)。工具会在开始前估算并给出提示。
原理、实测数据与已知取舍见开发文档。
快速判错依赖一个前提:正确密码解出的首块必然匹配某个已知文件格式。它收录 103 个扩展名、 47 种兜底格式(PNG/JPEG/MP4/ZIP/RAR/PDF/ELF/…),扩展名与内容不符也能靠兜底表认出。
有两种情况会让这个前提不成立:
- 扩展名撒谎:400 错误页存成
movie.mp4、下载中断的残缺文件 - 载荷被剥掉容器头:裸 PCM 存成
.wav、裸 H.264 存成.mp4
此时正确密码解出的首块是纯文本或裸数据,不带任何已知魔数,会被当作错误密码丢弃, 最终报「未找到」。这是确定性的,不是概率事件——内容不变,每次结果都一样。
工具不会默默接受这个结论:
- 在真实终端里会当场询问是否改用 7-Zip 完整解密复核(给出预计耗时,默认 N)
- 带
-FallbackFullDecode时无条件复核,适合无人值守 - 输出被重定向(
> log.txt、CI)时不询问也不复核,行为与从前一致 - 任何时候都可用
APTT_NO_FAST_FILTER=1彻底关闭快速判错
复核的代价就是这个包「不走快筛」的代价——1.2GB + 250 万字典约 100 小时,所以默认不自动执行。
- Windows x64 与 .NET 10 运行时(单文件发布 / Native AOT 已内置)
- 兼容未打全累积更新的旧版 Windows 10 / 11(宿主不启用 CET 影子栈,避免 .NET 10 启动自检直接退出)
- 不要求预装 7-Zip:程序自带 7-Zip 官方
7z.dll(构建时内嵌,首次运行解压到%LOCALAPPDATA%\ArchivePasswordTestTool\native)。若系统已安装 7-Zip,优先用系统那份; 也可用-lib指定自己的7z.dll - 若程序目录存在
ArchivePasswordTestToolGUI.exe,启动命令行版时会自动拉起 GUI
dotnet build -c Release
# Native AOT + UPX(约 4.2 MB)—— **对外发布用的就是这个**
dotnet publish ArchivePasswordTestTool\ArchivePasswordTestTool.csproj -c Release `
-p:PublishProfile=Properties\PublishProfiles\win-x64-aot.pubxml
# 单文件 + 裁剪(约 13.3 MB,兼容形态,CI 仍会构建验证)
dotnet publish ArchivePasswordTestTool\ArchivePasswordTestTool.csproj -c Release `
-p:PublishProfile=Properties\PublishProfiles\win-x64.pubxml
命令里显式写了 csproj:-p:PublishProfile 的路径是相对项目目录解析的,在仓库根不指定项目
就会发布整个解决方案,那个配置文件在测试项目里并不存在(会报 NETSDK1198 警告)。
测试项目已设 IsPublishable=false,所以即使从根目录发布也只会产出主程序。
两种形态都只产出一个 ArchivePasswordTestTool.exe,免安装 .NET、免装 7-Zip,自更新替换单文件。
Release 只挂 AOT 那一个 exe(体积与启动都更优;且 Upgrade 取「第一个 exe 资产」,
挂两个会让自更新在两种形态间不确定地切换)。
AOT 需本机装有 MSVC 链接器(Visual Studio「使用 C++ 的桌面开发」)。
7z.dll 自动内嵌:首次构建会从 7-Zip 官方 GitHub 发布点(github.com/ip7z/7zip,即
7-zip.org 下载页指向的仓库)取最新版,缓存到 tools\7zip\ 并编进程序集。缺网也能构建
(只是不内嵌,运行时回退到「需自行安装 7-Zip」)。固定版本用 -p:SevenZipVersion=26.05,
关闭内嵌用 -p:EnableEmbeddedSevenZip=false;CI 与发布额外传 -p:RequireEmbeddedSevenZip=true
让「拿不到 dll」变成构建失败,而不是静默产出不自包含的包。
UPX 默认开启:把 UPX 发行包里的 upx.exe 放到 tools\upx\ 即可(或用 -p:UpxPath=...),
之后每次 AOT 发布都会自动压缩;没放则打警告并跳过(产物约 11.3 MB 未压缩)。
-p:EnableUpx=false 可显式关闭。
程序图标需要 resvg:build\AppIcon.svg 由 resvg
渲染成各尺寸 PNG 再打包成 ICO。首次构建会自动下载 win-x64 版并缓存到 tools\resvg\
(约 4.3 MB 的单个静态可执行文件,无运行库依赖)。资产地址优先通过 gh api 读取发布里
真实的资产列表再按平台挑(上游改过命名,猜文件名不可靠);装了 GitHub CLI
并已登录即自动走这条路,否则回退到「跟随 latest 重定向 + 候选文件名」,两者都能构建成功。
与 UPX / 7z.dll 不同,resvg 缺失会让构建失败——图标是产物的一部分,不能降级。
离线环境可手工把 resvg.exe 放进 tools\resvg\,或用 -p:ResvgPath=... 指定;
固定版本用 -p:ResvgVersion=0.49.0(带不带 v 前缀都行)。
构建选项、体积/启动实测数据与取舍见开发文档。
架构说明、测试、多语言资源约定、CI 与发布流程: 见 docs/DEVELOPMENT.md。
dotnet test
见 LICENSE。