设为首页 收藏本站
查看: 978|回复: 0

Windows下使用scapy+python2.7实现对pcap文件的读写操作

[复制链接]

尚未签到

发表于 2015-5-14 07:28:46 | 显示全部楼层 |阅读模式
  scapy在linux环境中对pcap文件进行操作非常方便,但在windows下,特别是在python2.7环境下却会碰到各种各样的依赖包无法使用的问题,最明显的可能就属dnet和pcap的python依赖包了,因为scapy的conf.use_pcap和conf.use_dnet在windows环境下无法进行配置,在scapy\arch\windows\__init__.py中都被强行置为1了,也就是必须使用pcap和dnet依赖包。具体代码如下所示



from scapy.sendrecv import debug, srp1
from scapy.layers.l2 import Ether, ARP
from scapy.data import MTU, ETHER_BROADCAST, ETH_P_ARP
conf.use_pcap = 1
conf.use_dnet = 1
from scapy.arch import pcapdnet
from scapy.arch.pcapdnet import *
LOOPBACK_NAME="lo0"
WINDOWS = True
  google了一遍,基本都是在Windos+python2.6的环境下使用scapy的,很少有使用Windows+python2.7的,几经周折,又cygwin又是MinGW的总算搞定dnet和pcap在Windows+python2.7的包。
  具体下载地址为:
  pcap http://files.iyunv.com/Jerryshome/pcap-1.1.win32-py2.7.rar
  dnet http://files.iyunv.com/Jerryshome/dnet-1.12.win32-py2.7.rar
  
  以下代码对如何使用scapy完成pcap的读写做了展示,同时为解决部分scapy解析出来的Packet无法序列化的问题提供一个PicklablePacket类,具体代码如下:



import scapy
from scapy.all import *
from scapy.utils import PcapReader, PcapWriter
import gzip,zlib,cPickle
class PicklablePacket:
'''
A container for scapy packets that can be pickled
(in contrast to scapy pakcets themselves)
'''
def __init__(self, pkt):
self.contents = str(pkt)
self.time = pkt.time
def __call__(self):
'''
Get the original scapy packet
'''
pkt = scapy.layers.l2.Ether(self.contents)
pkt.time = self.time
return pkt
def dumps(self):
'''use cpickle to dump'''
return gzip.zlib.compress(cPickle.dumps(self)).encode('base64')
@staticmethod
def loads(string):
'''
load object from string
'''
p = cPickle.loads(gzip.zlib.decompress(string.decode('base64')))
return p()


def read(file_name, start, count):
'''
read packets from pcap according to the start packet number and total count
'''
reader = PcapReader(file_name)
if start > 0:
reader.read_all(start)
if count > 0:
return reader.read_all(count)
else:
return reader.read_all(-1)
def write(file_name, packets):
writer = PcapWriter(file_name, append = True)
for p in packets:
writer.write(p)
writer.flush()
writer.close()
if __name__ == '__main__':
packets = read('726445CD34B7273EBEA2973BBD6E784C.C39BC427.pcap', 0, 10)
# packle the packets to transfer
p = PicklablePacket(packets[0])
s =  p.dumps()
p = PicklablePacket.loads(s)
print p
print p.summary()
serialized_packets = [PicklablePacket(p).dumps() for p in packets]
deserialized_packets = [PicklablePacket.loads(s) for s in serialized_packets]
write('new.pcap', packets)
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-66694-1-1.html 上篇帖子: Windows Mobile 7 May See Release Later This Year 下篇帖子: [转载]Windows 7默认共享无法访问
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表