Thư viện
zipfile để xử lí file Zip.
Thư viện
rarfile để xử lí file Rar.
Thư viện
UnRAR, thư viện rarfile bắt buộc đi kèm với thư viện này
Thư viện
os để kiểm tra file.
Thư viện
argparse để nhận các Argument.
Thư viện
threading để tăng tốc bằng cách xử lí đa luồng.
Thư viện
itertools để tạo các chuỗi password.
Thư viện
time để tính thời gian (cái này mình đưa vào để tính xem mất bao lâu thôi chứ nó không bắt buộc ).
Đầu tiên ta tạo một biến lưu giá trị của tất cả các kí tự trên bàn phím:
CHARACTER ='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&()'
Sau đó viết các argument cần thiết:
parser = argparse.ArgumentParser(description='Crack zip rar', epilog='Use the -h for help')
parser.add_argument('-i','--input', help='Insert the file path of compressed file', required=True)
parser.add_argument('rules', nargs='*', help='<min> <max> <character>')
Ta viết một class check các argument:
class Check:
def __init__(self, Arg):
self.type = None
self.rules = False
self.minLength = None
self.maxLength = None
self.character = None
if len(Arg) >= 4:
self.getData(Arg)
self.rules = True
elif len(Arg) == 0 or len(Arg) > 2:
parser.print_help()
parser.exit()
if (self.CheckFileExist(Arg)):
self.getType(Arg)
else:
print ('No such file or directory: ',Arg[1])
parser.exit()
def CheckFileExist(self, Arg):
if (os.path.isfile(Arg[1])):
return True
else:
return False
def getData(self, Arg):
try:
self.minLength = int(Arg[2])
self.maxLength = int(Arg[3])
except ValueError:
print ('Value Error')
parser.exit()
if self.minLength > self.maxLength:
print ('Length Error')
parser.exit()
if len(Arg) == 5:
self.character = Arg[4]
def getType(self, Arg):
if os.path.splitext(Arg[1])[1] == ".rar" or os.path.splitext(Arg[1])[1]==".zip":
self.type = os.path.splitext(Arg[1])[1]
else:
print ('Extension Error')
parser.exit()
Tiếp tục ta viết class chính để xử lí:
class Handler:
def __init__(self, rules, typeCompress, minLength, maxLength, character):
self.rules = rules
self.location = sys.argv[2]
self.type = typeCompress
self.minLength = minLength
self.maxLength = maxLength
if not character:
self.character = CHARACTER
else:
self.character = character
self.result = False
self.GetFile()
self.CheckRules()
def GetFile(self):
if self.type == '.zip':
self.FileCrack = zipfile.ZipFile(self.location)
else:
self.FileCrack = rarfile.RarFile(self.location)
def Brute(self,password):
try:
if self.type == '.zip':
tryPass = password.encode()
else:
tryPass = password
print (tryPass)
self.FileCrack.extractall(pwd=tryPass)
print ('Complete')
print('Time:',time.clock() - self.start_time,'s')
print ('Password:',password)
self.result = True
except:
pass
def CheckRules(self):
self.start_time = time.clock()
print ('Cracking...')
if not self.rules:
length = 1
while True:
self.SendRequest(length)
if self.result:
return
length += 1
else:
for length in range(self.minLength, self.maxLength + 1):
self.SendRequest(length)
if self.result:
return
if not self.result:
print ('Cannot find password with this rules')
return
def SendRequest(self,length):
listPass = product(self.character, repeat=length)
for Pass in listPass:
tryPass = ''.join(Pass)
self.Brute(tryPass)
if self.result:
return
Toàn bộ code:
import zipfile
import rarfile
import os
import sys
from threading import Thread
import argparse
from itertools import product
import time
parser = argparse.ArgumentParser(description='Crack zip rar', epilog='Use the -h for help')
parser.add_argument('-i','--input', help='Insert the file path of compressed file', required=True)
parser.add_argument('rules', nargs='*', help='<min> <max> <character>')
CHARACTER = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()'
class Check:
def __init__(self, Arg):
self.type = None
self.rules = False
self.minLength = None
self.maxLength = None
self.character = None
if len(Arg) >= 4:
self.getData(Arg)
self.rules = True
elif len(Arg) == 0 or len(Arg) > 2:
parser.print_help()
parser.exit()
if (self.CheckFileExist(Arg)):
self.getType(Arg)
else:
print ('No such file or directory: ',Arg[1])
parser.exit()
def CheckFileExist(self, Arg):
if (os.path.isfile(Arg[1])):
return True
else:
return False
def getData(self, Arg):
try:
self.minLength = int(Arg[2])
self.maxLength = int(Arg[3])
except ValueError:
print ('Value Error')
parser.exit()
if self.minLength > self.maxLength:
print ('Length Error')
parser.exit()
if len(Arg) == 5:
self.character = Arg[4]
def getType(self, Arg):
if os.path.splitext(Arg[1])[1] == ".rar" or os.path.splitext(Arg[1])[1]==".zip":
self.type = os.path.splitext(Arg[1])[1]
else:
print ('Extension Error')
parser.exit()
class Handler:
def __init__(self, rules, typeCompress, minLength, maxLength, character):
self.rules = rules
self.location = sys.argv[2]
self.type = typeCompress
self.minLength = minLength
self.maxLength = maxLength
if not character:
self.character = CHARACTER
else:
self.character = character
self.result = False
self.GetFile()
self.CheckRules()
def GetFile(self):
if self.type == '.zip':
self.FileCrack = zipfile.ZipFile(self.location)
else:
self.FileCrack = rarfile.RarFile(self.location)
def Brute(self,password):
try:
if self.type == '.zip':
tryPass = password.encode()
else:
tryPass = password
print (tryPass)
self.FileCrack.extractall(pwd=tryPass)
print ('Complete')
print('Time:',time.clock() - self.start_time,'s')
print ('Password:',password)
self.result = True
except:
pass
def CheckRules(self):
self.start_time = time.clock()
print ('Cracking...')
if not self.rules:
length = 1
while True:
self.SendRequest(length)
if self.result:
return
length += 1
else:
for length in range(self.minLength, self.maxLength + 1):
self.SendRequest(length)
if self.result:
return
if not self.result:
print ('Cannot find password with this rules')
return
def SendRequest(self,length):
listPass = product(self.character, repeat=length)
for Pass in listPass:
tryPass = ''.join(Pass)
self.Brute(tryPass)
if self.result:
return
def main():
check = Check(sys.argv[1:])
args = parser.parse_args()
rarfile.UNRAR_TOOL = "UnRAR.exe"
Handling = Handler(check.rules, check.type, check.minLength, check.maxLength, check.character)
if __name__ == '__main__':
main()
Mình tạo một file zip tên là Takizawa Laura.zip
với pass là jav
Chạy thử và kết quả:
Ban đầu, list pass được tạo với length = 1 sẽ có dạng [a, b, c,…] sau đó không được tiếp tục tăng length = 2 nên list trở thành [aa, ab, ac,…] cũng không được nốt, length = 3 thì [aaa, aab,…, jav,…].
Mình tạo một file rar tên là PPPD-558.rar
với pass là boobs
Chạy thử với rules 4 5 abos
:
Ban đầu, list pass được tạo với length = 4 (min Length) sẽ có dạng [aaaa,aaab,,…] sau đó không được tiếp tục tăng length = 5 (max Length) ( nên list trở thành [aaaaa, aaaab, …, boobs,…] .
Đây là một cách crack file zip đơn giản sử dụng kĩ thuật Brute Force, ưu điểm là luôn tìm ra password, nhưng nhược điểm là phải mất kha khá thời gian với các mật khẩu dài dòng, ví dụ như: yaxua.laktr0j hay racjngp0yvjppr0 chẳng hạn.
Sử dụng thread có thể tăng tốc lên một ít,nhưng các bạn cần limit thread lại kẻo treo máy bằng cách dùng thư viện queue.
Mình cũng đã thêm rules vào để tối ưu hóa khả năng tìm pass, với rules các bạn có thể giảm số lượng pass thử, ví dụ như các bạn đoán pass dài khoảng 6 - 9
kí tự và lượng character chỉ gồm có các kí tự gồm [x, h, a, m, s, t, e, r]
thì lúc đó sẽ rút gọn được rất nhiều thời gian.
Các bạn có thể fork project của mình trên github.
Cảm ơn bạn đã đọc bài.
Không có nhận xét nào:
Đăng nhận xét