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


Posted in Python onJanuary 15, 2018

系统环境: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实现windows下的抓包与解析

总结

以上所述是小编给大家介绍的使用Python实现windows下的抓包与解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
爬山算法简介和Python实现实例
Apr 26 Python
python搜索指定目录的方法
Apr 29 Python
Python使用turtule画五角星的方法
Jul 09 Python
Python 使用SMTP发送邮件的代码小结
Sep 21 Python
python 读取excel文件生成sql文件实例详解
May 12 Python
Python多项式回归的实现方法
Mar 11 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
Jul 25 Python
修改 CentOS 6.x 上默认Python的方法
Sep 06 Python
Pycharm中import torch报错的快速解决方法
Mar 05 Python
Python爬虫回测股票的实例讲解
Jan 22 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
Jan 27 Python
基于tensorflow权重文件的解读
May 26 Python
Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
Jan 15 #Python
Python操作mysql数据库实现增删查改功能的方法
Jan 15 #Python
使用python编写简单的小程序编译成exe跑在win10上
Jan 15 #Python
python逆向入门教程
Jan 15 #Python
Python3一行代码实现图片文字识别的示例
Jan 15 #Python
Python编程二分法实现冒泡算法+快速排序代码示例
Jan 15 #Python
selenium python浏览器多窗口处理代码示例
Jan 15 #Python
You might like
php学习笔记之 函数声明
2011/06/09 PHP
php中过滤非法字符的具体实现
2013/10/29 PHP
6个超实用的PHP代码片段
2015/08/10 PHP
php set_include_path函数设置 include_path 配置选项
2016/10/30 PHP
php安全配置记录和常见错误梳理(总结)
2017/03/28 PHP
什么是PHP7中的孤儿进程与僵尸进程
2019/04/14 PHP
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.2 0
2008/03/22 Javascript
JS Range HTML文档/文字内容选中、库及应用介绍
2011/05/12 Javascript
javascript从右边截取指定字符串的三种实现方法
2013/11/29 Javascript
JavaScript中的函数模式详解
2015/02/11 Javascript
JavaScript的事件代理和委托实例分析
2015/03/25 Javascript
ajax+jQuery实现级联显示地址的方法
2015/05/06 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
2015/06/05 Javascript
借助FileReader实现将文件编码为Base64后通过AJAX上传
2015/12/24 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
2016/01/29 Javascript
JavaScript九九乘法口诀表的简单实现
2016/10/04 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
bootstrap可编辑下拉框jquery.editable-select
2017/10/12 jQuery
JavaScript的查询机制LHS和RHS解析
2019/08/16 Javascript
angular inputNumber指令输入框只能输入数字的实现
2019/12/03 Javascript
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
Linux下安装python3.6和第三方库的教程详解
2018/11/09 Python
Python实现时间序列可视化的方法
2019/08/06 Python
django创建最简单HTML页面跳转方法
2019/08/16 Python
可持续未来的时尚基础:Alternative Apparel
2019/05/06 全球购物
俄罗斯连接商品和买家的在线平台:goods.ru
2020/11/30 全球购物
Java servlet面试题
2012/03/04 面试题
物流专业毕业生推荐信范文
2013/11/18 职场文书
三分钟演讲稿事例
2014/03/03 职场文书
活动总结书
2014/05/08 职场文书
啤酒节策划方案
2014/05/28 职场文书
电力培训学习心得体会
2016/01/11 职场文书
党性修养心得体会2016
2016/01/21 职场文书
话题作文之呼唤
2019/12/18 职场文书
html5中sharedWorker实现多页面通信的示例代码
2021/05/07 Javascript
logback 实现给变量指定默认值
2021/08/30 Java/Android