python - 用 scapy 嗅探时,Tkinter 窗口冻结
问题描述
import tkinter as tk
import random
import scapy.all as scapy
result = ""
def getmac(ip):
arplayer = scapy.ARP(pdst=ip)
etherlayer = scapy.Ether(dst="ff:ff:ff:ff:ff:ff")
packet = etherlayer/arplayer
answeredList = scapy.srp(packet, timeout=2, verbose = False)[0]
return answeredList[0][1].hwsrc
def sniff():
scapy.sniff(store=False, prn=checkattack)
def checkattack(packet):
try:
if packet.haslayer(scapy.ARP) and packet[scapy.ARP].op == 2:
realmac = getmac(packet[scapy.ARP].psrc)
rspmac = packet[scapy.ARP].hwsrc
if realmac != rspmac:
result = "WARNING"
except IndexError:
pass
GUI = tk.Tk()
GUI.title("NETWORK GUARDIAN")
GUI.geometry("600x500")
# === labels ===
label1 = tk.Label(text="> Welcome to the NETWORK GUARDIAN !", font=("Times", 11))
label1.grid(column = 0, row = 0)
label2 = tk.Label(text = result, font=("Arial Black", 15))
label2.grid(column = 0, row = 3)
# === buttons ===
button1 = tk.Button(text="Scan for attacks", command = sniff)
button1.grid(column = 0, row = 2)
GUI.mainloop()
我有这个用 scapy 制作的 arp 欺骗工具,但我试图通过使用 tkinter 以一种很好的方式显示结果。问题是当我按下按钮扫描可能的攻击时,窗口会冻结。我猜这是因为 sniff() 函数是一个长时间运行的函数。有人可以帮助我以正确的方式完成这项工作吗?
解决方案
也许您可以尝试线程模块以防止它中断 tkinter 循环?语法是这样的
import threading
sniffThread = threading.thread(target=sniff)
sniffThread.run()
sniffThread.stop()
推荐阅读
- symfony - "Missing value for primary key"
- cassandra - 列数大于 1996099046,无法计算百分位数
- wpf - 有没有办法在 xaml 编辑器中预览动画?
- javascript - 为什么我的回调返回一个未定义的值?
- php - 功能 (@javascript) 测试效果不佳
- android - 为什么 Android Studio 强制使用 Android 支持库中的 Androidx?
- php - Laravel 集合获取空数组但 sql 给出了正确的结果
- xslt - XSLT 删除重复并选择更高的值
- php - 如何将ajax调用延迟几秒钟
- kotlin - 如何在 Kotlin 中将 actor 定义为一个类