基于python3的tkinter和scapy可视化报文构造工具(三)

编程入门 行业动态 更新时间:2024-10-26 22:26:57

基于python3的tkinter和scapy可视化<a href=https://www.elefans.com/category/jswz/34/1768911.html style=报文构造工具(三)"/>

基于python3的tkinter和scapy可视化报文构造工具(三)

上一篇介绍了工具的首页布局实现,该篇将介绍工具的功能区,即由首页切换后工具真正实现功能的界面。在第一篇中已经讲到该工具的初心就是在DPI领域中报文识别所关注的字段,故呈现出来的字段则是主要关心的字段。该工具构造或修改的是http和https两种协议的报文,如何方便的呈现和切换两种协议也是需要设计的一个因素。首先看一下切换后的http的界面。

可以看到,在http的界面中,主要提供了两个功能,一是从无到有的构造一个http报文,二是修改http报文。从无到有构造报文界面中呈现出来的字段,对于请求包有源IP,目的IP,host,UA四个字段,对于响应包有返回码,server两个字段。另外如果关心其他字段也可以自己在界面上扩展。设置好之后给用户提供一个报文保存的路径。对于修改http报文的界面,则多一个按钮,给用户提供修改的报文路径。下面则具体讲讲如何实现以上界面的布局及呈现。

在上面说到如何方便的呈现和切换两种协议,最开始的时候是想通过下拉菜单来切换两种协议,后来尝试发现通过选项卡更直观,在界面上就可以直接进行切换不需要点一下菜单。还记得上一篇中留的悬念吗

class pcapnotebook():@classmethoddef main(cls):pass  #欲知故事如何请听下回分解

pcapnotebook函数则实现的是选项卡控件。该控件的目的是提供一个区域,用户可以通过单击区域顶部的选项卡来选择内容页面。每次用户单击其中一个选项卡时,窗口小部件将显示 与该选项卡关联的子窗格。通常,每个窗格都是 Frame窗口小部件,但窗格可以是任何窗口小部件。每个选项卡都有自己的一组选项来控制其外观和行为。

要将Notebook窗口小部件创建为某个窗口小部件的子parent窗口,以下为选项卡控件的构造函数:

ttk.Notebook(parent,option= value,...)

下面列出几个NOTEBOOK的方法列表:

.add(child, **kw)

该child 参数是一个小部件,通常Frame,它包装一个子窗格中的内容。如果child不是Notebook窗口小部件的子窗格之一,child则添加为下一个可用选项卡,关键字参数kw定义新窗格的选项卡选项。这些选项在表51“ ttk.Notebook 小部件的选项卡选项”中定义。
如果child是当前隐藏的窗格,则该选项卡将重新显示在其以前的位置。

.enable_traversal()

一旦调用此方法,一些额外的键绑定将起作用:
            Control-Tab将在当前选择的选项卡后选择选项卡。如果当前选择了最后一个选项卡,则选择将旋转回第一个选项卡。
           Shift-Control-Tab执行相反操作:它移动到上一个选项卡,如果选择了第一个选项卡,则环绕到最后一个选项卡。
           您可以配置直接选择选项卡的特定热键。要执行此操作,请使用text和underline选项卡选项为每个选项卡中的一个字符加下划线。然后,用户可以通过键入Alt-跳转到选项卡,x其中 x是该选项卡上带下划线的字符。
           如果Notebook在同一个应用程序中有多个小部件,则除非创建每个子窗格小部件并将其Notebook窗口小部件作为父窗口小部件,否则这些功能将无法正常工作。

.forget(child)

此方法child从窗口小部件的选项卡集中永久删除指定的内容。

.hide(tabId)

标识的选项卡tabId暂时从中显示的可见选项卡集中删除Notebook。您可以通过.add() 再次调用该方法来恢复它。

.index(tabId)

对于给定的tabId,此方法返回相应选项卡的数字索引。有一个例外:如果参数是字符串"end",则该方法将返回选项卡的总数。

.insert(where, child,**kw)

此方法使用任何关键字参数将窗口小部件插入到child指定的位置 where,以描述新选项卡和窗格。该where 参数可以是任何的:“end” 在所有现有选项卡之后放置新选项卡。现有的子窗口小部件; 在这种情况下,new child就在现有小部件之前插入。
如果在没有参数的情况下调用此方法,它将返回当前显示其选项卡的窗口小部件的窗口名称。

.select([tabId])

要显示特定窗格Notebook,请使用a tabId作为参数调用此方法。

.tab(tabId, option=None, **kw)

使用此方法可以为所描述的子窗格设置选项卡选项tabId,或者找出为该子窗格设置的选项。如果您调用没有关键字参数的方法,它将返回当前对指定的窗格有效的选项卡选项的字典tagId。要查找特定选项卡选项的当前值 X,请使用参数“option=X” 调用此方法,该方法将返回该选项卡选项的值。要为描述的子项设置一个或多个选项卡选项tagId,请使用关键字参数调用此方法。例如,如果self.nb 是 Notebook,则此调用将更改第一个选项卡上显示的文本:self.nb.tab(0, text=‘Crunchy frog’)

.tabs()

此方法返回的列表窗口名称中的Notebook的子窗格中,从第一个到最后的次序。

回归到此工具,用add方法插入两个部件来收纳http和https功能,代码如下

class pcapnotebook():@classmethoddef main(cls):notebook = ttk.Notebook(root)httpins = httpclass(root)httpins.httpmain()httpsins = httpsclass(root)httpsins.httpsmain()notebook.add(httpins.httpframe, text='http',)notebook.add(httpsins.httpsframe, text='https')notebook.pack(padx=10, pady=5, fill=BOTH, expand=True)

这里插着讲一下什么是frame,frame我理解就是一个画布,该画布上可以承载你想放上去的小控件,由此来做统一的控制。

从代码中也可以看出来,为了方便程序扩展和易读,两种协议我分别定义了一个类,在各自的类中实现各自的功能。所有另起了两个文件

上述界面中用到了单选按钮控件和输入框控件,其他的控件在上一篇中已做过解释,剩下的界面就是布局位置的事情

单选按钮:(Radiobutton)是为了响应互相排斥的若干单选项的单击事件以触发运行自定义函数所设的,该控件排除具有共有属性外,还具有显示文本(text)、返回变量(variable)、返回值(value)、响应函数名(command)等重要属性。响应函数名“command=函数名”的用法与Button相同,函数名最后也要加括号。返回变量variable=var通常应预先声明变量的类型var=IntVar()或var=StringVar(),在所调用的函数中方可用var.get()方法获取被选中实例的value值。

输入框:(Entry)接收单行文本输入

下面给出该部分界面布局代码实现

from tkinter import *
import tkinter.filedialog
from scapy.all import *
from scapy.utils import PcapWriter, PcapReader
from scapy.layers.http import *
import randomclass httpclass():def __init__(self,root):self.root = rootself.httpframe = Frame()def cleanframe(self):listwin = self.httpframe.winfo_children()if listwin:for widget in listwin[3:]:widget.destroy()def httpmain(self):label = Label(self.httpframe, text='Please Select function:')label.place(relx = 0.01,rely = 0.01)var = IntVar()rd1 = Radiobutton(self.httpframe, text="newHttpPcap", variable=var, value=0, command=self.newhttpPcap)rd1.place(relx = 0.23,rely = 0.01)rd2 = Radiobutton(self.httpframe, text="editHttpPcap", variable=var, value=1, command=self.editHttpPcap)rd2.place(relx = 0.4,rely = 0.01)def newok(self,srcIP,desIP,host,UserAgent,retcode,server,savefile):pass  #欲知故事如何请听下回分解def editok(self,oriip1,afterip1,oriip2,afterip2,host,ua,openfile,savefile):pass  #欲知故事如何请听下回分解def newhttpPcap(self):self.cleanframe()label = Label(self.httpframe, text='httpRequest:')label.place(relx=0.01, rely=0.1)label = Label(self.httpframe, text='srcIP:')label.place(relx=0.1, rely=0.2)srcIP = Entry(self.httpframe)srcIP.place(relx=0.16, rely=0.2, relwidth=0.2, relheight=0.05)label = Label(self.httpframe, text='desIP:')label.place(relx=0.52, rely=0.2)desIP = Entry(self.httpframe)desIP.place(relx=0.6, rely=0.2, relwidth=0.2, relheight=0.05)label = Label(self.httpframe, text='host:')label.place(relx=0.1, rely=0.3)host = Entry(self.httpframe)host.place(relx=0.16, rely=0.3, relwidth=0.2, relheight=0.05)label = Label(self.httpframe, text='User-Agent:')label.place(relx=0.48, rely=0.3)UserAgent = Entry(self.httpframe)UserAgent.place(relx=0.6, rely=0.3, relwidth=0.2, relheight=0.05)label = Label(self.httpframe, text='httpResponse:')label.place(relx=0.01, rely=0.4)label = Label(self.httpframe, text='retcode:')label.place(relx=0.08, rely=0.5)retcode = Entry(self.httpframe)retcode.place(relx=0.16, rely=0.5, relwidth=0.2, relheight=0.05)label = Label(self.httpframe, text='server:')label.place(relx=0.52, rely=0.5)server = Entry(self.httpframe)server.place(relx=0.6, rely=0.5, relwidth=0.2, relheight=0.05)savefilepath = Button(self.httpframe, text='save pcap path', command=lambda: self.saveas(labelsave))savefilepath.place(relx=0.01, rely=0.7, )labelsave = Label(self.httpframe, text='', font=('华文新魏', 11), width=80, height=2, relief=SUNKEN, anchor=W)labelsave.place(relx=0.17, rely=0.7)newok = Button(self.httpframe, text='OK', height=1, width=8, font=('华文新魏', 15), \command=lambda: self.newok(srcIP.get(),desIP.get(),host.get(),UserAgent.get(), \retcode.get(),server.get(),self.savefile))newok.place(relx=0.4, rely=0.9, )def openfile(self,labelopen):self.openfile = tkinter.filedialog.askopenfilename(defaultextension='.pcap', title='openfile', filetypes=[("pcap", ".pcap .pcapng")])if self.openfile != '':labelopen.config(text='sourcepcap:' + self.openfile)else:labelopen.config(text='you select nothing!!!')def saveas(self,labelsave):self.savefile = tkinter.filedialog.asksaveasfilename(title='saveas', filetypes=[('.pcap', '.pcap .pcapng')])if self.savefile != '':if not self.savefile.endswith('.pcap'):self.savefile = self.savefile + '.pcap'labelsave.config(text='savepcap:' + self.savefile)else:labelsave.config(text='you save nothing!!!')def editHttpPcap(self):self.cleanframe()sourcefile = Button(self.httpframe, text='select edit pcap',command=lambda: self.openfile(labelopen))sourcefile.place(relx=0.01, rely=0.1,)labelopen = Label(self.httpframe, text='',font=('华文新魏',11),width=80,height=2,relief=SUNKEN,anchor=W)labelopen.place(relx=0.18, rely=0.1)label = Label(self.httpframe, text='ori_ip_1:')label.place(relx=0.07, rely=0.3)ori_ip_1 = Entry(self.httpframe)ori_ip_1.place(relx=0.16, rely=0.3, relwidth=0.2, relheight=0.05)label = Label(self.httpframe, text='>>>>>>>>>after_IP_1:')label.place(relx=0.38, rely=0.3)after_ip_1 = Entry(self.httpframe)after_ip_1.place(relx=0.6, rely=0.3, relwidth=0.2, relheight=0.05)label = Label(self.httpframe, text='ori_ip_2:')label.place(relx=0.07, rely=0.4)ori_ip_2 = Entry(self.httpframe)ori_ip_2.place(relx=0.16, rely=0.4, relwidth=0.2, relheight=0.05)label = Label(self.httpframe, text='>>>>>>>>>after_ip_2:')label.place(relx=0.38, rely=0.4)after_ip_2 = Entry(self.httpframe)after_ip_2.place(relx=0.6, rely=0.4, relwidth=0.2, relheight=0.05)label = Label(self.httpframe, text='host:')label.place(relx=0.1, rely=0.5)host = Entry(self.httpframe)host.place(relx=0.16, rely=0.5, relwidth=0.2, relheight=0.05)label = Label(self.httpframe, text='User-Agent:')label.place(relx=0.48, rely=0.5)ua = Entry(self.httpframe)ua.place(relx=0.6, rely=0.5, relwidth=0.2, relheight=0.05)savefilepath = Button(self.httpframe, text='save pcap path', command=lambda: self.saveas(labelsave))savefilepath.place(relx=0.01, rely=0.7, )labelsave = Label(self.httpframe, text='', font=('华文新魏', 11), width=80, height=2, relief=SUNKEN, anchor=W)labelsave.place(relx=0.17, rely=0.7)self.editokbtn  = Button(self.httpframe, text='OK', height = 1,width = 8,font=('华文新魏',15),\command=lambda: self.editok(ori_ip_1.get(),after_ip_1.get(),ori_ip_2.get(),after_ip_2.get(),\host.get(),ua.get(),self.openfile, self.savefile))self.editokbtn.place(relx=0.4, rely=0.9, )

https部分的布局则和http的差不多,用到的控件都是一样的,在此就不一一展示了,好了该部分就到这里

更多推荐

基于python3的tkinter和scapy可视化报文构造工具(三)

本文发布于:2024-02-12 08:19:23,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1686932.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:报文   工具   tkinter   scapy

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!