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用Bottle轻量级框架进行Web开发
Jun 08 Python
django model去掉unique_together报错的解决方案
Oct 18 Python
Python简单计算文件MD5值的方法示例
Apr 11 Python
python通过ffmgep从视频中抽帧的方法
Dec 05 Python
解决python给列表里添加字典时被最后一个覆盖的问题
Jan 21 Python
python3.4爬虫demo
Jan 22 Python
python简单贪吃蛇开发
Jan 28 Python
python getopt模块使用实例解析
Dec 18 Python
python实现高斯投影正反算方式
Jan 17 Python
python同时遍历两个list用法说明
May 02 Python
Python读取多列数据以及用matplotlib制作图表方法实例
Sep 23 Python
python 算法题——快乐数的多种解法
May 27 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 字符串中的\n换行符无效、不能换行的解决方法
2014/04/02 PHP
PHP实现获取图片颜色值的方法
2014/07/11 PHP
关于WordPress的SEO优化相关的一些PHP页面脚本技巧
2015/12/10 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
2015/12/17 PHP
php+Ajax处理xml与json格式数据的方法示例
2019/03/04 PHP
PHP使用CURL实现下载文件功能示例
2019/06/03 PHP
javascript 读取XML数据,在页面中展现、编辑、保存的实现
2009/10/27 Javascript
Node.js的文件权限及读写flag详解
2016/10/11 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
2016/11/18 Javascript
jQuery插件HighCharts实现的2D对数饼图效果示例【附demo源码下载】
2017/03/09 Javascript
BootstrapValidator实现注册校验和登录错误提示效果
2017/03/10 Javascript
JavaScript实现各种排序的代码详解
2017/08/28 Javascript
浅谈es6 javascript的map数据结构
2017/12/14 Javascript
微信小程序 腾讯地图SDK 获取当前地址实现解析
2019/08/12 Javascript
npm 语义版本控制详解
2019/09/10 Javascript
js实现聊天对话框
2020/02/08 Javascript
JavaScript中的执行环境和作用域链
2020/09/04 Javascript
[47:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python中多线程thread与threading的实现方法
2014/08/18 Python
Python使用reportlab将目录下所有的文本文件打印成pdf的方法
2015/05/20 Python
Python扩展内置类型详解
2018/03/26 Python
基于Pandas读取csv文件Error的总结
2018/06/15 Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
2018/06/22 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
2018/10/11 Python
Win10环境python3.7安装dlib模块趟过的坑
2019/08/01 Python
python+opencv边缘提取与各函数参数解析
2020/03/09 Python
《孔子游春》教学反思
2014/02/25 职场文书
师德师风自我剖析材料
2014/09/27 职场文书
无子女夫妻离婚协议书(4篇)
2014/10/20 职场文书
2014年法院工作总结
2014/11/24 职场文书
2014社会治安综合治理工作总结
2014/12/04 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
2016党员干部政治学习心得体会
2016/01/23 职场文书
《小乌鸦爱妈妈》教学反思
2016/02/19 职场文书
曾国藩励志经典名言37句,蕴含哲理
2019/10/14 职场文书
Python序列化与反序列化相关知识总结
2021/06/08 Python