python暴力解压rar加密文件过程详解


Posted in Python onJuly 05, 2019

第一次使用csdn写文章,写得不好还请见谅。(运行环境:python3.6)

下了一个带密码的压缩包文件,作为一个刚学python的新手,想着能不能用python暴力破解它,于是在网上搜了很多资料,看着似乎并不是很麻烦,也想试着自己写一个可以暴力破解的程序,在写的过程中却遇到了各种各样的问题,希望大手们能带带我。遇到的问题如下:

  • zipfile和zipfile2似乎都不支持AES解密(https://bugs.python.org/issue9170)
  • 在用rarfile暴力破解时即使密码错误也不抛出异常,因此无法用try,except捕获密码

本来是想写一个可以同时暴力破解zip和rar的程序,在试了半天解密zip却一直提示密码错误之后放弃了zip,想着能不能写一个暴力破解rar的程序。

首先是生成字典:要用到itertools模块

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

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解密源代码:(图形只是想练习,运行较慢,建议直接运行上面的函数)

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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python和ruby,我选谁?
Sep 13 Python
django 发送手机验证码的示例代码
Apr 25 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
Jul 01 Python
django 环境变量配置过程详解
Aug 06 Python
利用Python实现kNN算法的代码
Aug 16 Python
Python3 main函数使用sys.argv传入多个参数的实现
Dec 25 Python
如何通过Django使用本地css/js文件
Jan 20 Python
如何使用Python抓取网页tag操作
Feb 14 Python
Python使用qrcode二维码库生成二维码方法详解
Feb 17 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
Mar 02 Python
基于K.image_data_format() == 'channels_first' 的理解
Jun 29 Python
PyTorch: Softmax多分类实战操作
Jul 07 Python
Python 使用folium绘制leaflet地图的实现方法
Jul 05 #Python
Python 给定的经纬度标注在地图上的实现方法
Jul 05 #Python
python 自动轨迹绘制的实例代码
Jul 05 #Python
python实现ip代理池功能示例
Jul 05 #Python
解决yum对python依赖版本问题
Jul 05 #Python
python写入文件自动换行问题的方法
Jul 05 #Python
Python Numpy计算各类距离的方法
Jul 05 #Python
You might like
谈谈新手如何学习PHP
2006/12/14 PHP
PHP中将网页导出为Word文档的代码
2012/05/25 PHP
php 保留字列表
2012/10/04 PHP
PHP批量上传图片的具体实现方法介绍.
2014/02/26 PHP
JavaScript库 开发规则
2009/01/31 Javascript
javascript 写类方式之二
2009/07/05 Javascript
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
jQuery Autocomplete自动完成插件
2010/07/17 Javascript
解析Jquery取得iframe中元素的几种方法
2013/07/04 Javascript
IE8中动态创建script标签onload无效的解决方法
2014/12/22 Javascript
js实现两点之间画线的方法
2015/05/12 Javascript
AngularJS指令与指令之间的交互功能示例
2016/12/14 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
layui的table单击行勾选checkbox功能方法
2018/08/14 Javascript
vue.js input框之间赋值方法
2018/08/24 Javascript
vue中的ref和$refs的使用
2018/11/22 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
2019/01/18 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
2020/02/12 Javascript
JavaScript实现点击图片换背景
2020/11/20 Javascript
Python实现把xml或xsl转换为html格式
2015/04/08 Python
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
Python Websocket服务端通信的使用示例
2020/02/25 Python
Python如何实现的二分查找算法
2020/05/27 Python
Python xpath表达式如何实现数据处理
2020/06/13 Python
HTML5通过调用canvas对象的getContext()方法来获取绘图环境
2014/06/23 HTML / CSS
全球度假村:Club Med
2017/11/27 全球购物
Harrods美国:英国最大的百货公司
2018/11/04 全球购物
自我评价正确写法范文
2013/12/10 职场文书
青年文明号复核材料
2014/02/11 职场文书
护理专业自荐信范文
2014/02/26 职场文书
小学生九一八纪念日83周年演讲稿500字
2014/09/17 职场文书
离职报告范文
2014/11/04 职场文书
出纳试用期自我评价
2015/03/10 职场文书
音乐课外活动总结
2015/05/09 职场文书
Python Pandas读取Excel日期数据的异常处理方法
2022/02/28 Python
使用MybatisPlus打印sql语句
2022/04/22 SQL Server