Python写的嗅探器——Pyside,Scapy
使用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的更多相关文章
- 用python写网路爬虫 PDF高清完整版免费下载 Python基础教程免费电子书 python入门书籍免费下载
<用python写网路爬虫PDF免费下载>PDF书籍下载 内容简介 作为一种便捷地收集网上信息并从中抽取出可用信息的方式,网络爬虫技术变得越来越有用.使用Python这样的简单编程语言,你 ...
- Python写各大聊天系统的屏蔽脏话功能原理
Python写各大聊天系统的屏蔽脏话功能原理 突然想到一个视频里面弹幕被和谐的一满屏的*号觉得很有趣,然后就想用python来试试写写看,结果还真玩出了点效果,思路是首先你得有一个脏话存放的仓库好到时 ...
- python写红包的原理流程包含random,lambda其中的使用和见简单介绍
Python写红包的原理流程 首先来说说要用到的知识点,第一个要说的是扩展包random,random模块一般用来生成一个随机数 今天要用到ramdom中unifrom的方法用于生成一个指定范围的随机 ...
- Python写地铁的到站的原理简易版
Python地铁的到站流程及原理(个人理解) 今天坐地铁看着站牌就莫名的想如果用Python写其工作原理 是不是很简单就小试牛刀了下大佬们勿喷纯属小弟个人理解 首先来看看地铁上显示的站牌如下: 就想这 ...
- 用Python写一个简单的Web框架
一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...
- 读书笔记汇总 --- 用Python写网络爬虫
本系列记录并分享:学习利用Python写网络爬虫的过程. 书目信息 Link 书名: 用Python写网络爬虫 作者: [澳]理查德 劳森(Richard Lawson) 原版名称: web scra ...
- Python写UTF8文件,UE、记事本打开依然乱码的问题
Python写UTF8文件,UE.记事本打开依然乱码的问题 Leave a reply 现象:使用codecs打开文件,写入UTF-8文本,正常无错误.用vim打开正常,但记事本.UE等打开乱码. 原 ...
- 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 ...
- python写xml文件
为了便于后续的读取处理,这里就将信息保存在xml文件中,想到得到的文件如下: 1 <?xml version="1.0" encoding="utf-8" ...
随机推荐
- 百度echart--Uncaught Error: Component series.wordCloud not exists. Load it first.
百度echart--Uncaught Error: Component series.wordCloud not exists. Load it first. 一.总结 一句话总结:关注报的错.可以通 ...
- Oauth入门学习
在一些网站总是看到调用其他网站的信息的实例,比如在人人网中导入MSN联系人,在Facebook中导入gmail,yahoo mail好友,第三方网站不需要总知道你的密码,对于应用的授权完全交给你自己, ...
- Oracle数据库零散知识06 -- Package的定义与简单触发器
CREATE OR REPLACE PACKAGE pak_02 IS--包头 --这里可定义公共参数 FUNCTION fun_01 RETURN NUMBER; PROCEDURE pro_01 ...
- Unity3d 配置OpenCV(EmguCV) 周围环境
最近毕业.我们一直在研究如何Unity正在使用EmguCV,最后,有些吃老本的今天. 我的环境:Unity3d 4.3.1f libemgucv-windows-univers ...
- Android实现手机拍照功能
一.布局文件main.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmln ...
- QSettings提供了非常方便的注册表读写
Qt的QSettings提供了非常方便的注册表读写 写入: //写入注册表 void setRegValue( QString strPath, QString strItemName, QStrin ...
- 【64.52%】【codeforces 697D】Puzzles
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- No USB devices or running emulators detected”
每次重装系统之后,安装andorid studio后,使用真机调试代码,就会出现"No USB devices or running emulators detected"的错误, ...
- yii2框架学习一 yii安装与常见问题
1 安装安装有两种 cpmposer 喝归档文件 安装 这里采用的归档文件安装 归档文件安装分为两种 基础末班和高级模板,这里采用高级模板 在官网或者yii-china 下载归档文件 解 ...
- hudson添加批处理编译命令的注意事项
作者:朱金灿 来源:http://blog.csdn.net/clever101 Hudson可以在Build Step里添加自定义的批处理命令,如下图: 需要注意的是这些批处理命令并不能识别huds ...