python 的 scapy库,实现网卡收发包的例子


Posted in Python onJuly 23, 2019

问题:

测试时 收发流采用TestCenter、SmartBit等仪表来进行。如果仍采用其进行自动化冒烟,则会带来效率低、成本高的问题。

解决方案:

采用网卡来收发流,虽然有性能统计上的缺陷,但可以验证一些基本功能,且经济。

采用scapy模块,

1-获取计算机网卡的iface,并预先设计好用哪些iface进行收发流;

2-conf.L2listen对各个iface进行监听

3-subprocess.Popen来调用tShark.exe启动抓包,也可以调用ping.exe构造ping包

4-sendp发送二层报文,send发送三层报文

5-sniff嗅探iface上的指定报文,可以有过滤条件

6-停止wireshark抓包

7-close关闭对iface的监听

讨论:

没有尝试采用sr1、srp来进行收发包。

整个过程相对比较清晰,而且步骤是成对出现,方便记忆。

sniff嗅探时,会丢掉iface前面出现的部分报文,这个问题可能是没有执行好监听和启动抓包导致。

没有对网卡的具体性能标准作出说明,可能需要摸着石头过河,如果发现网卡有不合适测试的,需要立即切换到仪表来测试。

#! usr/bin/env python
# -*- coding:utf-8 -*-
import os
import sys
import re
import struct
import string
from scapy.all import *
import subprocess

conf.use_pcap = True 

'''
cmd
python
from scapy.all import *
ls(Ether())
ls(IP())
ls(ICMP())
send(IP(dst='1.2.3.4')/ICMP())
sendp(Raw("zhongxing"), iface='eth15', loop=1, inter=0.2, verbose=False)
设置 inter 参数来设置发送相邻两个包直接的时间间隔
设置 timeout 参数来设置等待应答的超时时间
设置 retry 参数来设置重试次数。
'''


print u"实现网卡发包"
target = []
for i in range(1,len(sys.argv)):
  m = sys.argv[i].split('=')
  if m[0]=='-t':
    target.append(m[1])
  if m[0]=='-ip':
    target.append(m[1])
  if m[0]=='-mac':
    target.append(m[1])
print 'test -- ',target
print

print u'获取网卡的iface'
eth_local = []
a = repr(conf.route).split('\n')
for x in a:
  b = []
  b = x.split(' ')
  for y in b:
    if re.search('eth', y):
      eth_local.append(y)
print u'去重复'
c = []
c.append(eth_local[0])
for i in range(0,len(eth_local),1):
  m = 0
  for j in range(0,len(c),1):
    if c[j] == eth_local[i]:
      m += 1
  if m==0:
    c.append(eth_local[i])
print c #['eth15', 'eth21', 'eth17']

print u'创建二层报文'
src_mac = '00:00:11:11:22:22'
dst_mac = '00:00:22:22:11:11'
dst_ip = '1.2.3.4'
src_ip = '5.6.7.8'
src_port = 1234
dst_port = 5678

##ls()
##ls(IP())
##IP().show()
##lsc()
pack_ip = IP(dst=dst_ip, src=src_ip, proto=1)
##ls(ICMP())
##ls(UDP())
pack_icmp = ICMP(type=8)
##ls(Ether())
pack_ether = Ether(dst=dst_mac, src=src_mac, type=0x0800)
info = Raw('zhongxing')
t = str(pack_ether/pack_ip/pack_icmp/info)
s = Ether(t)
print u'待发送的报文为:',s.summary
eth = c[1]
print u'发送的网卡iface为 %s\n' % eth

print u'---------开始监听 - 发送icmp - 嗅探icmp - 关闭监听----------'
print u'---------开始监听-------------'
L2socket = conf.L2listen
listen_socket = L2socket(type=ETH_P_ALL, iface=eth)
print listen_socket
print conf.L2listen

####启动抓包
##cmd='C:\Program Files (x86)\Wireshark\tShark.exe'
##card_id = str(1)
##cap_file = str('H:\python\test.pcap')
##args = [cmd,"-i "+card_id,"-w",cap_file]
##print "*DEBUG*",args
##p=subprocess.Popen(args)


print u'---------sendp()函数调用----------'
sendp(s,iface=eth, verbose=False)

##print u'---------srp()函数调用----------'
##sr 函数是 Scapy 的核心,这个函数返回两个列表,
##第一个列表是收到应答的包和其对应的应答,
##第二个列表是未收到应答的包,
##通常,我们需要调用别的函数来使得这两个返回值更易于阅读,
##help(srp)
##p = srp(s,iface=c[1], verbose=False)
##print p.show()

print u'---------嗅探、过滤、保存pcap、读取pcap----------'
##print sniff.__doc__
##pkts = sniff(iface = 'eth15',filter = 'icmp',count = 3, prn=lambda x: x.summary())
ip = '172.10.0.1'
subprocess.Popen(["ping.exe", ip]) #提供给sniff
##Ether / IP / ICMP 172.10.1.124 > 172.10.0.1 echo-request 0 / Raw
##Ether / IP / ICMP 172.10.0.1 > 172.10.1.124 echo-reply 0 / Raw
##Ether / IP / ICMP 172.10.1.124 > 172.10.0.1 echo-request 0 / Raw
##listen_socket1 = L2socket(listen_socket)
##pkts = sniff(iface = eth,filter = 'icmp',count = 20, timeout = 10, L2socket=listen_socket)
pkts = sniff(iface = eth, filter = 'icmp', count = 20, timeout = 10) 
try:
  if 0 < len(pkts):
    print u'---------嗅探到报文----------'
    ##pkts[0].show()
    wrpcap('demo.pcap',pkts)
    read_pkts = rdpcap('demo.pcap')
    print read_pkts[0]

    print u'---------------输出base64编码格式的数据---------------'
    export_object(str(pkts[0]))

    print u'---------------转换为base64编码格式的数据---------------'
    newPkt = import_object('eNprYAqN+Q8GGp/TOCfN5GBwZWDwc/nCwNAgOItrDRdjLxD/Z+gEQitpgwvijAIMjAxgoODmAYLO\
    /m7ebq6ubs7+ri6uAa5+YNrf2dHREaiEgbGQUQ8AnjEcMQ==')
    print newPkt
    s = Ether(newPkt)
    print u'待发送的报文为:',s.summary
    sendp(s,iface=eth, verbose=False)
  else:
    print u'---------没有嗅探到报文----------'
except:
  pass
finally:
  print u'---------关闭监听-------------'
  listen_socket.close()

以上这篇python 的 scapy库,实现网卡收发包的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用7z解压apk包的方法
Apr 18 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
May 31 Python
使用Python的turtle模块画图的方法
Nov 15 Python
Pycharm无法显示动态图片的解决方法
Oct 28 Python
Python Scapy随心所欲研究TCP协议栈
Nov 20 Python
利用Pycharm断点调试Python程序的方法
Nov 29 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
Jun 18 Python
python爬虫模拟浏览器的两种方法实例分析
Dec 09 Python
浅谈Python3实现两个矩形的交并比(IoU)
Jan 18 Python
PyCharm GUI界面开发和exe文件生成的实现
Mar 04 Python
pytorch下的unsqueeze和squeeze的用法说明
Feb 06 Python
python中zip()函数遍历多个列表方法
Feb 18 Python
python3+django2开发一个简单的人员管理系统过程详解
Jul 23 #Python
Django框架之DRF 基于mixins来封装的视图详解
Jul 23 #Python
flask框架路由常用定义方式总结
Jul 23 #Python
python处理大日志文件
Jul 23 #Python
Django urls.py重构及参数传递详解
Jul 23 #Python
Django框架基础模板标签与filter使用方法详解
Jul 23 #Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
Jul 23 #Python
You might like
php长字符串定义方法
2012/07/12 PHP
使用PHP函数scandir排除特定目录
2014/06/12 PHP
php中socket的用法详解
2014/10/24 PHP
phpcms配置列表页以及获得文章发布时间
2017/07/04 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
广告代码静态化js通用函数
2007/05/09 Javascript
firefox下frameset取不到值的解决方法
2010/09/06 Javascript
跟我学Node.js(四)---Node.js的模块载入方式与机制
2014/06/04 Javascript
JS实现表单验证功能(验证手机号是否存在,验证码倒计时)
2016/10/11 Javascript
JavaScript中常见的八个陷阱总结
2017/06/28 Javascript
vue头部导航动态点击处理方法
2018/11/02 Javascript
vue接通后端api以及部署到服务器操作
2020/08/13 Javascript
利用一个简单的例子窥探CPython内核的运行机制
2015/03/30 Python
Python基于动态规划算法计算单词距离
2015/07/25 Python
PHP网页抓取之抓取百度贴吧邮箱数据代码分享
2016/04/13 Python
python使用正则表达式替换匹配成功的组
2017/11/17 Python
django js实现部分页面刷新的示例代码
2018/05/28 Python
用Python3创建httpServer的简单方法
2018/06/04 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
python openCV获取人脸部分并存储功能
2019/08/28 Python
TensorFlow获取加载模型中的全部张量名称代码
2020/02/11 Python
Python任务调度模块APScheduler使用
2020/04/15 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
2020/06/30 Python
世界领先的以旅馆为主的在线预订平台:Hostelworld
2016/10/09 全球购物
英国第一摩托车和摩托车越野配件商店:GhostBikes
2019/03/10 全球购物
俄罗斯达美乐比萨外送服务:Domino’s Pizza
2020/12/18 全球购物
最新的互联网创业计划书
2014/01/10 职场文书
水污染治理工程专业自荐信
2014/06/21 职场文书
安全生产工作汇报材料
2014/10/28 职场文书
单位接收函范文
2015/01/30 职场文书
家长反馈意见及建议
2015/06/03 职场文书
干货:我将这样书写我的演讲稿!
2019/05/09 职场文书
导游词之无锡古运河
2019/11/14 职场文书
Ajax常用封装库——Axios的使用
2021/05/08 Javascript
Python访问Redis的详细操作
2021/06/26 Python
Win10系统搭建ftp文件服务器详细教程
2022/08/05 Servers