一、程序说明

本程序有两个要点,第一个要点是读取wireshark数据包(当然也可以从网卡直接捕获改个函数就行),这个使用pyshark实现。pyshark是tshark的一个python封装,至于tshark可以认为是命令行版的wireshark,随wireshark一起安装。

第二个要点是追踪流,追踪流在wireshark中是“tcp.stream eq 70”之类的形式,但是70这类值暂是不知道具体怎么计算出来的,但从网上资料看,是依据[IP address A, TCP port A, IP address B, TCP port B]四元组计算出来的,只要这四个值一样那么计算出来的tcp.stream也就一样,就认为是同一个流。那么,反过来也就是说“tcp.stream eq 70”这种形式,其实等价于"ip.addr == ip_a and tcp.port == port_a and ip.addr == ip_b and tcp.port == port_b"的形式,我们这里就是用这种形式来追踪telnet流。

至于为什么一再强调是追踪telnet流而不是追踪流,是因为感觉各应用层协议没有统一获取应用层协议内容的方法,比如这里通过tmp_packet[highest_layer_name].get_field('data')形式读取telnet数据的,但http则得用tmp_packet['http'].file_data读取,ftp等其他协议又要通过其他不同属性来获取。

另外还要说明的一点是,数据包的每次过滤主要是借助写display_filter重新读取数据包文件,而不是将所有数据包读入后自己写代码进行过滤(就实际来看这种方法比借助写display_filter重新读取数据包文件要复杂且运行速度要慢)或者写display_filter进行二次过滤(tshark本身就不支持二次过滤,就观察来看wireshark自己也没有二次过滤这种东西在执行过滤器表达式时都是重新读取数据包文件)

运行效果如下:

二、程序源代码

importpysharkclasswireshark_analysis_script():#此函数的作用是封装一下pyshark.FileCapture

defread_packets_from_file(self,packets_file_path,tshark_path,display_filter):

packets_file_obj= pyshark.FileCapture(input_file=packets_file_path,tshark_path=tshark_path,display_filter=display_filter)returnpackets_file_obj#此函数的作用是从传送过来的所有数据包中,抽取并返回{ip_server,ip_client,port_server,port_client}四元组

defget_target_client_ip_port(self,packets_file_obj):for tmp_packet inpackets_file_obj:

ip_server=tmp_packet.ip.src

port_server=tmp_packet.tcp.srcport

ip_client=tmp_packet.ip.dst

port_client=tmp_packet.tcp.dstportyield {"ip_server":ip_server,"port_server":port_server,"ip_client":ip_client, "port_client":port_client}#此函数的作用是读取传过来的所有数据包应用层的数据,并打印

deffollow_tcp_stream(self,packets_file_obj,ip,port):for tmp_packet inpackets_file_obj:

highest_layer_name=tmp_packet.highest_layerif ((tmp_packet.ip.dst == ip) and (tmp_packet.tcp.dstport ==port)):print("server(%s:%s)->client(%s:%s): %s" % (tmp_packet.ip.src, tmp_packet.tcp.srcport, tmp_packet.ip.dst, tmp_packet.tcp.dstport, tmp_packet[highest_layer_name].get_field('data')))elif ((tmp_packet.ip.src == ip) and (tmp_packet.tcp.srcport ==port)):print("client(%s:%s)->server(%s:%s): %s" % (tmp_packet.ip.src, tmp_packet.tcp.srcport, tmp_packet.ip.dst, tmp_packet.tcp.dstport, tmp_packet[highest_layer_name].get_field('data')))if __name__ == '__main__':#要读取的wireshark数据包的所在的路径

packets_file_path = 'F:\\PycharmProjects\\telnet\\pyshark_pack'

#tshark程序所在的路径,tshark随wireshark安装

tshark_path = 'D:\\tools\\Wireshark\\tshark.exe'

#过滤器表达式,与在wireshark中使用时的写法完全相同

first_step_filter = 'telnet contains "HiLinux"'

#用于存放要追踪流的ip和端口

target_client_ip_port =[]#实例化类

wireshark_analysis_script_instance =wireshark_analysis_script()#使用first_step_filter过滤器表达式,过滤出要追踪流的数据包

first_step_obj =wireshark_analysis_script_instance.read_packets_from_file(packets_file_path, tshark_path, first_step_filter)#从要追踪流的数据包中抽取出ip和端口

target_client_ip_port =wireshark_analysis_script_instance.get_target_client_ip_port(first_step_obj)

first_step_obj.close()#遍历要追踪流的ip+端口组合

for target_client_ip_port_temp intarget_client_ip_port:

ip_server= target_client_ip_port_temp['ip_server']

port_server= target_client_ip_port_temp['port_server']

ip_client= target_client_ip_port_temp['ip_client']

port_client= target_client_ip_port_temp['port_client']#这里是追踪流的关键,所有数据包中如果数据包中{ip_server,ip_client,port_server,port_client}四元组相同,那么就认为是同一个流

#当然追踪流一般都是追踪应用层的数据流,所以加上应用层协议运行过滤去掉三次握手四次挥手等没有应用层数据的数据包;我这里要追踪telnet数据流,所以除四元组外还加了telnet做过滤

second_step_filter = 'telnet and ip.addr == %s and ip.addr == %s and tcp.port == %s and tcp.port == %s' %(ip_server,ip_client,port_server,port_client)

second_step_obj=wireshark_analysis_script_instance.read_packets_from_file(packets_file_path, tshark_path, second_step_filter)print("[%s:%s]" %(ip_client, port_client))#调用follow_tcp_stream将认为是同一个流的所有数据包的应用层数据打印

wireshark_analysis_script_instance.follow_tcp_stream(second_step_obj, ip_client, port_client)

second_step_obj.close()

三、使用与wireshark一致的形式【20180929更新】

在前边的解决方案中,我们使用"ip.addr == ip_a and tcp.port == port_a and ip.addr == ip_b and tcp.port == port_b"等价代替wireshark中“tcp.stream eq 70”的形式来实现追踪流,当时的想法是不知道某个流的70这种值如何计算。

现在发现这种值pyshark在tcp.stream属性直接给出了,所以我们完全可以使用和wireshark的“tcp.stream eq 70”一致的形式来追踪流。第二大节程序可等介修改如下。

(当然因为是等价形式所以输出结果还是一样的,都是要重新解析数据包文件所以效率也就差不多,主要是为了说追流可以使用和wireshark一样的形式)

importpysharkclasswireshark_analysis_script():#此函数的作用是封装一下pyshark.FileCapture

defread_packets_from_file(self, packets_file_path, tshark_path, display_filter):

packets_file_obj= pyshark.FileCapture(input_file=packets_file_path, tshark_path=tshark_path, display_filter=display_filter)returnpackets_file_obj#此函数的作用是从传送过来的所有数据包中,抽取并返回{ip_server,ip_client,port_server,port_client}四元组

defget_target_client_ip_port(self, packets_file_obj):for tmp_packet inpackets_file_obj:

ip_server=tmp_packet.ip.src

port_server=tmp_packet.tcp.srcport

ip_client=tmp_packet.ip.dst

port_client=tmp_packet.tcp.dstport

stream_value=tmp_packet.tcp.streamyield {"ip_server": ip_server, "port_server": port_server, "ip_client": ip_client, "port_client": port_client,"stream_value":stream_value}#此函数的作用是读取传过来的所有数据包应用层的数据,并打印

deffollow_tcp_stream(self, packets_file_obj, ip, port):for tmp_packet inpackets_file_obj:

highest_layer_name=tmp_packet.highest_layer#追踪流时会有握手挥手tcp将其排除

if highest_layer_name != "TCP":if ((tmp_packet.ip.dst == ip) and (tmp_packet.tcp.dstport ==port)):print("server(%s:%s)->client(%s:%s): %s" % (tmp_packet.ip.src, tmp_packet.tcp.srcport, tmp_packet.ip.dst, tmp_packet.tcp.dstport, tmp_packet[highest_layer_name].get_field('data')))elif ((tmp_packet.ip.src == ip) and (tmp_packet.tcp.srcport ==port)):print("client(%s:%s)->server(%s:%s): %s" % (tmp_packet.ip.src, tmp_packet.tcp.srcport, tmp_packet.ip.dst, tmp_packet.tcp.dstport, tmp_packet[highest_layer_name].get_field('data')))if __name__ == '__main__':#要读取的wireshark数据包的所在的路径

packets_file_path = 'F:\\PycharmProjects\\telnet\\pyshark_pack'

#tshark程序所在的路径,tshark随wireshark安装

tshark_path = 'D:\\tools\\Wireshark\\tshark.exe'

#过滤器表达式,与在wireshark中使用时的写法完全相同

first_step_filter = 'telnet contains "HiLinux"'

#用于存放要追踪流的ip和端口

target_client_ip_port =[]#实例化类

wireshark_analysis_script_instance =wireshark_analysis_script()#使用first_step_filter过滤器表达式,过滤出要追踪流的数据包

first_step_obj =wireshark_analysis_script_instance.read_packets_from_file(packets_file_path, tshark_path, first_step_filter)#从要追踪流的数据包中抽取出ip和端口

target_client_ip_port =wireshark_analysis_script_instance.get_target_client_ip_port(first_step_obj)

first_step_obj.close()#遍历要追踪流的ip+端口组合

for target_client_ip_port_temp intarget_client_ip_port:#stream的值

stream_value = target_client_ip_port_temp['stream_value']

ip_client= target_client_ip_port_temp['ip_client']

port_client= target_client_ip_port_temp['port_client']#tcp.stream eq 70形式。为了排除tcp其实可以再直接加上and telnet

second_step_filter = 'tcp.stream eq %s' %(stream_value)

second_step_obj=wireshark_analysis_script_instance.read_packets_from_file(packets_file_path, tshark_path, second_step_filter)print("[%s:%s]" %(ip_client, port_client))#调用follow_tcp_stream将认为是同一个流的所有数据包的应用层数据打印

wireshark_analysis_script_instance.follow_tcp_stream(second_step_obj, ip_client, port_client)

second_step_obj.close()

View Code

参考:

python读取数据流_python3+pyshark读取wireshark数据包并追踪telnet数据流相关推荐

  1. wireshark数据包分析学习总结

    前言 用了一周多的时间看了<Wireshark数据包分析实战详解>这本书的第一篇,这前九章的内容主要是讲解wireshark的使用方法和技巧,以及capinfos.dumpcap.edit ...

  2. Python中采用scapy来构建IP数据包

    (1) from scapy.all import IP pkt = IP() #creat a IP data package print(pkt) pkt1 = IP(dst="192. ...

  3. Wireshark数据包分析(详细解析)

    wireshark数据包分析 Wireshark(前称Ethereal)是一个网络封包分析软件.网络封包分析软件的功能是截取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用Win ...

  4. WireShark数据包分析数据封装

    WireShark数据包分析数据封装 数据封装(Data Encapsulation)是指将协议数据单元(PDU)封装在一组协议头和尾中的过程.在OSI七层参考模型中,每层主要负责与其它机器上的对等层 ...

  5. 《Wireshark数据包分析实战(第2版)》目录—导读

    版权声明 Wireshark数据包分析实战(第2版) Copyright © 2011 by Chris Sanders. Title of English-language original:Pra ...

  6. [网络安全课程实验]:WireShark数据包分析

    目录 实验:WireShark数据包分析 一.实验目的 二.实验环境 三.实验内容与实验要求 四.实验过程与分析 TCP三次握手 第一次握手 第二次握手 第三次握手 UDP 五.实验结果总结 实验:W ...

  7. Wireshark数据包分析(一)——使用入门

    Wireshark简介: Wireshark是一款最流行和强大的开源数据包抓包与分析工具,没有之一.在SecTools安全社区里颇受欢迎,曾一度超越Metasploit.Nessus.Aircrack ...

  8. wireshark数据包分析实战 第三、四章

    1,wireshark支持的协议上千种,开源的. 2,wireshark需要winpcap驱动支持.winpcap驱动的作用通过操作系统捕捉原始数据包.应用过滤器.将网卡切换为混杂模式. 3,捕获文件 ...

  9. 《Wireshark数据包分析实战》读书笔记

    1.OSI参考模型中的特殊功能: 表示层(第六层):进行用来保护数据的多种加密和解密操作. 会话层(第五层):负责以全双工或者半双工的方式来创建会话和关闭连接. 传输层(第四层):提供面向连接和无连接 ...

最新文章

  1. ZVM – 记VMP保护代码还原工程
  2. 【Paper】Learning to Predict Charges for Criminal Cases with Legal Basis
  3. express-partials与express4.x不兼容问题
  4. arm workbench ide 用户指南_ARM_异常和中断
  5. Essential Phone PH1原生系统常见问题以及解答
  6. R语言可视化学习笔记之ggpubr包
  7. 18. 分支管理策略
  8. DBC2000是什么?DBC2000数据库文件详解
  9. Python项目--飞机作战完整版(附带图片素材)
  10. ThinkPHP5学校宿舍管理系统
  11. LimeSDR Mini轻松上手系列1: 介绍
  12. 数学猜想验证步骤_猜想验证思想在数学教学中的应用
  13. UVM——Sequencer Driver
  14. qpython3l最新版下载_qpython3l
  15. 最全自动驾驶数据集分享系列八 | 仿真数据集
  16. Codeforces Round #644 (Div. 3) H.Binary Median
  17. Linux下Meepops的搭建
  18. 纽约时报stem竞赛备赛
  19. 奉加微采访 BLE
  20. 在谷歌浏览器chrome上安装tampermonkey插件

热门文章

  1. VS2008水晶报表发布部署总结
  2. 日历视图的XML属性
  3. httpd2.2配置文件详解
  4. 如何理解操作系统的不确定性_温度最低-273度,最高却能有1.4亿亿亿亿度,如何定义的?...
  5. 玩Azkaban跳过的坑
  6. 字节跳动 设计模式 pdf_凭这份pdf我拿下了美团、字节跳动、阿里、小米等大厂的offer...
  7. python实现哈希表
  8. 深度相机(三)--三种方案对比
  9. x = x+1,x+=1,x++那个的执行效率高
  10. matlab 作图 虚线太长,matlab 极坐标绘图 在matlab中,用polar画的图形,如何使虚线圆多显示几个?...