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下使用Psyco模块优化运行速度
Apr 05 Python
在Mac OS系统上安装Python的Pillow库的教程
Nov 20 Python
Python3实现Web网页图片下载
Jan 28 Python
python中range()与xrange()用法分析
Sep 21 Python
Python开发的十个小贴士和技巧及长常犯错误
Sep 27 Python
python命令行工具Click快速掌握
Jul 04 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
Jun 09 Python
基于logstash实现日志文件同步elasticsearch
Aug 06 Python
Django3中的自定义用户模型实例详解
Aug 23 Python
Python importlib模块重载使用方法详解
Oct 13 Python
python3美化表格数据输出结果的实现代码
Apr 14 Python
python基础之文件操作
Oct 24 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下将图片以二进制存入mysql数据库中并显示的实现代码
2010/05/27 PHP
PHP的AES加密算法完整实例
2016/07/20 PHP
Symfony2针对输入时间进行查询的方法分析
2017/06/28 PHP
laravel 使用事件系统统计浏览量的实现
2019/10/16 PHP
PHP实现简单的协程任务调度demo示例
2020/02/01 PHP
Laravel + Elasticsearch 实现中文搜索的方法
2020/02/02 PHP
Js callBack 返回前一页的js方法
2008/11/30 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
2015/01/12 Javascript
高性能JavaScript循环语句和条件语句
2016/01/20 Javascript
关于json字符串与实体之间的严格验证代码
2016/11/10 Javascript
nodejs 图片预览和上传的示例代码
2017/09/30 NodeJs
浅谈JS对象添加getter与setter的5种方法
2018/06/09 Javascript
JS实现图片旋转动画效果封装与使用示例
2018/07/09 Javascript
浅谈vue中$bus的使用和涉及到的问题
2020/07/28 Javascript
JS如何监听div的resize事件详解
2020/12/03 Javascript
跟老齐学Python之深入变量和引用对象
2014/09/24 Python
Django1.7+python 2.78+pycharm配置mysql数据库教程
2014/11/18 Python
20招让你的Python飞起来!
2016/09/27 Python
Python实现删除时保留特定文件夹和文件的示例
2018/04/27 Python
Python实现模拟浏览器请求及会话保持操作示例
2018/07/30 Python
详解爬虫被封的问题
2019/04/23 Python
详解python中index()、find()方法
2019/08/29 Python
python的pyecharts绘制各种图表详细(附代码)
2019/11/11 Python
Django自带的用户验证系统实现
2020/12/18 Python
非常漂亮的CSS3百叶窗焦点图动画
2016/02/24 HTML / CSS
Myprotein蛋白粉美国官网:欧洲畅销运动营养品牌
2016/11/15 全球购物
Puma印度官网:德国运动品牌
2019/10/06 全球购物
前台文员个人求职信范文
2014/01/05 职场文书
《恐龙》教学反思
2014/04/27 职场文书
社区科普工作方案
2014/06/03 职场文书
素质教育标语
2014/06/27 职场文书
2014国庆节商场促销活动策划方案
2014/09/16 职场文书
2015年青年志愿者协会工作总结
2015/04/27 职场文书
供应商食品安全承诺书
2015/04/29 职场文书
java多态注意项小结
2021/10/16 Java/Android
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL