電腦一堆 RAR 可是忘了對應的密碼,要怎麼辦?原本想利用 WinRar 內建的 Unrar.exe 利用命令列方式逐一確認密碼,可是當密碼錯誤時會要求使用者輸入,這樣很難進行批次處理。再者他沒有明確的回傳值可供辨認密碼是否驗證成功,就算密碼正確也會把所有的檔案解出來不是很方便,所以我放棄了這條路。
上網找了一套 Advanced RAR Password Recovery 可用字典檔破解密碼,效果不錯可惜不支援分割檔的 RAR。
於是又找了 Python 模組是否有支援 UnRAR,找到了兩套分別是
ChilkaZip For Python 付費,且不確定是否支援密碼暫時不考慮。所以我選擇了 pyUnRAR,他的作法是透過 ctypes 呼叫原生的 UnRar.dll 來進行解壓縮,不過他的程式在我的 Python 2.6.2 有錯誤,且不支援檢測密碼是否正確的功能,所以,我決定改寫一個支援批次確認密碼的 python 模組,完整程式碼可在這裡找到。
我的實做部份主要在 Archive::check 摘錄如下:
def check(self): headerData = RARHeaderDataEx() if not 0 == RARReadHeaderEx(self._handle, ctypes.byref(headerData)): return False rarFile = RARFile(self, headerData) fn = str(random.random()).replace('.', '_') rarFile.extract(fn) if not os.path.exists(fn): return False os.remove(fn) return True
我採用兩段式檢查,第一段檢查是針對檔名被加密的 RAR,如果被加密而密碼又錯誤,則回傳值不等於 0。所謂的檔名加密,就是開啟 RAR 時不會看到壓縮檔內部的檔案列表,在 WinRAR 中的設定是如下:
可是如果沒有設定檔名加密,第一段檢查還是會通過可看到檔案列表,但是無法解出內容。所以第二段檢查是嘗試解壓縮一個檔案並檢查檔案是否存在來判斷密碼是否正確。這就是目前我的檢測密碼方式。不過這個作法的缺點是如果嘗試解壓縮的檔案比較大時,會耗損比較多的時間和運算,希望能有較好得作法可以改善這部份。
至於字典檔批次破解就更簡單了,只要一個迴圈逐一呼叫 Archive::check 進行檢測即可,片段摘錄如下:
def dic_check(dic_fn, rar_fn): valid_pwd = None for f in file(dic_fn): pwd = f.rstrip() r=Archive(rar_fn, pwd) try: if r.check(): valid_pwd = pwd break finally: r = None if valid_pwd is None: print 'not found' else: print 'password=' + valid_pwd
以下是執行結果如下:
有了這個程式我就不需要其他字典檔破解程式了 XDDD
你好..最近在清理電腦,結果發現有一個rar的檔案有加密。裡面容量有一百多MB..我上google找到你的破解方法,但我還是不明白可以幫我嗎?email: allen75826@hotmail.com感恩
如果你的密碼是已知集合,比如說你常用的密碼就那20組,那你用本文提到的方式就可以很方便的取回,如果你連密碼都沒有概念,那你就需要有一台很好的電腦,然後讓他將所有可能的密碼測過一遍就可以找出來了,不過很耗時~ 所以才稱之為"暴力法"
但如果密碼中含有中文呢?
如果密碼中含有中文、日文等怎麼辦?
就是在密碼檔中輸入中文或日文,然後存成 UTF-8 編碼… 不行嗎?
你好~想請教大大
batch_check_rar_pwd.py要放到哪執行?
可以寫詳細的步驟教學嗎?
急需要用!破解多個加密分割檔合併成一個檔
ㄟ 因為我沒有封裝成 exe
所以,你的電腦需要有 Python 2.6.x
然後將 batch_check_rar_pwd.py 和 unrar.dll 放於 c:\
將密碼檔 pass.txt, 壓縮檔 a.rar 也放在 c:\
執行方式就是在命令列 c:\ 輸入
python batch_check_rar_pwd.py pass.txt a.rar
即可
可以給你檔案幫忙解嗎?
我始終太笨理解不到
可以幫忙迫解嗎? 收費多少? 感恩
go213520@hotmail.com