使用Python实现windows下的抓包与解析

yipeiwu_com6年前Python基础

系统环境:windows7,选择windows系统是因为我对自己平时日常机器上的流量比较感兴趣

python环境:python2.7 ,这里不选择python3的原因,是因为接下来要用到的scapy包在python3中安装较于python2要麻烦得多。如果你习惯于用python3,数据包的分析完全可以放在3下面做,因为抓包和分析是两个完全独立的过程。

需要的python包:scapy和dpkt

抓包代码:

from scapy.sendrecv import sniff
from scapy.utils import wrpcap
dpkt = sniff(count = 100)  #这里是针对单网卡的机子,多网卡的可以在参数中指定网卡
wrpcap("demo.pcap", dpkt)

你没看错,仅仅只需要两行代码就可以实现一个简单的抓包功能。sniff函数负责嗅探数据包,而wrpcap函数将抓取到的数据包保存起来。

数据包的分析:

import dpkt
import socket
import datetime
def printPcap(pcap):
try:
for timestamp, buf in pcap:
eth = dpkt.ethernet.Ethernet(buf) #获得以太包,即数据链路层包
print("ip layer:"+eth.data.__class__.__name__) #以太包的数据既是网络层包
print("tcp layer:"+eth.data.data.__class__.__name__) #网络层包的数据既是传输层包
print("http layer:" + eth.data.data.data.__class__.__name__) #传输层包的数据既是应用层包
print('Timestamp: ',str(datetime.datetime.utcfromtimestamp(timestamp))) #打印出包的抓取时间
if not isinstance(eth.data, dpkt.ip.IP):
print('Non IP Packet type not supported %s' % eth.data.__class__.__name__)
continue
ip = eth.data
do_not_fragment =bool(ip.off & dpkt.ip.IP_DF)
more_fragments =bool(ip.off & dpkt.ip.IP_MF)
fragment_offset = ip.off & dpkt.ip.IP_OFFMASK
print('IP: %s -> %s (len=%d ttl=%d DF=%d MF=%d offset=%d)' % (socket.inet_ntoa(ip.src), socket.inet_ntoa(ip.dst), ip.len, ip.ttl, do_not_fragment, more_fragments,fragment_offset))
except:
pass
def main():
f =open('demo.pcap','rb')
pcap = dpkt.pcap.Reader(f)
printPcap(pcap)
if __name__ =='__main__':
main()

结果显示:

这是我打开360的路由器卫士时抓取的数据包。这个软件在打开时与路由器通信,获得连接路由器的电脑和手机的列表。192.168.1.100是我的机器,192.168.1.1是路由器地址,其中可以看到windows发送的数据包的ttl值默认是128,其他的系统默认是64,与我们的理论常识是相符的。

TCP/IP五层分层的结构和封包过程,附图二张:

总结

以上所述是小编给大家介绍的使用Python实现windows下的抓包与解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对【听图阁-专注于Python设计】网站的支持!

相关文章

使用python获取csv文本的某行或某列数据的实例

使用python获取csv文本的某行或某列数据的实例

站长用Python写了一个可以提取csv任一列的代码,欢迎使用。Github链接 csv是Comma-Separated Values的缩写,是用文本文件形式储存的表格数据,比如如下的表...

Python 调用 Windows API COM 新法

Python中调用Win32API 通常都是使用 PyWin32或者ctypes。但要么依赖文件较多,要么用法繁琐。 这里介绍在Python中调用Win32 API 或者COM组件的另一...

Python 获得命令行参数的方法(推荐)

本篇将介绍python中sys, getopt模块处理命令行参数 如果想对python脚本传参数,python中对应的argc, argv(c语言的命令行参数)是什么呢? 需要模块:sy...

python数据库操作常用功能使用详解(创建表/插入数据/获取数据)

实例1、取得MYSQL版本 复制代码 代码如下:# -*- coding: UTF-8 -*-#安装MYSQL DB for pythonimport MySQLdb as mdbco...

python制作mysql数据迁移脚本

用python写了个数据迁移脚本,主要是利用从库将大的静态表导出表空间,载导入到目标实例中。 #!/usr/bin/env python3 #-*- coding:utf8 -*-...