字典破解zip


def pojie_zip(FilePath,PwdPath):
    zipFile = zipfile.ZipFile(FilePath    , 'r'  ,  zipfile.ZIP_DEFLATED)
    passFile = open  (  PwdPath  ,'r' )
    file = zipFile.namelist()
for pwd in passFile.readlines(): Pwds = pwd.rstrip('\n') Bpwd=Pwds.encode("utf-8") #轉換編碼 try: zipFile.extractall('F:/None',None,Bpwd) for file in zipFile.namelist(): zipFile.extract(file , r'F:/None' , Bpwd) print( "1" ) zipFile.close() break

except: pass passFile.close() zipFile.close() if __name__== '__main__' : pojie_zip( 'F:/test.zip' , 'F:/pwd.txt' )

 

 

 

 

/******************** 總結  **********************/

先說 File 文件

zipFile  =  zipfile.ZipFile(FilePath  ,  'r'  ,  zipfile.ZIP_DEFLATED)

打開一個文件,並返回這個對象;

FilePath:打開文件的路徑

’r‘:說明打開的方式 (這里是只讀形式)

zipfile.ZIP_DEFLATED: 是說壓縮編寫的方式(具體api介紹)

 

 passFile = open  (  PwdPath  ,'r' )

打開一個文件,並返回這文件對象;

PwdPath:打開的文件路徑

’r‘:說明是只讀方式

 

 file = zipFile.namelist( )

返回打開的zip包內的所有文件名,包括目錄下的文件名,返回類型<class 'list'>類型的字符串

 

passFile.readlines( ):

返回文件的一行內容,返回類型 <class 'str'> 類型的字符串

 

Pwds = pwd.rstrip('\n')

rstrip(char) 默認去除字符串后面的空格,這里是要求去除 \n ,這個函數是 python 3版本以上使用

python 2版本為  strip(char) 沒有前面的 r。 因為是pwd是<class 'str'>類型 所有 Pwds也是這個類型的字符串

 

 Bpwd=Pwds.encode("utf-8")   #轉換編碼

這個方法是將<class 'str'>類型 轉換為 <class 'tybe'>類型,如果不轉換 則下個函數無法使用Bpwd變量

 

  zipFile.extractall('F:/None',None,Bpwd)

文件對象調用 extractall()函數來解壓 zip 文件,解壓所有文件

參數1:是將解壓的文件保存在哪里或哪個文件夾下面,參數類型<class ,'str'>

參數2:是要解壓的具體文件,這里None是讓它默認解壓所有文件

參數3:是解壓需要的密碼,這個密碼需要 <class 'type'> 類型的字符串,這里有兩種方法可以使用這個類型 第一種是  b"123" 加前綴 b ,第二中就是使用上面的函數將變量轉換為這個類型。

 

  zipFile.extract(file  ,  r'F:/None'  , Bpwd)

和上面的函數一樣,只不過是解壓單個文件,參數的位置不同

參數1:需要解壓的文件名,參數類型<class ,'str'>

參數2:需要解壓完存放的地方,參數類型<class ,'str'>

參數3:解壓時需要的密碼,這里的密碼也是需要 <class 'type'>類型的字符串,兩種方法同上

 

    passFile.close()

    zipFile.close()

兩個對象都是調用關閉 io 的方法

 

總結: 寫的時候沒怎么思考,對函數的理解不太徹底,在運行報錯的時候總是不管不顧的百度去搜索,找到后復制粘貼就不了了之了,這個破解里卡的最厲害的部分就是  zipFile.extractall('F:/None',None,Bpwd) 這個函數的參數都需要什么類型,我一開始沒不知道,所以運行時總是報錯,要不就是解壓出來后文件夾目錄是空的,直到最后想起別人的提醒,才慢慢的向參數類型這方面的查找,最后找了半天總算是找到了。總結你對一個函數要了解透徹,不然運行報錯你都不知道錯在哪里。

 

解決問題的網址:

 

開始是想字符串轉數字的思路:

第一個是字符串與數值的轉換:

http://blog.163.com/liuyuhuan0915@126/blog/static/782654482011413114712117/

s = string.atoi( ' 18 ' ,  16)

(即'18'為16進制數的字符串,轉換為對應的10進制整數形式)

通過查 api 知道了這個 轉換時在 python 2 版本就被拋棄了得,所以不能用。其中還一些和它同等類的函數一樣是被拋棄的

string.atof(s) 浮點數轉換

第二是通過切片查找轉換類型:

https://segmentfault.com/q/1010000002620209

   def find(s):
for i in range(len(s)): if not '0'<=s[i]<='9': return i return len(s)
s
= '234jdsf23232ks' idx = find(s)
t
= int(s[ 0 :idx])

 

但是 通過 type(t) 的出的類型是 <class 'int'>類型  顯然這不是我需要的 <class 'byte'>的類型

后來通過找 api 才知道 這個 <class 'byte'> 類型是 Unicode 編碼格式,所以我想是不是可以通過自定義編碼格式改它的類型,最終在這個網站上找到了修改字符串編碼格式的函數

http://www.runoob.com/python3/python3-string.html

 

 


免責聲明!

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



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