使用scapy库处理pcap包

参考文章

  1. 在服务器10.10.27.105上安装scapy
    一开始尝试使用pip3 install scapy-python3命令,在python3上安装scapy,但是总是报错,报错的原因也没解决,但貌似scapy一开始是基于python2开发的,后来又拓展到了py3上,直接用python2来写吧。。
pip install scapy

2.pcap.py主要是实现将一个pcap包,按照五元组进行划分,统计出它的流的条数

from scapy.all import *
from scapy.utils import PcapReader
import json

pcaps=rdpcap("test-output.pcap")
print 'the number of packets:',pcaps
lists=[]

for packet in pcaps:
    if packet.type == 2048:
        if packet[IP].proto==6 or packet[IP].proto==17:
            five_tuple = "{}:{}_{}:{}_{}".format(packet[IP].src,packet.sport,packet[IP].dst,packet.dport,packet.proto)
            #print five_tuple
            print 1
            lists.append(five_tuple)

f = open("test.txt",'w')
i=0
dicts = {}
for item in lists:
    if lists.count(item)>=1:
        dicts[item]=lists.count(item)
        i = i+1
        print i
        # print dict[item]
        # f.write(dict[item]+"\n")

json_dicts = json.dumps(dicts,indent=1)
f.write(json_dicts+"\n"+"the number of flows:"+str(len(dicts))+"\n"+"the number of tcp/udp packets:"+str(len(lists)))

print json_dicts
print 'the number of flows:',len(dicts)
print 'the number of tcp/udp packets:',len(lists)
  1. change-mac.py主要是将一个pcap包的mac地址改成我们需要的地址,在修改pcap的mac地址时,使用过wrcap()函数,但是该函数没有追加模式,导致for循环结束后,新生成的pcap包只有一个数据包,于是查到了另外一种写方法。
from scapy.all import *
from scapy.utils import PcapReader
from scapy.utils import PcapWriter

pcaps=rdpcap("all_one.pcap")
for packet in pcaps:
    packet.src = "44:a8:42:48:fd:b8"
    packet.dst = "a0:36:9f:9e:81:48"
    wrpcap("hahahhahhhh.pcap",packet)

方法二:追加模式

from scapy.utils import PcapWriter
pktdump = PcapWriter("banana.pcap", append=True, sync=True)
...
pktdump.write(pkt)
...

这种方法写到60000万个包的时候会遇到python最大递归深度错误:maximum recursion depth exceeded while calling a Python object,其实原因是在Python里的递归调用是有限制的,可以使用sys模块里的getrecursionlimit方法查看的到,即:

sys.getrecursionlimit()

打开终端运行python,可以看到默认值为1000:

muzhitaoshi@tensorflow-2-vm:~$ python
Python 2.7.13 (default, Sep 26 2018, 18:42:22) 
[GCC 6.3.0 20170516] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getrecursionlimit()
1000
>>> 

有get自然有set,使用sys.setrecursionlimit()设置递归深度最大值:

sys.setrecursionlimit(1000000)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 模块和包 一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是...
    go以恒阅读 6,732评论 0 4
  • Distutils可以用来在Python环境中构建和安装额外的模块。新的模块可以是纯Python的,也可以...
    MiracleJQ阅读 8,331评论 0 1
  • 太阳与松林一并升起 击在镜中,足迹罕有 此刻深邃广施大地 以及小小的烟窗 把已安排好的时光 远赴并凌驾于青山 为造...
    海子三月归阅读 3,942评论 36 44
  • 今天我们班级的座位进行了一个小小的调整。我们教室的后面增设了两个座位,而前排则减少了两个位置。高老师在班队课中宣布...
    陈果_fd4d阅读 994评论 1 2
  • 很多码字的人最最困惑的事估计就是关于日更与不日更,日更了又怕自已的文章质量跟不上,不日更又怕自已一颗懒惰的心。 曾...
    在水一方含阅读 2,144评论 0 3