使用Python的Pyside和Scapy写的嗅探器原型,拥有基本框架,但是功能并不十分完善,供参考。

 import sys
import time
import binascii
from PySide.QtCore import *
from PySide.QtGui import *
from scapy.all import * # Every Qt application must have one and only one QApplication object;
# it receives the command line arguments passed to the script, as they
# can be used to customize the application's appearance and behavior
qt_app = QApplication(sys.argv)
global_pkt_list = [] # Try to redirect hexdump()'s output, but failed!Why? T_T
class redirect_output:
def __init__(self):
self.str = ''
def write(self, s):
self.str += s
def show(self):
return self.str class Sniffer(QThread):
pkt_arrive = Signal(str)
bGo = True
filter = None
iface = 'eth0' def __init__(self, parent=None):
QThread.__init__(self, parent)
# self.pkt_arrive.connect(OnPktArrive) def run(self):
# self.emit(SIGNAL("pkt_arrive(str)"), "pkt")
while (self.bGo):
p = sniff(count=1, filter = self.filter)
global_pkt_list.append(p[0])
self.pkt_arrive.emit((p[0].summary())) def go(self):
self.bGo = True
self.start() def stop(self):
print 'Sniffer got exit message'
self.bGo = False class PktListItem(QListWidgetItem):
def __init__(self, pkt=None, num=None):
QListWidgetItem.__init__(self)
self.pkt = pkt
self.num = num class MainWindow(QWidget):
''' An example of PySide absolute positioning; the main window
inherits from QWidget, a convenient widget for an empty window. '''
number = 0
def __init__(self):
QWidget.__init__(self)
self.setWindowTitle('J_Sniffer')
self.setMinimumSize(800, 500) # set layout
self.main_layout = QVBoxLayout()
# edit and btn
self.layout1 = QHBoxLayout() self.Label_Iface = QLabel("Iface", self)
self.layout1.addWidget(self.Label_Iface)
self.TextBox_Iface = QLineEdit(self)
self.TextBox_Iface.setPlaceholderText("Choose network interface")
self.layout1.addWidget(self.TextBox_Iface) self.Label_Fliter = QLabel("Filter", self)
self.layout1.addWidget(self.Label_Fliter)
self.TextBox_Filter = QLineEdit(self)
self.layout1.addWidget(self.TextBox_Filter) self.layout1.addStretch(1)
self.Btn_Start = QPushButton("&Start", self)
self.layout1.addWidget(self.Btn_Start) self.main_layout.addLayout(self.layout1) # List to show packets
self.List_Pkt = QListWidget(self)
self.main_layout.addWidget(self.List_Pkt) # Tree to see pkt's detail
self.Tree = QTreeWidget(self)
self.main_layout.addWidget(self.Tree)
self.Tree.setColumnCount(2)
self.Tree.setHeaderLabels(['Key', 'Value']) self.setLayout(self.main_layout) # create signal and sniff thread
self.thread = Sniffer()
self.connect(self.Btn_Start, SIGNAL("clicked()"), self.Sniff)
# self.connect(self.thread, SIGNAL("pkt_arrive(str)"), self.OnPktArrive) Connot work!
self.thread.pkt_arrive.connect(self.OnPktArrive)
self.List_Pkt.currentItemChanged.connect(self.On_ItemChanged) @Slot(str)
def OnPktArrive(self, pkt):
print 'received pkt arrive signal' #p = Ether(pkt) #only Ethernet now, 802.11 may be crash!
item = PktListItem(num = self.number)
item.setText(str(self.number) + '\t' + pkt)
self.List_Pkt.addItem(item)
self.number += 1 @Slot()
def Sniff(self):
print self.Btn_Start.text()
if self.Btn_Start.text() == '&Start':
self.Btn_Start.setText("&Stop")
self.thread.filter = self.TextBox_Filter.text()
self.thread.iface = self.TextBox_Iface.text()
self.thread.go()
else:
self.Btn_Start.setText("&Start")
self.thread.stop() def On_ItemChanged(self, curr, prev):
print curr.num
self.Tree.clear()
p = global_pkt_list[curr.num]
root1 = QTreeWidgetItem(self.Tree)
if (p.haslayer(Ether)):
root1.setText(0, 'Ethernet:')
child1_1 = QTreeWidgetItem(root1)
child1_1.setText(0, 'dst')
child1_1.setText(1, p.dst)
child1_2 = QTreeWidgetItem(root1)
child1_2.setText(0, 'src')
child1_2.setText(1, p.src)
child1_3 = QTreeWidgetItem(root1)
child1_3.setText(0, 'type')
child1_3.setText(1, hex(p.type))
p = p.getlayer(1)
if (p.haslayer(IP)):
self._SetIPTree(p)
p = p.getlayer(1)
if (p.haslayer(ICMP)):
self._SetICMPTree(p)
elif (p.haslayer(TCP)):
pass
else:
pass
elif (p.haslayer(IPv6)):
pass
else:
root1.setText(0, 'Not Ethernet')
root1.setText(1, hexdump(p)) def _SetIPTree(self, p):
root2 = QTreeWidgetItem(self.Tree)
root2.setText(0, 'IPv4')
child2_1 = QTreeWidgetItem(root2)
child2_1.setText(0, 'Version')
child2_1.setText(1, str(p.version))
child2_2 = QTreeWidgetItem(root2)
child2_2.setText(0, 'ihl(Header Length)')
child2_2.setText(1, str(p.ihl))
child2_3 = QTreeWidgetItem(root2)
child2_3.setText(0, 'tos')
child2_3.setText(1, str(p.tos))
child2_4 = QTreeWidgetItem(root2)
child2_4.setText(0, 'len')
child2_4.setText(1, str(p.len))
child2_5 = QTreeWidgetItem(root2)
child2_5.setText(0, 'id')
child2_5.setText(1, str(p.id))
child2_6 = QTreeWidgetItem(root2)
child2_6.setText(0, 'flags')
child2_6.setText(1, str(p.flags))
child2_7 = QTreeWidgetItem(root2)
child2_7.setText(0, 'frag')
child2_7.setText(1, str(p.frag))
child2_8 = QTreeWidgetItem(root2)
child2_8.setText(0, 'TTL')
child2_8.setText(1, str(p.ttl))
child2_9 = QTreeWidgetItem(root2)
child2_9.setText(0, 'protocol')
child2_9.setText(1, str(p.proto))
child2_10 = QTreeWidgetItem(root2)
child2_10.setText(0, 'checksum')
child2_10.setText(1, str(p.chksum))
child2_11 = QTreeWidgetItem(root2)
child2_11.setText(0, 'src')
child2_11.setText(1, str(p.src))
child2_12 = QTreeWidgetItem(root2)
child2_12.setText(0, 'dst')
child2_12.setText(1, str(p.dst)) def _SetICMPTree(self, p):
root3 = QTreeWidgetItem(self.Tree)
root3.setText(0, 'ICMP')
child3_1 = QTreeWidgetItem(root3)
child3_1.setText(0, 'Type')
if (p.type == 8):
child3_1.setText(1, 'echo request')
elif (p.type == 0):
child3_1.setText(1, 'echo reply')
else:
child3_1.setText(1, str(p.type))
child3_2 = QTreeWidgetItem(root3)
child3_2.setText(0, 'Code')
child3_2.setText(1, str(p.code))
child3_3 = QTreeWidgetItem(root3)
child3_3.setText(0, 'Checksum')
child3_3.setText(1, str(p.chksum))
child3_4 = QTreeWidgetItem(root3)
child3_4.setText(0, 'ID')
child3_4.setText(1, str(p.id))
child3_5 = QTreeWidgetItem(root3)
child3_5.setText(0, 'Sequence number')
child3_5.setText(1, str(p.seq))
child3_6 = QTreeWidgetItem(root3)
child3_6.setText(0, 'Data')
child3_6.setText(1, binascii.b2a_hex(str(p.load))) def run(self):
self.show() if __name__ == '__main__':
# Create an instance of the application window and run it
win = MainWindow()
win.run()
qt_app.exec_()

Python写的嗅探器——Pyside,Scapy的更多相关文章

  1. 用python写网路爬虫 PDF高清完整版免费下载 Python基础教程免费电子书 python入门书籍免费下载

    <用python写网路爬虫PDF免费下载>PDF书籍下载 内容简介 作为一种便捷地收集网上信息并从中抽取出可用信息的方式,网络爬虫技术变得越来越有用.使用Python这样的简单编程语言,你 ...

  2. Python写各大聊天系统的屏蔽脏话功能原理

    Python写各大聊天系统的屏蔽脏话功能原理 突然想到一个视频里面弹幕被和谐的一满屏的*号觉得很有趣,然后就想用python来试试写写看,结果还真玩出了点效果,思路是首先你得有一个脏话存放的仓库好到时 ...

  3. python写红包的原理流程包含random,lambda其中的使用和见简单介绍

    Python写红包的原理流程 首先来说说要用到的知识点,第一个要说的是扩展包random,random模块一般用来生成一个随机数 今天要用到ramdom中unifrom的方法用于生成一个指定范围的随机 ...

  4. Python写地铁的到站的原理简易版

    Python地铁的到站流程及原理(个人理解) 今天坐地铁看着站牌就莫名的想如果用Python写其工作原理 是不是很简单就小试牛刀了下大佬们勿喷纯属小弟个人理解 首先来看看地铁上显示的站牌如下: 就想这 ...

  5. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  6. 读书笔记汇总 --- 用Python写网络爬虫

    本系列记录并分享:学习利用Python写网络爬虫的过程. 书目信息 Link 书名: 用Python写网络爬虫 作者: [澳]理查德 劳森(Richard Lawson) 原版名称: web scra ...

  7. Python写UTF8文件,UE、记事本打开依然乱码的问题

    Python写UTF8文件,UE.记事本打开依然乱码的问题 Leave a reply 现象:使用codecs打开文件,写入UTF-8文本,正常无错误.用vim打开正常,但记事本.UE等打开乱码. 原 ...

  8. python 写的http后台弱口令爆破工具

    今天来弄一个后台破解的Python小程序,哈哈,直接上代码吧,都有注释~~ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ...

  9. python写xml文件

    为了便于后续的读取处理,这里就将信息保存在xml文件中,想到得到的文件如下: 1 <?xml version="1.0" encoding="utf-8" ...

随机推荐

  1. .gitignore 设置忽略上传的文件

    首先在一个项目中新建如下所示文件用来测试 image.png 一.生成.gitignore文件 1.进入项目根目录,打开终端: 2.输入 vi .gitignore 创建并打开隐藏文件.gitigno ...

  2. 为何放弃 C++ 的工作(开发慢,难度高。完全不适应互联网的快速迭代的思想)

    happypeter,2015年1月9日 昨天进燕山大学编程爱好者 QQ 群,看到有很多同学在学 C++ ,我当然是不喜欢了,因为我是做 Web 开发的嘛.所以怀着猥琐的心情,今天写篇傻傻的文章,来黑 ...

  3. 机器学习: TensorFlow 的数据读取与TFRecords 格式

    最近学习tensorflow,发现其读取数据的方式看起来有些不同,所以又重新系统地看了一下文档,总得来说,tensorflow 有三种主流的数据读取方式: 1) 传送 (feeding): Pytho ...

  4. Mac下新安装的MySQL无法登陆root用户(安装时没有设置密码)

    1.也不知是何原因,新安装好的MySQL,如果尝试用mysql -u root -p登陆就会出现这样的错误,但是root用户根本就没有设置密码. $ cd /usr/local$ cd mysql $ ...

  5. wpf DoEvents

    原文:wpf DoEvents 如果在执行一段卡UI的代码,这时如何让UI响应.如果存在代码需要获得依赖属性,那么代码就需要在UI线程执行,但是这时就会卡UI,为了让UI响应,所以就需要使用DoEve ...

  6. Python: 图像处理的基本运算

    Python 作为一种面向对象.直译式的计算机程序语言,在很多领域得到广泛应用. 本文主要介绍 Python 在图像处理中的基本运算,借助 scikit-image 库,Python 在做图像处理的 ...

  7. C-order/Fortran-order(Row-/Column-major order)

    1. row-major / column-major order 无论是行序优先还是列序优先,其实在计算机计算中,指的都是在线性空间(linear storage,如 RAM,也即连续内存存储 co ...

  8. python栈--字符串反转,括号匹配

    栈的实现: # 定义一个栈类 class Stack(): # 栈的初始化 def __init__(self): self.items = [] # 判断栈是否为空,为空返回True def isE ...

  9. ssh探头安全

    1.  ssh 合约                 SSH 为建立在应用层和传输层基础上的安全协议. SSH 是眼下较可靠,专为远程登录会话和其它网络服务提供安全性的协议.利用 SSH 协议能够有效 ...

  10. WPF中利用RadialGradient模拟放大镜效果

    原文:WPF中利用RadialGradient模拟放大镜效果 --------------------------------------------------------------------- ...