【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)\UnrarDLL\x64\UnRAR64.dll(如果你是win32系統,變量值:D:\Program Files (x86)\UnrarDLL\UnRAR.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+'\n')
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='\r')
    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='\r')
    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='\r')
        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='\r')
        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:\Users\xxx\.virtualenvs\python-compression-crack-ZMK49n5q\Lib\site-packages\unrar路徑下的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM