python wireshark_用python编写脚本从wireshark导出的数据文件中提取数据

上篇文章搭建了一个UDP多播程序的基础,所谓基础,就是看着它,我可以写简单的多播程序了,可以在这个基础上面开始工作了。

会多播了,多播的内容从哪里来,播出什么内容呢?呵呵,有个设备,没有通讯协议,用wireshark抓包,分析协议,编程实现之,这就是此次多播的任务。

启动wireshark,抓取数据包,导出为文本文件,三五十兆的文件,ultraedit搜索,观察,眼睛都看直了,有设备通讯数据,还有上网浏览的数据,有QQ的数据,有MSN的数据,还有些不知所以的数据,看了个晕头转向,感觉设备的通讯数据的结构有点规律,有门儿。咱是程序员,有啥问题看看能不能编程解决呢,上python,提取数据,这样子会让分析数据方便一些,还能用提取的数据做测试。

看看wireshark导出数据格式,每个数据段都是“NO.”开头的,接下来的一行是源IP和目标IP,后面还有一段“Data:”标识的数据段,有规律,我用python提取这些数据没问题。如果规律不明显我就没辙了。

Python程序要完成的功能:

l提取指定ip地址的数据,把数据包部分保存到一个文件A中,这就方便观察设备发送的数据,定义出相关的结构

l然后从文件A中,提取出数据部分,保存为文件B,我在VC程序中读取这个文件B,尝试解析这些数据,如果能够成功解析,我的工作就基本完成了

看程序。

#coding=gb18030

import fileinput

# 本程序的bug:因为导出二进制数据时,字符串匹配以"0000 "为

# 开始标志,这与wireshark导出文件的第一个包的时间0.000000相

# 同,所以第一个你要手工把0.000000改为0.000001。

# 本程序就是为了导出数据加以分析,不必为了修正上面的bug绕半天

#

# 在介绍本程序功能之前,先了解一下wireshark文件的格式。

# wireshark导出文件格式,"No."是开始标志,开始标志的

# 下一行是ip地址和协议信息,接下来是它协议分析的一些输出

# 最后是Data。

#

#No. Time Source Destination Protocol Info

# 16 58.5 192.168.0.66 234.5.6.7 UDP Source port: 1024 Destination port: synchronet-db

#

# 这中间是wireshark分析的输出

#

#

#Data (40 bytes)

#

#0000 e9 24 00 00 ff ff 01 00 02 00 00 00 d2 04 00 00 .$..............

#0010 14 00 00 00 42 03 01 00 00 00 00 00 05 00 00 00 ....B...........

#0020 02 00 00 00 33 00 00 00 ....3...

#

#-------------------------------------------------------

# 本程序的功能是读取wireshark的导出文件,过滤出指定ip的数据

# 1. Print_Data_Text导出从一个"No."到下一个"No."之间的内容

# 2. Print_Data_bin 导出"Data "部分的内容,格式如下:

#e9 24 00 00 ff ff 01 00 02 00 00 00 d2 04 00 00

#14 00 00 00 42 03 01 00 00 00 00 00 05 00 00 00

#02 00 00 00 33 00 00 00

#----

#e9 24 00 00 ff ff 01 00 02 00 00 00 d2 04 00 00

#14 00 00 00 42 03 01 00 00 00 00 00 05 00 00 00

#02 00 00 00 33 00 00 00

#在两个数据包之间插入了一样"----",

# 3. Print_IP_Line 仅导出包含ip的行,就是"No."下面的那行

#-------------------------------------------------------

# 如何设置导出数据的条件:

# 导出数据的条件

# and字段的内容必须全部满足

# or字段的内容,至少满足一个

# and 字段和 or 字段都满足

# 如果and字段不存在,则认为条件满足

# 如果or字段不存在,则认为条件满足

#No. Time Source Destination Protocol Info

#14 9.949685 192.168.0.66 234.5.6.7 UDP Source port: onehome-remote Destination port: synchronet-db

# 举例:

# 导出满足下面条件的数据:

# No.下面一行的数据,包含"234.5.6.7"和"UDP",

# 并且包含"192.168.0.202"和"192.168.0.22"之一

# cond = []

# cond.append({

# "and":["234.5.6.7", "UDP"],

# "or":["192.168.0.202", "192.168.0.22"],

# })

#

#-------------------------------------------------------

# 导出满足条件的数据, 为了在导出的文件中能看到数据是从

# 源文件的那个地方来的,导出的数据可以带有行号信息,行号

# 添加在每行数据的前面

# fileName: 原始数据文件名称

# saveto : 导出数据保存文件名称

# cond : 数据需要满足的条件

# with_ln_number : 导出数据时是否带行号

# 只有带行号的数据,才能被Print_Data_bin函数使用

def Print_Data_Text(fileName, saveto, cond, with_ln_number=True):

f1 = open(saveto, 'w+')

ln = []

myfile = fileinput.input(fileName)

for x in myfile:

ln.append(x)

start_flag = 0

start_ln = 0

end_ln = 0

end_flag = 0

find_count = 0

print " "

for i in range(0,len(ln)):

if ln[i].find("No.") == 0 and start_flag == 1:

start_flag = 0

if ln[i].find("No.") == 0 and start_flag == 0:

if Check_Expr(ln[i+1], cond)==True:

start_ln = i

start_flag = 1

find_count = find_count + 1

msg = ""

msg = ("/b/b/b/b/b/b/b%02d")%(find_count)

print msg,

if start_flag == 1:

msg = ""

if with_ln_number == True:

msg = ("%08d:/t%s")%(i+1,ln[i])

else:

msg = ("%s")%(ln[i])

f1.write(msg)

f1.close()

# 导出数据包中的Data字段的内容

# 通过,查找 "0000 "作为开始标志

# 查找"Data:"作为结束标志

def Print_Data_bin(fileName, saveto, data_start, data_end, with_ln_number=True):

f1 = open(saveto, 'w+')

ln = []

myfile = fileinput.input(fileName)

for x in myfile:

ln.append(x)

start_flag = 0

start_ln = 0

end_ln = 0

end_flag = 0

find_count = 0

print " "

for i in range(0,len(ln)):

if start_flag == 0 and Check_Expr(ln[i], data_start)==True:

start_flag = 1

msg = ("%s/n")%(ln[i][16:63])

f1.write("----/n")

if start_flag == 1 and Check_Expr(ln[i], data_end)==True:

start_flag = 0

if start_flag == 1:

msg = ""

if with_ln_number == True:

msg = ("%s/n")%(ln[i][16:63])

else:

msg = ("%s/n")%(ln[i][6:53])

f1.write(msg)

# if i > 100:

# break

f1.close()

def Check_Expr(ln, expr):

expr_flag = False

for x in expr:

and_flag = True

or_flag = False

if 'and' in x:

for y in x["and"]:

if ln.find(y) == -1:

and_flag = False

break

if 'or' in x:

for y in x["or"]:

if ln.find(y) != -1:

or_flag = True

break

else:

or_flag = True

if and_flag == True and or_flag == True:

expr_flag = True

break

return expr_flag

#

# 为了方便查看数据网来,只

# 打印带有IP地址的那行数据

#

def Print_IP_Line(fileName, saveto,cond):

f1 = open(saveto, 'w+')

ln = []

myfile = fileinput.input(fileName)

for x in myfile:

ln.append(x)

start_flag = 0

start_ln = 0

end_ln = 0

end_flag = 0

find_count = 0

print " ",

for i in range(0,len(ln)):

if ln[i].find("No.") == 0:

if Check_Expr(ln[i+1], cond) == True:

start_ln = i+1

start_flag = 1

find_count = find_count + 1

msg = ""

msg = ("/b/b/b/b/b/b/b/b%02d")%(find_count)

print msg,

if start_flag == 1:

msg = ""

msg = ("%08d:/t%s")%(start_ln+1,ln[start_ln])

f1.write(msg)

start_flag = 0

f1.close()

if __name__ == '__main__':

src_data_file = "c://ws.txt"

txt_data_file_11 = "d://RE_11.txt"

bin_data_file_11 = "d://bin_11.txt"

txt_data_file_66 = "d://RE_66.txt"

bin_data_file_66 = "d://bin_66.txt"

#

# 导出数据的条件

# and字段的内容必须全部满足

# or字段的内容,至少满足一个

# and 字段和 or 字段都满足

# 如果and字段不存在,则认为条件满足

# 如果or字段不存在,则认为条件满足

# 举例:

#No. Time Source Destination Protocol Info

#14 9.949685 192.168.0.202 234.5.6.7 UDP Source port: onehome-remote Destination port: synchronet-db

# 导出满足下面条件的数据:

# No.下面一行的数据,包含"234.5.6.7"和"UDP",并且并且包含"192.168.0.202"和"192.168.0.22"之一

# cond = []

# cond.append({

# "and":["234.5.6.7", "UDP"],

# "or":["192.168.0.202", "192.168.0.22"],

# })

#

cond = []

cond.append({

"and":["234.5.6.7", "UDP"],

"or":["192.168.0.202", "192.168.0.22"],

})

getdata_start = []

getdata_start.append({

"and":["0000 "],

})

getdata_end = []

getdata_end.append({

"and":["Data: "],

})

# print getdata_start

# Print_IP_Line('c://RE.txt',cond)

filter_data_11 = []

filter_data_11.append({

"and":["192.168.0.22", "234.5.6.7", "UDP"],

})

filter_data_66 = []

filter_data_66.append({

"and":["192.168.0.202", "234.5.6.7", "UDP"],

})

Print_Data_Text(src_data_file, txt_data_file_11, filter_data_11)

Print_Data_bin(txt_data_file_11, bin_data_file_11,getdata_start, getdata_end)

Print_Data_Text(src_data_file, txt_data_file_66, filter_data_66)

Print_Data_bin(txt_data_file_66, bin_data_file_66,getdata_start, getdata_end)

Print_Data_bin(src_data_file, "d://ttxx1.txt",getdata_start, getdata_end, 0)

Print_IP_Line(src_data_file,"d://ttxx2.txt", cond)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux下源码安装nginx

LNMP模式 后续继续更新,先搭建nginx 安装环境gcc gcc-c 2 下载源码包解压 配置第一个报错 安装openssl openssl-devel yum -y install openssl openssl-devel Make报错 解决 tar -zxvf pcre-8.37.tar.gz cd pcre-8.34 ./configure make make install tar -zxvf …

百度地图两个坐标之间的距离计算

/** * 计算两组经纬度坐标 之间的距离 * params :lat1 纬度1; lng1 经度1; lat2 纬度2; lng2 经度2; len_type (1:m or 2:km); * return m or km */ /** * 根据经纬度查询距离 * param lng1 经度 * param l…

jdk安装失败_windows配置安装单个Tomcat

1.前期准备1).将tomcat安装文件复制到服务器2) 安装jdk,将jdk对应的版本安装到服务器,安装好后cmd命令java -version可以看到对应的版本2.配置环境变量1)jdk安装好后配置jdk环境变量变量名:JAVA_HOME 变量值…

centos源码安装PHP

上篇博客说了nginx了,这篇说PHP,下一篇开始开始 bind相关知识 2开始解压 3 ./configure -help|grep mysql 帮助我们查找可以关于mysql的节点 4配置./configure --enable-fpm --with-mysql --with-mysqli --with-pdo-mysql 安装 5报错 6解决 7继续配…

word2vec训练词向量 python_使用Gensim word2vector训练词向量

注意事项Skip-Gram models:输入为单个词,输出目标为多个上下文单词;CBOW models:输入为多个上下文单词,输出目标为一个单词;选择的训练word2vec的语料要和要使用词向量的任务相似,并且越大越好&…

python可以开发exe软件吗_python能开发exe软件吗

pyinstaller将Python脚本打包成exe软件,使在没有Python环境的机器上运行最新版是pyinstaller 3.1.1。支持python2.7和python3.3。 可运行在Windows,Mac和Linux操作系统下。(推荐学习:Python视频教程)但它不是跨编译的,也就是说在W…

mysql参数化查询为什么可以实现_为什么参数化SQL查询可以防止SQL注入?

SQL 语句文本对于数据库来说,是一种指令,与 Shell 中输入的一条条命令行很类似。我们在 SQL 中混入的各种值就是操作的参数。考虑一个 WHERE user_id 10 的筛选,WHERE 的条件包含两个部分:按用户筛选,以及用户 id 的值…

HDU5923-Prediction-有继承味道的并查集

目录 目录思路:(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 目录 题意:传送门 原题目描述在最下面。  有一个n个节点m条边的无向图和一个m个节点的有根树(根为1)。树上每个节点和图中的某些边一一对应。  每次询问给一个树的点的…

bind安装和主要配置

1 yum -y install bind bind-chroot 2rpm -qa|grep bind,查看安装状态 3service named start服务启动 4主配置文件name.conf Option{} 整个bind的全局选项 Logging{}日志输出选项 Zong 根域 这节比较简单,随便看看即可,持续更新bind相关知识…

为什么火狐浏览器中点击按钮失效_各种浏览器审查、监听http头工具介绍

一、谷歌内置的审查工具(v17.0)。右键点击审查(CtrlShirtAlt)浏览器下方会出现审查框,刷新网页就会出现下图所示,先后点击“netword”-->在下方选中资源(如下图的1.php)-->点击headers二、httpwatch。ShirtF2打开httpwatch点击Record按钮&#xff…

RabbitMQ/pika模块

简介 MessageQueue用于解决跨进程、跨线程、跨应用、跨网络的通信问题。 RabbitMQ使用erlang开发,在windows上使用时要先安装erlang。 官方的示例比较容易理解,可以点这里去看看。 结构 生产者 ---> exchange ---> queue ---> 消费者。 生产者负…

java 对象流_java 对象流的简单使用

对象的输入输出流的作用: 用于写入对象 的信息和读取对象的信息。 使得对象持久化。ObjectInputStream : 对象输入流ObjectOutPutStream :对象输出流简单的实例1 importjava.io.File;2 importjava.io.FileInputStream;3 importjava.io.FileOutputStre…

centos搭建ftp服务器

1安装vsftpd 2备份配置文件 3修改配置文件 vi /etc/vsftpd/vsftpd.conf anonymous_enableNO #允许匿名用户访问为了安全选择关闭 local_enableYES # 允许本地用户登录 write_enableYES # 是否允许写入 local_umask022 # 本地用户上传文件的umask dirmessage_enableYES #为YES…

ihtml2document能不能根据id获取dom_一段监视 DOM 的神奇代码

作者:Eddie Aich翻译:疯狂的技术宅原文:https://dev.to/eddieaich/spy-on-the-dom-3d47未经允许严禁转载通过使用此模块,只需将鼠标悬停在浏览器中,即可快速查看DOM元素的属性。基本上它是一个即时检查器。将鼠标悬停在…

let 和const

let 命令 es6新增了let命令,用于声明变量,与var用法类似,但是使用let声明变量只在它所在的块内有效,而var则是定义的全局变量 {let a10;var b1; } a //a is not defined,外部的a不能访问到上面块中定义的a变量 b //1let不存在…

centos7搭建apache服务器(亲测可用)

1安装apache yum install httpd httpd-devel -y 2开启服务器 systemctl start httpd.service 3开机自启 systemctl enable httpd.service 4关闭防火墙 5端口访问 6修改vi /etc/httpd/conf/httpd.conf,替换 7查看selinux 也可以不修改,放入/var/www/h…

java ssl 双向认证_Java实现 SSL双向认证

我们常见的SSL验证较多的只是验证我们的服务器是否是真实正确的,当然如果你访问的URL压根就错了,那谁也没有办法。这个就是所谓的SSL单向认证。但是实际中,我们有可能还会验证客户端是否符合要求,也就是给我们每个用户颁发一个证书…

python基础公式_一、Python基础(数据类型、基本函数、基本运算)

​1.变量作用:为了简便,运算时方便修改运算中的值,代指一些复杂过长的数据;what:用变量代指一些内容;how:全部由字母、数字和下划线组成,数字不能开头,不能和Python关键词…

Python爬去知乎上问题下所有图片

from zhihu_oauth import ZhihuClient from zhihu_oauth.exception import NeedCaptchaExceptionclient ZhihuClient()try:client.login(email_or_phone, password)print(u"登陆成功!") except NeedCaptchaException:# 保存验证码并提示输入,重新登录wit…

xshell连接突然报Connection closed by foreign host.

1问题描述报错 Connection closed by foreign host. Disconnected from remote host(yaoGS) at 155513. 2登入虚拟机 在linux系统操作中,经常需要连接其他的主机,连接其他主机的服务是openssh-server,它的功能是让远程主机可以通过网络访问…