【Python实战】---- 破解加密压缩包

160 阅读3分钟

1. 场景

在我们开发过程中,会产生各个系统的账号密码,那么多账号密码人工记肯定记不住,这个时候就需要创建一个文档记录这次系统地址、账号、密码。但是最近公司要求此类文档必须加密压缩,不能是弱密码。然后由于一段时间没有使用,设置的密码相对还比较复杂,直接忘记了。只记得大概使用了那些字符或者单词以及数字,然后我又想起之前我写过一篇6位数数字密码的压缩包破解,【Python实战】---- 30行代码破解加密压缩包,此处不久有了用武之地!

2. 环境

  1. 命令解压工具 7-zip;7-zip下载
  2. python 自带的执行命令模块 subprocess;

3. 安装 7-zip 配置环境变量

  1. 安装 7-zip,找到 7-zip 的应用程序路径;
  2. 此电脑 --> 右键 --> 属性;
  3. 高级系统设置 --> 环境变量;
  4. 系统变量中找到path --> 选择path --> 编辑;
  5. 新建 --> 将第一步的安装路径拷贝进去 --> 确定。

3.1 安装 7-zip 路径

输入图片说明

3.2 配置环境变量

  1. 第一步 输入图片说明

  2. 第二步 输入图片说明

  3. 第三步 输入图片说明

  4. 第四步 输入图片说明

  5. 第五步 输入图片说明

  6. 第六步 输入图片说明

4. 验证密码

  1. 编写校验命令,通过需要解密的压缩包文件 xxxx.zip;
  2. 使用 subprocess.call(cmd) 执行命令,返回校验状态。
def verify_password(pwd):
  print(f'验证的密码是:{pwd}')
  cmd = f'7z t -p{pwd} ./xxxx.zip'
  status = subprocess.call(cmd)
  return status

5. 验证通过解密压缩包

  1. 输出正确的密码;
  2. 编写解密压缩包命令,解密 xxxx.zip 压缩包,将解密后的文件放在 output/ 文件夹下;
  3. 使用 subprocess.call(cmd) 执行命令,进行解密。
def unzip_file_other_folder(pwd):
  print(f'正确的密码是:{pwd}')
  cmd = f'7z x -p{pwd} ./xxxx.zip -y -aos -o"./output/"'
  subprocess.call(cmd)

6. 组装校验密码

  1. 由于我还记得组成密码的主体部分,就是特殊字符、单词、数字;
  2. 但是不清楚特殊字符是放在开头还是结尾,因此在特殊字符列表中添加了''字符串;
  3. 单词和数字的顺序也不清楚,因此中间部分放入一个列表;
  4. 循环列表组装密码;
  5. 使用 verify_password 校验密码,如果校验通过;
  6. 使用 unzip_file_other_folder 密码解压压缩包,并结束循环。
def get_all_possible_password():
  pwd_prev = ['@','!','#','','$','&','*']
  pwd_center = ['stone', 'Stone', '845619', '18684996656']

  for i in pwd_prev:
    for j in pwd_center:
      for l in pwd_center:
        for m in pwd_prev:
          pwd = i + j + l + m
          status = verify_password(pwd)
          if status == 0:
            unzip_file_other_folder(pwd)
            return

7. 完整代码

import time
import subprocess

def get_current_time_stamp():
  times = time.time()
  time_stamp = int(round(times * 1000))
  return time_stamp

def verify_password(pwd):
  print(f'验证的密码是:{pwd}')
  cmd = f'7z t -p{pwd} ./xxxx.zip'
  status = subprocess.call(cmd)
  return status

def unzip_file_other_folder(pwd):
  print(f'正确的密码是:{pwd}')
  cmd = f'7z x -p{pwd} ./xxxx.zip -y -aos -o"./output/"'
  subprocess.call(cmd)

def get_all_possible_password():
  pwd_prev = ['@','!','#','','$','&','*']
  pwd_center = ['stone', 'Stone', '845619', '18684996656']
  for i in pwd_prev:
    for j in pwd_center:
      for l in pwd_center:
        for m in pwd_prev:
          pwd = i + j + l + m
          status = verify_password(pwd)
          if status == 0:
            unzip_file_other_folder(pwd)
            return

if __name__ == "__main__":
  start = get_current_time_stamp()
  get_all_possible_password()
  end = get_current_time_stamp()
  print(f"解压压缩包用时:{end - start}ms")

8. 总结

  1. 此方法也可以实现完全不知道密码的情况,就是将所有的字母和特殊符号、数字全部依次进行组装校验;
  2. 只是这样会需要更多的时间校验,在我们完全忘记密码时,就可以使用此方法实现,希望没有那一天;
  3. 由于之前实现了一个类似需求,所以此次实现就是在原来的基础上进行了档次代码的修改和优化,根据每次不同需求,完成开发。