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  __getattr__与__setattr__使用方法
Sep 06 Python
Python迭代用法实例教程
Sep 08 Python
Python操作MongoDB详解及实例
May 18 Python
python3读取excel文件只提取某些行某些列的值方法
Jul 10 Python
Python访问MongoDB,并且转换成Dataframe的方法
Oct 15 Python
详解【python】str与json类型转换
Apr 29 Python
Python math库 ln(x)运算的实现及原理
Jul 17 Python
python如何实现单链表的反转
Feb 10 Python
python数据预处理 :数据抽样解析
Feb 24 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
Apr 02 Python
django queryset 去重 .distinct()说明
May 19 Python
Pycharm的Available Packages为空的解决方法
Sep 18 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.MVC的模板标签系统(一)
2006/09/05 PHP
PHP在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
2011/08/03 PHP
基于php和mysql的简单的dao类实现crud操作功能
2014/01/27 PHP
PHP中$_FILES的使用方法及注意事项说明
2014/02/14 PHP
PHP读取配置文件类实例(可读取ini,yaml,xml等)
2015/07/28 PHP
CodeIgniter配置之routes.php用法实例分析
2016/01/19 PHP
PHP 返回13位时间戳的实现代码
2016/05/13 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
2017/02/15 PHP
php使用json_decode后数字对象转换成了科学计数法的解决方法
2017/02/20 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
2018/04/21 PHP
laravel validate 设置为中文的例子(验证提示为中文)
2019/09/29 PHP
jquery ajax提交表单数据的两种实现方法
2010/04/29 Javascript
JavaScript类和继承 this属性使用说明
2010/09/03 Javascript
浅析XMLHttpRequest的缓存问题
2013/12/13 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
2016/03/30 Javascript
javascript验证手机号和实现星号(*)代替实例
2016/08/16 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
2017/01/15 Javascript
koa-router源码学习小结
2018/09/07 Javascript
[01:02:04]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
彻底理解Python list切片原理
2017/10/27 Python
解决keras backend 越跑越慢问题
2020/06/18 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
2020/07/30 Python
html5的input的required使用中遇到的问题及解决方法
2018/04/24 HTML / CSS
L*SPACE官网:比基尼、泳装和度假服装
2019/03/18 全球购物
毕业生自我推荐
2013/11/04 职场文书
医药学专业大学生职业生涯规划书论文
2014/01/21 职场文书
升旗仪式主持词
2014/03/19 职场文书
高中生家长寄语大全
2014/04/03 职场文书
教师求职自荐书
2014/06/14 职场文书
2014年幼儿园重阳节活动方案
2014/09/16 职场文书
2016年幼儿园万圣节活动总结
2016/04/05 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python
MySQL中utf8mb4排序规则示例
2021/08/02 MySQL
MySQL 字符集 character
2022/05/04 MySQL
怎么禁用Win11输入法 最新Win11输入法关闭教程
2022/08/05 数码科技