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分割文件的常用方法
Nov 01 Python
Django中利用filter与simple_tag为前端自定义函数的实现方法
Jun 15 Python
Python生成器定义与简单用法实例分析
Apr 30 Python
Python高级用法总结
May 26 Python
python 多线程将大文件分开下载后在合并的实例
Nov 09 Python
python设计微型小说网站(基于Django+Bootstrap框架)
Jul 08 Python
python中Lambda表达式详解
Nov 20 Python
python 基于卡方值分箱算法的实现示例
Jul 17 Python
Python ConfigParser模块的使用示例
Oct 12 Python
TensorFlow低版本代码自动升级为1.0版本
Feb 20 Python
用Python远程登陆服务器的步骤
Apr 16 Python
让文件路径提取变得更简单的Python Path库
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原型模式
2014/11/25 PHP
PHP中使用Imagick操作PSD文件实例
2015/01/26 PHP
PHP实现生成唯一会员卡号
2015/08/24 PHP
PHP反射实际应用示例
2019/04/03 PHP
JavaScript 基础问答三
2008/12/03 Javascript
js禁止小键盘输入数字功能代码
2011/08/01 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
JavaScript的==运算详解
2016/07/20 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
2017/01/17 Javascript
Angular中实现树形结构视图实例代码
2017/05/05 Javascript
vue router路由嵌套不显示问题的解决方法
2017/06/17 Javascript
详解webpack进阶之插件篇
2017/07/06 Javascript
node.js中http模块和url模块的简单介绍
2017/10/06 Javascript
js 公式编辑器 - 自定义匹配规则 - 带提示下拉框 - 动态获取光标像素坐标
2018/01/04 Javascript
vue获取验证码倒计时组件
2019/08/26 Javascript
[02:35]DOTA2英雄基础教程 末日使者
2013/12/04 DOTA
[54:10]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
Python编写简单的HTML页面合并脚本
2016/07/11 Python
Django添加favicon.ico图标的示例代码
2018/08/07 Python
【python】matplotlib动态显示详解
2019/04/11 Python
PyQt5下拉式复选框QComboCheckBox的实例
2019/06/25 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
python标记语句块使用方法总结
2019/08/05 Python
简单易懂Pytorch实战实例VGG深度网络
2019/08/27 Python
python 装饰器的实际作用有哪些
2020/09/07 Python
python基于exchange函数发送邮件过程详解
2020/11/06 Python
HTML5为输入框添加语音输入功能的实现方法
2017/02/06 HTML / CSS
C语言中break与continue的区别
2012/07/12 面试题
机械系大学毕业生推荐信
2013/11/27 职场文书
毕业生的自我鉴定该怎么写
2013/12/02 职场文书
幼儿园门卫制度
2014/01/29 职场文书
初中生自我鉴定
2014/02/04 职场文书
3的组成教学反思
2014/04/30 职场文书
迎国庆横幅标语
2014/10/08 职场文书
党员作风建设自查报告
2014/10/23 职场文书
重温入党誓词主持词
2015/06/29 职场文书