zoukankan      html  css  js  c++  java
  • 【python】80行代码实现压缩包密码破解软件,支持zip和rar


    1. 软件下载

    win64:https://ghgxj.lanzous.com/iEpZUj3998d

    maclinuxwin32用户请参考打包教程使用源代码打包。

    2. 破解测试

    在这里插入图片描述

    3. 文件说明

    • run.exe:压缩包密码破解软件,支持ziprar格式
    • pwd.txt:包含所有3位数的密码字典,从000999
    • res.txt:破解成功后保存密码的文件
    • 999.rar:加密的rar压缩包,加密密码是:999,里面的内容是一张图片
    • 999.zip:加密的zip压缩包,加密密码是:999,里面的内容是个txt文件
    • run.pypython源码
    • UnRAR64.dllrar解压依赖库文件
    • app.ico:软件图标
    • gan.py:生成密码字典的代码
    • readme.md:项目说明文件

    4. 项目简介

    这是一个基于python开发的压缩包密码破解软件,利用多线程技术高速地读取密码字典并对压缩包尝试破解。

    5. 项目地址

    github: https://github.com/XavierJiezou/python-compression-crack

    6. 破解思路

    压缩包加密算法基本上都是不可逆的,即我们不能在算法层面上推理出它的明文。所以我们只能用穷举法不断的碰撞,大白话就是随机生成很多密码,然后一个一个的试。具体思路如下:

    在这里插入图片描述

    7. 开发环境

    我们用到的模块有:

    from unrar.rarfile import RarFile
    import concurrent.futures as cf
    from zipfile import ZipFile
    import time
    import os
    

    ostimezipfileconcurrent.futures都是python内置模块,无需安装。


    unrar是第三方模块,可以通过pip指令安装:

    pip install unrar
    

    根据pypi官网可知,安装后还需要配置一下库文件才能正常使用:
    在这里插入图片描述

    具体配置教程如下:(windows)

    1、下载库文件的压缩包

    http://www.rarlab.com/rar/UnRARDLL.exe

    2、选择解压路径D:Program Files (x86)UnrarDLL,点击Install解压
    在这里插入图片描述

    3、解压后的主要目录结构如下:

    D:Program Files (x86)UnrarDLL
    ├─Documentation
    ├─Examples
    ├─NoCrypt
    ├─Examples
    └─x64
    │  └─UnRAR64.lib
    ├─UnRAR.lib
    

    4、配置系统环境变量。变量名必须是:UNRAR_LIB_PATH,变量值:D:Program Files (x86)UnrarDLLx64UnRAR64.dll(如果你是win32系统,变量值:D:Program Files (x86)UnrarDLLUnRAR.dll)
    在这里插入图片描述
    5、配置完成后,记得点击确定保存,然后重启代码编辑器vscodepycharm,不重启不会生效的!

    顺便一提:

    解压rar文件时,我们用的模块是unrar里面的rarfile,其实还有个直接叫rarfile的包,但是那个rarfile包依赖unrar环境,配置还很复杂,所以我直接放弃了,用unrar即可。

    8. 生成字典

    这里我生成了一个包含所有三位数的字典,并按行保存到pwd.txt文件中。

    f = open('pwd.txt', 'w')
    l = [str(i) for i in range(10)]
    for i in l:
        for j in l:
            for k in l:
                f.write(i+j+k+'
    ')
    f.close()
    

    当然,实际情况是很复杂的。密码可能不止三位,并且不仅包含数字,还有字母和特殊字符等。你可以在我的代码基础上做些修改,生成更为复杂的密码字典。如果你不想自己写代码,我这里也为大家准备好了一个43G的大字典(你下载的是压缩过的只有80MB,下载后请解压):

    43G大字典:https://ghgxj.lanzous.com/i8JR0j33r3a

    这里再推荐一个提供密码字典下载的网站:

    https://wiki.skullsecurity.org/Passwords

    9. 读取密码

    密码字典一般都很大,假如你用的密码字典是43GB,直接读整个文件的话可能会导致内存溢出,所以我们一般是按行读,读一行处理一行,处理完成后指针会自动帮你定位到下一行,往复循环即可,具体python实现如下:

    def crack(self, funcname):
        book = open(self.bookname)
        with cf.ThreadPoolExecutor(12) as tp:
            while True:
                pwd = book.readline().strip()
                tp.submit(funcname, pwd)
    

    10. 尝试破解

    10.1. 尝试破解zip格式的压缩包

    def zip_crack(self, pwd):
        runtime = self.show()
        print(f'破解已用时: {runtime} 当前密码: {pwd}', end='
    ')
        try:
            zip_file = ZipFile(self.filename)
            zip_file.pwd = pwd.encode()
            zip_file.extractall()
            print(f'破解已完成: {runtime} 压缩密码: {pwd}')
            with open('res.txt','w') as f:
                f.write(pwd)
            os._exit(0)
        except:
            pass
    

    10.2. 尝试破解rar格式的压缩包

    def rar_crack(self, pwd):
        runtime = self.show()
        print(f'破解已用时: {runtime} 当前密码: {pwd}', end='
    ')
        try:
            rar_file = RarFile(self.filename, pwd=pwd)
            rar_file.extractall()
            print(f'破解已完成: {runtime} 压缩密码: {pwd}')
            with open('res.txt','w') as f:
                f.write(pwd)
            os._exit(0)
        except:
            pass
    

    11. 完整代码

    # run.py
    from unrar.rarfile import RarFile
    import concurrent.futures as cf
    from zipfile import ZipFile
    import time
    import os
    
    
    class CompressionCrack(object):
        def __init__(self):
            self.filename = input('请输入压缩文件的绝对路径: ')
            self.bookname = input('请输入密码字典的绝对路径: ')
            self.startTime = time.time()
    
        def show(self):
            runtime = round(time.time()-self.startTime)
            if runtime > 3600:
                h = int(runtime/3600)
                m = int(runtime % 3600/60)
                s = runtime % 3600 % 60
                runtime = f'{h}h{m}m{s}s'
            elif runtime > 60:
                m = int(runtime/60)
                s = runtime % 60
                runtime = f'{m}m{s}s'
            else:
                runtime = f'{runtime}s'
            return runtime
    
        def zip_crack(self, pwd):
            runtime = self.show()
            print(f'破解已用时: {runtime} 当前密码: {pwd}', end='
    ')
            try:
                zip_file = ZipFile(self.filename)
                zip_file.pwd = pwd.encode()
                zip_file.extractall()
                print(f'破解已完成: {runtime} 压缩密码: {pwd}')
                with open('res.txt', 'w') as f:
                    f.write(pwd)
                os._exit(0)
            except:
                pass
    
        def rar_crack(self, pwd):
            runtime = self.show()
            print(f'破解已用时: {runtime} 当前密码: {pwd}', end='
    ')
            try:
                rar_file = RarFile(self.filename, pwd=pwd)
                rar_file.extractall()
                print(f'破解已完成: {runtime} 压缩密码: {pwd}')
                with open('res.txt', 'w') as f:
                    f.write(pwd)
                os._exit(0)
            except:
                pass
    
        def crack(self, funcname):
            book = open(self.bookname)
            with cf.ThreadPoolExecutor(12) as tp:
                while True:
                    pwd = book.readline().strip()
                    tp.submit(funcname, pwd)
    
        def main(self):
            if self.filename.endswith('.zip'):
                filetype = 1
            elif self.filename.endswith('.rar'):
                filetype = 0
            else:
                print('不支持的压缩格式,必须是rar或zip')
                os._exit(0)
            if filetype:
                self.crack(self.zip_crack)
            else:
                self.crack(self.rar_crack)
    
    
    if __name__ == "__main__":
        CompressionCrack().main()
    

    12. 软件打包

    推荐在pipenv创建的虚拟环境下打包,这样打包的体积会很小,具体打包教程如下:

    1. 执行命令pip install pipenv安装pipenv
    2. cd到项目路径,运行命令pipenv install创建虚拟环境
    3. 运行命令pipenv shell激活虚拟环境
    4. 安装项目开发中用到的第三方模块:pip install unrar
    5. 安装打包工具:pip install pyinstaller
    6. 执行打包命令:pyinstaller -F -i app.ico run.py

    第6步执行打包命令前先停一下。

    unrar模块依赖库文件UnRAR64.dll,所以先把UnRAR64.dll复制到项目路径下(win32复制UnRAR.dll)。

    然后修改pipenv创建的虚拟环境里面的unrar的代码,具体是修改C:Usersxxx.virtualenvspython-compression-crack-ZMK49n5qLibsite-packagesunrar路径下的unrarlib.py文件,将第33行代码由lib_path = os.environ.get('UNRAR_LIB_PATH', None)改为lib_path = 'UnRAR64.dll'

    好了,可以执行打包命令了:pyinstaller -F -i app.ico run.py

    13. 引用参考

    https://blog.csdn.net/qq_42951560/article/details/110097655

  • 相关阅读:
    为 HTTP/2 头压缩专门设计的 HPACK
    HTTP2 帧基础知识以及Header、CONTINUATION、DATA帧相关资料:
    扩充巴科斯-瑙尔范式 ABNF简介
    我Win下常用工具清单
    gRPC版本的 Google APIs
    gRPC 的route_guide例子
    proto3 笔记1
    编译gRPC Go版本使用的 ProtoBuffer 文件
    新浪校园招聘2013.10.30浙大玉泉4教301笔试的前端妹纸,像雾像雨又像风
    Android下Notification,样式style,主题theme的功能实现
  • 原文地址:https://www.cnblogs.com/ghgxj/p/14219074.html
Copyright © 2011-2022 走看看