使用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. 百度echart--Uncaught Error: Component series.wordCloud not exists. Load it first.

    百度echart--Uncaught Error: Component series.wordCloud not exists. Load it first. 一.总结 一句话总结:关注报的错.可以通 ...

  2. Oauth入门学习

    在一些网站总是看到调用其他网站的信息的实例,比如在人人网中导入MSN联系人,在Facebook中导入gmail,yahoo mail好友,第三方网站不需要总知道你的密码,对于应用的授权完全交给你自己, ...

  3. Oracle数据库零散知识06 -- Package的定义与简单触发器

    CREATE OR REPLACE PACKAGE pak_02 IS--包头 --这里可定义公共参数 FUNCTION fun_01 RETURN NUMBER; PROCEDURE pro_01 ...

  4. Unity3d 配置OpenCV(EmguCV) 周围环境

    最近毕业.我们一直在研究如何Unity正在使用EmguCV,最后,有些吃老本的今天. 我的环境:Unity3d 4.3.1f             libemgucv-windows-univers ...

  5. Android实现手机拍照功能

    一.布局文件main.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmln ...

  6. QSettings提供了非常方便的注册表读写

    Qt的QSettings提供了非常方便的注册表读写 写入: //写入注册表 void setRegValue( QString strPath, QString strItemName, QStrin ...

  7. 【64.52%】【codeforces 697D】Puzzles

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  8. No USB devices or running emulators detected”

    每次重装系统之后,安装andorid studio后,使用真机调试代码,就会出现"No USB devices or running emulators detected"的错误, ...

  9. yii2框架学习一 yii安装与常见问题

    1 安装安装有两种  cpmposer 喝归档文件 安装  这里采用的归档文件安装    归档文件安装分为两种 基础末班和高级模板,这里采用高级模板  在官网或者yii-china 下载归档文件  解 ...

  10. hudson添加批处理编译命令的注意事项

    作者:朱金灿 来源:http://blog.csdn.net/clever101 Hudson可以在Build Step里添加自定义的批处理命令,如下图: 需要注意的是这些批处理命令并不能识别huds ...