压缩包 zip RAR 7z 密码破解常用的几种方法

本文介绍了Zip文件的一些解密方法,包括查看属性隐藏的密码、理解Zip伪加密机制、使用ZipCenOp.jar检测伪加密、暴力破解与字典攻击、以及CRC32碰撞解密。通过这些技巧,可以针对不同类型的Zip加密文件进行解密操作。

01.Zip属性隐藏

我们先从最简单的开始讲起,可能很多人没有去注意文件属性一栏,往往有时候,加密者会把密码放在属性里面,例如下图:

我们可以看到,这个Zip压缩文件的密码就是www.cnblogs.com了~

02.Zip伪加密

Zip伪加密是在文件头的加密标志位做修改,进而再打开文件时识被别为加密压缩包~

一个 Zip文件由三个部分组成:

压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志 

下面我们来看下这个例子:

压缩源文件数据区: 

50 4B 03 04:这是头文件标记(0x04034b50) 
14 00:解压文件所需 pkware 版本 
00 00:全局方式位标记(有无加密) 
08 00:压缩方式 
5A 7E:最后修改文件时间 
F7 46:最后修改文件日期 
16 B5 80 14:CRC-32校验(1480B516) 
19 00 00 00:压缩后尺寸(25) 
17 00 00 00:未压缩尺寸(23) 
07 00:文件名长度 
00 00:扩展记录长度 
6B65792E7478740BCECC750E71ABCE48CDC9C95728CECC2DC849AD284DAD0500 
压缩源文件目录区: 
50 4B 01 02:目录中文件文件头标记(0x02014b50) 
3F 00:压缩使用的 pkware 版本 
14 00:解压文件所需 pkware 版本 
00 00:全局方式位标记(有无加密,这个更改这里进行伪加密,改为09 00打开就会提示有密码了) 
08 00:压缩方式 
5A 7E:最后修改文件时间 
F7 46:最后修改文件日期 
16 B5 80 14:CRC-32校验(1480B516) 
19 00 00 00:压缩后尺寸(25) 
17 00 00 00:未压缩尺寸(23) 
07 00:文件名长度 
24 00:扩展字段长度 
00 00:文件注释长度 
00 00:磁盘开始号 
00 00:内部文件属性 
20 00 00 00:外部文件属性 
00 00 00 00:局部头部偏移量 
6B65792E7478740A00200000000000010018006558F04A1CC5D001BDEBDD3B1CC5D001BDEBDD3B1CC5D001 

压缩源文件目录结束标志: 

50 4B 05 06:目录结束标记 
00 00:当前磁盘编号 
00 00:目录区开始磁盘编号 
01 00:本磁盘上纪录总数 
01 00:目录区中纪录总数 
59 00 00 00:目录区尺寸大小 
3E 00 00 00:目录区对第一张磁盘的偏移量 
00 00:ZIP 文件注释长度

我们可以进行大胆的猜想:

如果把一个zip文件的文件头或者加密标志位进行适当修改,那就可能会改变文件的可读性~

我们可以用16进制编辑器添加文件头或文件尾,即可修复zip。

上面这种方法相对比较麻烦,不太容易操作,在Mac OS及部分Linux(如Kali)系统中,可以直接打开伪加密的zip压缩包,此时我们希望有种简便而通用的方法该怎么办呢?

我们推荐使用下面这种方法:

使用检测伪加密的ZipCenOp.jar,解密后如果能成功打开zip包,则是伪加密,否则说明思路错误

ZipCenOp.jar的下载我已经传到了本地,点击下载即可~

下面举个例子,如下是个被加密的文件,理由很简单,文件夹后面跟了一个*~

使用ZipCenOp.jar(需java环境)使用方法:

java -jar ZipCenOp.jar r xxx.zip

我们对其使用如上命令进行解包,得下图所示:

我们再看下这个文件:

发现文件夹后面跟的*消失了,说明这个文件就是伪加密文件~

当然啦,我们也可以对Zip文件进行伪加密~

java -jar ZipCenOp.jar e xxx.zip

03.暴力破解

顾名思义,就是逐个尝试选定集合中可以组成的所有密码,知道遇到正确密码~

而字典攻击的效率比爆破稍高,因为字典中存储了常用的密码,因此就避免了爆破时把时间浪费在脸滚键盘类的密码上~

而如果已知密码的某几位,如已知6位密码的第3位是a,那么可以构造 ??a??? 进行掩码攻击,掩码攻击的原理相当于构造了第3位为a的字典,因此掩码攻击的效率也比爆破高出不少~

对这一类的zip问题,Windows下我使用的是ARCHPR~

点击开始,进行爆破即可~下面是个演示,就花了4s的时间爆破出密码是MIT~

而所谓的字典攻击其实就是在字典选择合适的情况下,用很短的时间就能找到密码~如果需要字典的朋友可以私聊滴滴我,我可以发给你~

实例如下所示:

而掩码攻击就是通过已知密码的某几位进行构造,如下示例我们构造了??T进行爆破,仅花了81ms就破解了~

04.明文攻击

明文攻击是一种较为高效的攻击手段,大致原理是当你不知道一个zip的密码,但是你有zip中的一个已知文件(文件大小要大于12Byte)或者已经通过其他手段知道zip加密文件中的某些内容时,因为同一个zip压缩包里的所有文件都是使用同一个加密密钥来加密的,所以可以用已知文件来找加密密钥,利用密钥来解锁其他加密文件~

此时我们可以尝试用ARCHPR或者pkcrack进行明文攻击~

更新明文攻击这部分文档:记一道明文破解的漫长斗争史 - Angel_Kitty - 博客园

举个例子,下载链接在这里

我们可以看到readme.txt是加密压缩包里的readme.txt的明文,所以可以进行明文攻击~

将readme.txt压缩成.zip文件,然后在软件中填入相应的路径即可开始进行明文攻击,这里我们用ARCHPR进行演示~

可能有些朋友会说ARCHPR怎么行不通啊,一般是版本不对的问题~

如果还是有问题怎么办呢?那就尝试用下pkcrack

似乎网站日常会崩,所以我把文件上传到了本地~

有些朋友在Windows下会出现如下错误:

那是因为pkcrack只支持32位的,所以运行这个需要在XP系统下进行

而选择Linux的话则不需要这么麻烦,直接安装就好了,还有一种更快的办法~

我已经把项目上传到Github上,文件在这里:ctf-tools/pkcrack at master · AngelKitty/ctf-tools · GitHub

我们写个shell脚本就好了~

#!/bin/bash -ex

wget https://www.unix-ag.uni-kl.de/~conrad/krypto/pkcrack/pkcrack-1.2.2.tar.gz
tar xzf pkcrack-1.2.2.tar.gz
cd pkcrack-1.2.2/src
make

mkdir -p ../../bin
cp extract findkey makekey pkcrack zipdecrypt ../../bin
cd ../../

把文件保存,改为install.sh,然后跑到当前目录下,给它加一个执行权限x

chmod 777 install.sh

或者直接可以:

chmod u+x install.sh

然后运行install.sh

./install.sh

然后当前目录下会生成一个bin的文件夹,我们直接进入bin文件夹下,看到有pkcrack文件,直接对文件进行明文破解

./pkcrack -c "answer/key.txt" -p readme.txt -C Desktop.zip -P readme.zip

-C:要破解的目标文件(含路径)

-c:破解文件中的明文文件的名字(其路径不包括系统路径,从zip文件一层开始)

-P:压缩后的明文文件

-p:压缩的明文文件中明文文件的名字(也就是readme.txt在readme.zip中的位置)

至于其他选项参看./pkcrack --help

pkcrack还有一个重要的选项是-d,后面跟一个文件名,比如decrypt.zip,表示解密后的zip文件输出。据说这个命令可以加快解密时间,我尝试过以后发现并没有快多少,所以我花了两个小时还没跑出来密码QAQ

05.CRC32碰撞

CRC32:CRC本身是“冗余校验码”的意思,CRC32则表示会产生一个32bit(8位十六进制数)的校验值。

在产生CRC32时,源数据块的每一位都参与了运算,因此即使数据块中只有一位发生改变也会得到不同的CRC32值,利用这个原理我们可以直接爆破出加密文件的内容~

具体算法实现参考百度百科:CRC32_百度百科

我们看个CRC32碰撞的例子:

flag是4位数,且CRC32值为56EA988D

我们可以写出如下脚本:

#coding=utf=8
import binascii
real = 0x56EA988D
for y in range(1000,9999):
    if real == (binascii.crc32(str(y)) & 0xffffffff):
        print(y)
print('End')

在 Python 2.x 的版本中,binascii.crc32 所计算出來的 CRC 值域为[-2^31, 2^31-1] 之间的有符号整数,为了要与一般CRC 结果作比对,需要将其转为无符号整数,所以加上& 0xffffffff来进行转换。如果是 Python 3.x 的版本,其计算结果为 [0, 2^32-1] 间的无符号整数,因此不需额外加上& 0xffffffff 。

脚本的运行结果如下,即为压缩文件的内容:

拓展与补充

<think>嗯,用户想用Python解压RAR压缩包,需要列举几种方法。首先我得回忆一下Python处理压缩文件的库。常见的zip文件有内置的zipfile模块,但RAR的话可能不是内置的。 对了,我知道有个第三方库叫rarfile,可以用来解压RAR。不过可能需要先安装unrar工具,或者配置环境变量?这点可能需要详细说明,因为用户可能会遇到找不到unrar的情况。 另外,除了rarfile,有没有其他方法呢?比如用subprocess调用系统命令,比如安装7-Zip或者WinRAR的命令行工具,然后在Python里执行解压命令。这种方法虽然依赖外部软件,但可能更直接,特别是当用户已经安装了这些软件的情况下。 还有,有没有其他库支持RAR解压?比如patool,它是一个处理多种压缩格式的库,可能背后也是调用其他工具。不过可能需要检查它的依赖关系。 那总结下来,可能的几种方法: 1. 使用rarfile库,但需要安装unrar。 2. 使用subprocess调用系统命令行工具,如unrar或7-Zip。 3. 使用patool库作为统一的接口,可能内部调用rarfile或其他工具。 需要分步骤说明每种方法的安装和使用步骤,特别是注意事项,比如路径问题,或者权限问题。还要提醒用户RAR的专利问题,确保合法使用。 另外,要确认这些方法在Windows和Linux下的不同,比如安装unrar在Linux下可能用apt-get,而Windows需要下载exe并设置环境变量。这点用户可能需要注意。 可能用户会遇到的问题包括:安装rarfile后仍然报错,找不到unrar,这时候需要指导他们如何安装unrar。或者使用命令行方法时,路径中有空格需要处理,或者权限不足。 最后,应该给出示例代码,展示每种方法的具体使用,比如使用rarfile的extractall方法,或者subprocess调用7z命令。同时提醒异常处理,比如文件是否存在,密码保护的情况。 需要结构清晰,分点说明,每种方法的优缺点,以及适用场景。比如rarfile适合纯Python环境,但需要额外安装;命令行方法可能更直接但依赖外部软件。</think>使用Python解压RAR压缩包可以通过以下方法实现: --- ### 方法一:使用 `rarfile` 库(需安装依赖) **步骤:** 1. 安装库和工具: ```bash pip install rarfile # Windows:需下载并安装WinRAR或UnRAR工具,并将路径添加到系统环境变量 # Linux:安装unrar sudo apt-get install unrar # Debian/Ubuntu ``` 2. 代码示例: ```python import rarfile rar_path = "example.rar" extract_dir = "./output" rf = rarfile.RarFile(rar_path) rf.extractall(extract_dir) rf.close() ``` **注意:** - 若报错`Rar cannot open`,需确保系统已正确安装UnRAR工具。 --- ### 方法二:调用命令行工具(如7-Zip) **步骤:** 1. 安装7-Zip并记录可执行文件路径(如`C:\Program Files\7-Zip\7z.exe`)。 2. 使用Python调用命令行: ```python import subprocess rar_path = "example.rar" extract_dir = "./output" 7z_path = r'"C:\Program Files\7-Zip\7z.exe"' # Windows路径含空格需用双引号包裹 cmd = f"{7z_path} x {rar_path} -o{extract_dir} -y" subprocess.run(cmd, shell=True) ``` **注意:** - `-y`参数表示覆盖已存在的文件。 - Linux下可使用`unrar`命令,如`unrar x example.rar ./output`。 --- ### 方法三:使用 `patool` 库(跨格式解压) **步骤:** 1. 安装库和依赖: ```bash pip install patool # 仍需安装unrar7z命令行工具 ``` 2. 代码示例: ```python import patoolib rar_path = "example.rar" extract_dir = "./output" patoolib.extract_archive(rar_path, outdir=extract_dir) ``` --- ### 对比总结 | 方法 | 优点 | 缺点 | |------------|---------------------------|-------------------------------| | `rarfile` | 纯Python调用 | 依赖外部工具(需手动安装UnRAR)| | 命令行调用 | 直接使用成熟工具 | 路径和跨平台兼容性需处理 | | `patool` | 支持多格式(RAR/ZIP等) | 同样依赖外部工具 | --- ### 常见问题 1. **RAR密码保护文件**: ```python # rarfile支持密码参数 rf = rarfile.RarFile(rar_path) rf.extractall(extract_dir, pwd="password") ``` 2. **路径问题**: - 使用`os.path`处理路径分隔符,如`os.path.join("folder", "file.rar")`。 --- 建议优先选择`rarfile`+UnRAR组合,适合代码集成;若需跨平台兼容性,可使用命令行调用。
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值