In this example I take a part my Simple Sniff tool and build it using threads. I will explain the key concepts and show code that is needed for a threaded client using Python and Tkinter
We start by bringing in our import statements
Code: Select all
import time, random
from Tkinter import *
from threading import *
from scapy import *
import tkFileDialog
we then start to build our gui
Code: Select all
class ThreadedClient:
def __init__(self, master=None):
self.ok = 1
self.master = master
self.thread1= Thread(target=self.sniffit)
self.frame = frame = Frame(master)
self.labelfilter = Label(frame, text="Filter")
self.labelfilter.pack(side=LEFT)
self.entryfilter = Entry(frame)
self.entryfilter.pack(side=LEFT, fill=X, expand=True)
self.labeli = Label(frame, text="Iface")
self.labeli.pack(side=LEFT)
self.entryiface = Entry(frame)
self.entryiface.pack(side=LEFT, fill=X, expand=True)
self.entryiface.insert(END, "eth0")
self.start = Button(frame, text="Sniff It", command=self.run)
self.start.pack(side=LEFT)
self.save = Button(frame, text="Save It", command=self.windowit)
self.save.pack(side=LEFT)
self.btn = Button(frame, text='Close', command=self.shutdown)
self.btn.pack(side=LEFT)
frame.pack(fill=X)
self.frame2 = frame2 = Frame(master)
self.scrollbar = Scrollbar(frame2)
self.scrollbar.pack(side=RIGHT, fill=Y)
self.textbox = Text(frame2)
self.textbox.pack(side=LEFT, fill=BOTH, expand=True)
self.textbox.config(yscrollcommand=self.scrollbar.set)
self.scrollbar.config(command=self.textbox.yview)
self.frame2.pack(fill=BOTH, expand=True)
take special note to
Code: Select all
self.thread1= Thread(target=self.sniffit)
also take note to
Code: Select all
self.start = Button(frame, text="Sniff It", command=self.run)
self.start.pack(side=LEFT)
this is some extra code we have just for gui functionality not necessary for our client but fun
Code: Select all
def saveit(self):
try:
self.output1 = self.mysniff
self.filename = self.entry2.get()
wrpcap(self.filename, self.output1)
self.entrystate.delete(0, END)
self.entrystate.insert(END, "Data Saved")
except:
self.entrystate.delete(0, END)
self.entrystate.insert(END, "Failed Saving Data")
def windowit():
self.top = top = Toplevel(root)
top.title("Save Data")
top.wm_resizable(0, 0)
self.frame = frame = Frame(top)
global entry2
self.entry2 = Entry(frame)
self.entry2.pack(side=LEFT)
self.entry2.insert(END, "C:\\pcapfile.cap")
self.savebutton = Button(frame, text="Save Data", command=self.saveit)
self.savebutton.pack(side=LEFT)
global entrystate
self.entrystate = Entry(frame)
self.entrystate.pack(side=LEFT)
frame.pack()
Code: Select all
def run(self):
self.thread1.start()
Code: Select all
def sniffit(self):
self.countit = 1
self.filterit = str(self.entryfilter.get())
self.setiface = str(self.entryiface.get())
while self.ok:
global mysniff
self.mysniff = sniff(iface=self.setiface, count=self.countit, filter=self.filterit)
self.a = "\n".join(map(lambda x:x.summary(), self.mysniff))
self.textbox.insert(END, self.a)
root.update()
time.sleep(0.1)
Code: Select all
def shutdown(self):
self.ok =0
self.master.after(100, self.master.quit)
Code: Select all
root = Tk()
root.minsize(300, 150)
root.option_readfile("optionDB")
root.wm_iconbitmap("shinobi.ico")
root.wm_resizable(0, 0)
root.title("Simple Sniff")
client = ThreadedClient(root)
root.mainloop()