使用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. Android Material Design 5.0 PickerDialog

    5.0系统下的时间选择器效果图: 该项目兼容到3.0下面所以用第三方开源项目:actionbarsherlock,动画效果兼容:nineoldandroids-2.4.0.jar,格式转换器:joda ...

  2. PatentTips - Heterogeneous Parallel Primitives Programming Model

    BACKGROUND 1. Field of the Invention The present invention relates generally to a programming model ...

  3. js进阶 9-9 html控件如何实现回车键切换焦点

    js进阶 9-9 html控件如何实现回车键切换焦点 一.总结 一句话总结:在onkeydown事件中判断event对象的键位码,然后focus事件. 二.js进阶 9-9 html控件如何实现回车键 ...

  4. erlang数字转字符串

    http://fengmm521.blog.163.com/blog/static/2509135820147922355273/ 如果有一个数字,你想要转换成字符串这个在Erlang中是怎么操作的, ...

  5. codeblocks按c99标准编译c文件的设置

    作者:朱金灿 来源:http://blog.csdn.net/clever101 早上用codeblocks编译一个c文件,出现这样一个编译错误: +'for'+loop+initial+declar ...

  6. 【codeforces 765C】Table Tennis Game 2

    [题目链接]:http://codeforces.com/contest/765/problem/C [题意] 枚举游戏先拿到k分的人胜; 然后两个人一个人得了a分,一个人得了b分; 问你最多可能进行 ...

  7. js中的对象与数组

    js对象与数组是js中最基本的概念, 定义对象时可用 var a = {} 定义一个空对象 定义数组时可用 var a = [] 定义一个空字符串.. 在对象中只是存在属性,属性与值之间用" ...

  8. 【Unity Shaders】Lighting Models —— 灯型号Lit Sphere

    考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同一时候会加上一点个人理解或拓展. 这里是本书全部的插图.这里是本书所需的代码和资源(当然你 ...

  9. 【BZOJ 1022】 [SHOI2008]小约翰的游戏John

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1022 [题意] [题解] 和这题类似http://blog.csdn.net/harl ...

  10. 【p093】细胞分裂

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] Hanks博士是BT(Bio-Tech,生物技术)领域的知名专家.现在,他正在为一个细胞实验做准备工作 ...