Skip to content

About

基于 7-Zip(7z.dll)从密码字典批量测试加密压缩包密码:支持 7z / Zip / RAR、分卷与自解压、header 加密,多进程并行高速测密

Topics

Resources

Stars

341 stars

Watchers

3 watching

Forks

Repository files navigation

ArchivePasswordTestTool

利用 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。

About

基于 7-Zip(7z.dll)从密码字典批量测试加密压缩包密码:支持 7z / Zip / RAR、分卷与自解压、header 加密,多进程并行高速测密

Topics

Resources

Stars

341 stars

Watchers

3 watching

Forks

Releases

Used by

Contributors

Languages