第一次使用csdn寫文章,寫得不好還請見諒。(運行環境:python3.6)
下了一個帶密碼的壓縮包文件,作為一個剛學python的新手,想著能不能用python暴力破解它,于是在網上搜了很多資料,看著似乎并不是很麻煩,也想試著自己寫一個可以暴力破解的程序,在寫的過程中卻遇到了各種各樣的問題,希望大手們能帶帶我。遇到的問題如下:
- zipfile和zipfile2似乎都不支持AES解密(https://bugs.python.org/issue9170)
- 在用rarfile暴力破解時即使密碼錯誤也不拋出異常,因此無法用try,except捕獲密碼
本來是想寫一個可以同時暴力破解zip和rar的程序,在試了半天解密zip卻一直提示密碼錯誤之后放棄了zip,想著能不能寫一個暴力破解rar的程序。
首先是生成字典:要用到itertools模塊
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import itertools as its import string def createDict(path,repeats,words): dict = its.product(words,repeat = repeats) '''這里的words是要迭代的字符串,repeats是生成的密碼長度,生成的dict是一個返回元組的迭代器''' f = open (path, 'a' ) for cipher in dict : f.write(' '.join(cipher) + ' \n') f.close() def main(): numbers = string.digits #包含0-9的字符串 path = '輸入你的字典路徑' length = 你要迭代的密碼長度 for i in range ( 1 ,length): createDict(path,i,numbers) if __name__ = = "__main__" : main() |
到這里我們的字典已經生成完畢了,接下來開始暴力破解rar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
from threading import Thread from unrar import rarfile import os '''首先我們要讀取字典,字典可能太大因此我們采用迭代器''' def get_pwd(dict_path): with open (dict_path, 'r' ) as f: for pwd in f: yield pwd.strip() def decode_rar(fp,pwd,extract_path): try : fp.extractall(extract_path,pwd = pwd) except : pass else : print ( 'the pwd is>' ,pwd) ''' 事實上我在嘗試時似乎從來沒有到達過else,這樣可能是得不到解壓密碼的。我的 一種得到密碼的想法如下,但是運行效率可能會降低 def decode_rar(fp,pwd,check_file,extract_path): fp.extractall(extract_path,pwd=pwd) if os.path.exists(check_file): print('The pwd is:',pwd) exit(0) 其中check_file可以設置為fp.namelist()[0] 并且該方法不能使用多線程,因此速度會降低很多 ''' def main(): extract_path = '你要解壓的路徑' dict_path = '你的字典路徑' filename = '你的rar路徑' fp = rarfile.RarFile(filename) pwds = get_pwd( dict ) '''使用多線程可提高速度''' for pwd in pwds: t = Thread(target = rar_file,args = (fp,pwd,extract_path)) t.start() |
以上是寫程序的思路和遇到的各種坑,代碼是手敲的,可能有一些錯誤,希望能得到諒解和幫助。
下面是一個圖形界面的rar解密源代碼:(圖形只是想練習,運行較慢,建議直接運行上面的函數)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
import tkinter as tk import os from tkinter import messagebox from unrar import rarfile from threading import Thread def getPwd( dict ): with open ( dict , 'r' ) as f: for pwd in f: yield pwd.strip() def slowerDecode(fp,pwd,check_file,extract_path): fp.extractall(extract_path,pwd = pwd) if os.path.exists(check_file): messagebox.showinfo(message = "密碼:" + pwd) messagebox.showinfo(message = "程序結束" ) messagebox.showinfo(message = "密碼:" + pwd) exit( 0 ) def quickDecode(fp,pwd,extract_path): fp.extractall(extract_path,pwd = pwd) def check(obs): flag = 1 for ob in obs: if not ob.checkExist(): flag = 0 ob.showError() if ( not flag): return 0 else : for ob in obs: if not ob.check(): flag = 0 ob.showError() if ( not flag): return 0 else : for ob in obs: ob.right() return 1 def main(obs): extract_path = obs[ 0 ].path_input.get() rar_path = obs[ 1 ].path_input.get() txt_path = obs[ 2 ].path_input.get() pwds = getPwd(txt_path) global var1 global var2 if (check(obs)): if (var1.get() = = 0 and var2.get() = = 0 ): messagebox.showerror(message = "選擇一個選項!!!" ) elif (var1.get() = = 0 and var2.get() = = 1 ): fp = rarfile.RarFile(rar_path) check_file = fp.namelist()[ 0 ] for pwd in pwds: slowerDecode(fp,pwd,check_file,extract_path) elif (var1.get() = = 1 and var2.get() = = 0 ): fp = rarfile.RarFile(rar_path) for pwd in pwds: t = Thread(target = quickDecode,args = (fp,pwd,extract_path)) t.start() exit( 0 ) else : messagebox.showerror(message = "只選擇一個!!!" ) class FolderPath: def __init__( self ,y = 0 ,error_message = "Not exists!" ,path_input = "",text = ''): self .y = y self .error_message = error_message self .path_input = path_input self .text = text def createLabel( self ): label = tk.Label(window,bg = "white" ,font = ( "楷體" , 13 ),width = 20 ,text = self .text) cv.create_window( 100 , self .y,window = label) def createEntry( self ): entry = tk.Entry(window,fg = "blue" ,width = "40" ,bg = "#ffe1ff" ,textvariable = self .path_input) cv.create_window( 330 , self .y,window = entry) def show( self ): self .createLabel() self .createEntry() def showError( self ,color = "red" ): label = tk.Label(window,bg = "white" ,fg = color,font = ( "楷體" , 13 ),width = "10" ,text = self .error_message) cv.create_window( 530 , self .y,window = label) def checkExist( self ): self .error_message = 'Not exists!' if not os.path.exists( self .path_input.get()): return 0 return 1 def check( self ): if not os.path.isdir( self .path_input.get()): self .error_message = 'Not a dir!' return 0 else : return 1 def right( self ): self .error_message = "right path!" self .showError( '#00FFFF' ) class FilePath(FolderPath): def check( self ): if ( self .path_input.get().split( '.' )[ - 1 ] = = self .suffix): return 1 else : self .error_message = "Not " + self .suffix + '!' return 0 window = tk.Tk() window.title( 'made by qiufeng' ) window.geometry( '600x300' ) cv = tk.Canvas(window,width = 600 ,height = 300 ,bg = 'white' ) cv.pack() folderpath = FolderPath(y = 140 ,path_input = tk.StringVar(),text = "請輸入解壓路徑" ) folderpath.show() rarpath = FilePath(y = 60 ,path_input = tk.StringVar(),text = "請輸入rar路徑" ) rarpath.suffix = 'rar' rarpath.show() txtpath = FilePath(y = 100 ,path_input = tk.StringVar(),text = "請輸入字典路徑" ) txtpath.suffix = 'txt' txtpath.show() obs = [folderpath,rarpath,txtpath] #多選框 var1 = tk.IntVar() var2 = tk.IntVar() ck1 = tk.Checkbutton(window,text = "直接破解(無法獲得密碼)" ,variable = var1) cv.create_window( 150 , 200 ,window = ck1) ck2 = tk.Checkbutton(window,text = "慢速(可獲得密碼)" ,variable = var2) cv.create_window( 132 , 230 ,window = ck2) button = tk.Button(window,text = "確認" ,command = lambda : main(obs)) cv.create_window( 90 , 260 ,window = button) window.mainloop() |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/weixin_43873887/article/details/87862831