pcap文件生成metadata——使用tshark解析tcpdump的pcap包
pcap文件生成metadata
#!/usr/bin/env python
# -*- coding: utf-8 -*- import os
import time, datetime
import struct in_path = "/home/bonelee/dns_tunnel_tool/iodine_when_idle.pcap"
tmp_dir = "/tmp"
out_path = "/tmp/out_metadata.txt"
tshark_path = "/usr/bin/tshark" os.system(tshark_path + " -T fields -E separator=\"^\" "
"-e data ""-e data "
"-e ip.src " # 3=sourceIP
"-e ip.dst " # 4=destIP
"-e udp.srcport " # 5=sourcePort
"-e udp.dstport " # 6=destPort
"-e ip.proto " # 7=protocol
"-e data ""-e data ""-e data ""-e data " # 8-11
"-e frame.time_epoch " # flowStartSeconds
# 带插入
"-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data "
"-e dns.flags.rcode " # 54 = DNSReplyCode
"-e dns.qry.name " # 55 = DNSQueryName
"-e dns.qry.type " # 56 = DNSRequestRRType
"-e dns.qry.class " # 57 = DNSRRClass
"-e dns.time " # 58 = DNSDelay #每个请求包和响应包的时间间隔,换算
"-e dns.resp.ttl " # 59 = DNSReplyTTL
"-e ip.addr " # 60 = DNSReplyIPv4
"-e ipv6.addr " # 61 = DNSReplyIPv6
"-e dns.resp.type " # 62 = DNSReplyRRType
"-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data "
"-e dns.resp.name " # 77 = DNSReplyName
"-e data ""-e data ""-e data "
# 待插payload
"-e data ""-e data ""-e data ""-e data ""-e data ""-e data "
"-e dns.length " # 88 = DNSRequestLength
"-e data " # 89=DNSRequestErrLength
"-e dns.resp.len " # 90 = DNSReplyLength
"-e data " # 91=DNSReplyErrLength
"-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data "
"-Y dns -r %s >%s/tsharkResult.txt" % (in_path, tmp_dir)) #读取pcap文件,解析相应的信息,为了在记事本中显示的方便。
payloadResultwithBlank = "%s/payloadResultwithBlank.txt" % tmp_dir
fpcap = open(in_path, 'rb+')
ftxt = open(payloadResultwithBlank,'w')
string_data = fpcap.read()
#pcap文件包头解析
pcap_header = {}
pcap_header['magic_number'] = string_data[0:4]
pcap_header['version_major'] = string_data[4:6]
pcap_header['version_minor'] = string_data[6:8]
pcap_header['thiszone'] = string_data[8:12]
pcap_header['sigfigs'] = string_data[12:16]
pcap_header['snaplen'] = string_data[16:20]
pcap_header['linktype'] = string_data[20:24]
step = 0
packet_num = 0
packet_data = []
pcap_packet_header = {}
i =24
while(i<len(string_data)):
# 数据包头各个字段
pcap_packet_header['GMTtime'] = string_data[i:i+4]
pcap_packet_header['MicroTime'] = string_data[i+4:i+8]
pcap_packet_header['caplen'] = string_data[i+8:i+12]
pcap_packet_header['len'] = string_data[i+12:i+16]
#求出此包的包长len
packet_len = struct.unpack('I',pcap_packet_header['len'])[0]
#写入此包数据
packet_data.append(string_data[i+58:i+16+packet_len])
i = i+ packet_len+16
packet_num+=1
# 把pacp文件里的数据包信息写入result.txt
for i in range(packet_num):
ftxt.write(''.join(x.encode('hex') for x in packet_data[i]) + '\n')
ftxt.close()
fpcap.close()
infp = open(payloadResultwithBlank, "r") payloadResultOver = "%s/payloadResultOver.txt" % tmp_dir
outfp = open(payloadResultOver, "w")
lines = infp.readlines()
for li in lines:
if li.split():
outfp.writelines(li)
infp.close()
outfp.close() def copyTimeMetadata(string):
string = string.split('^')
string.insert(11,string[11])
return string payloadFile = open("%s/payloadResultOver.txt" % tmp_dir)
tsharkFile = open("%s/tsharkResult.txt" % tmp_dir)
tsharkData = []
payload = []
meteData = [] for line in tsharkFile:
line = line.replace("\n", "")
line = copyTimeMetadata(line)
tsharkData.append(line)
for line in payloadFile:
line = line.replace("\n","")
payload.append(line)
count1 = len(payload)
for i in range(0,count1):
tsharkData[i].insert(80,payload[i])
if (tsharkData[i][76]=="<Root>"):
tsharkData[i][76]=tsharkData[i][54] meteDataWithPayload = open("%s/meteDataWithPayload.txt" % tmp_dir,'w')
for line in tsharkData:
meteDataWithPayload.write("^".join(line)+"\n") finallyMetedata = []
dataListFromQuery = []
dataListFromRespon = []
QueriesName_map = {}
DNSQueryName = 55 -1
destPort = 6 -1
DNSDelay = 0 with open("%s/meteDataWithPayload.txt" % tmp_dir) as f:
lines = f.readlines()
for index,line in enumerate(lines):
line = line.replace("\n","")
dataFromQuery = line.split("^")
if dataFromQuery[destPort] == "": # 此时是请求报文,合并到请求报文中
dataListFromQuery.append(dataFromQuery) #dataListFromQuery列表保存的全是请求字段
QueriesName = dataFromQuery[DNSQueryName]
QueriesName_map[QueriesName] = index
count = len(QueriesName_map) #计算总共多少条请求报文
for line in lines:
dataFromRespon = line.split("^")
if dataFromRespon[destPort] != "":
NAME = dataFromRespon[DNSQueryName] #响应报文中的域名
if (NAME in QueriesName_map):
for i in range(0, count):
if dataListFromQuery[i][DNSQueryName] == NAME:
dataListFromQuery[i][12] = dataFromRespon[12]
dataListFromQuery[i][53] = dataFromRespon[53]
dataListFromQuery[i][57] = dataFromRespon[57]
dataListFromQuery[i][58] = dataFromRespon[58]
dataListFromQuery[i][89] = dataFromRespon[89]
DNSDelay = (float(dataListFromQuery[i][12])-float(dataListFromQuery[i][11]))*1000000
dataListFromQuery[i][57] = str(DNSDelay)
else:
print "warning: The response message could not find the requested message", line meteDataFile = open(out_path,'w')
for line in dataListFromQuery:
if line[53]!="":
line[59] = line[59].replace(",",";")
meteDataFile.write("^".join(line) + "\n")
meteDataFile.close()
示意结果:
^^10.0.2.15^223.5.5.5^60088^53^17^^^^^1512356312.819122000^1512356312.860855000^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^0^daisy.ubuntu.com^1^0x00000001^41733.0265045^1357^10.0.2.15;223.5.5.5^^^^^^^^^^^^^^^^^^^^^4b3601000001000000000000056461697379067562756e747503636f6d0000010001^^^^^^^^^49^^^^^^^^^^^
^^10.0.2.15^223.5.5.5^60088^53^17^^^^^1512356312.819318000^1512356312.860855000^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^0^daisy.ubuntu.com^28^0x00000001^41537.0464325^1357^10.0.2.15;223.5.5.5^^^^^^^^^^^^^^^^^^^^^a82b01000001000000000000056461697379067562756e747503636f6d00001c0001^^^^^^^^^49^^^^^^^^^^^
pcap文件生成metadata——使用tshark解析tcpdump的pcap包的更多相关文章
- Android first---xml文件生成与解析
一.使用append进行xml生成 Message类属性:private String body; private String date; private String a ...
- 自主创建tcpdump/wireshark pcap文件
pcap文件格式是bpf保存原始数据包的格式,很多软件都在使用,比如tcpdump.wireshark等等,了解pcap格式可以加深对原始数据包的了解,自己也可以手工构造任意的数据包进行测试. p ...
- 构建tcpdump/wireshark pcap文件
pcap文件格式是bpf保存原始数据包的格式,很多软件都在使用,比如tcpdump.wireshark等等,了解pcap格式可以加深对原始数据包的了解,自己也可以手工构造任意的数据包进行测试. p ...
- NodeJs之word文件生成与解析
NodeJs之word文件生成与解析 一,介绍与需求 1.1,介绍 1,officegen模块可以为Microsoft Office 2007及更高版本生成Office Open XML文件.此模块不 ...
- python dpkt 解析 pcap 文件
dpkt Tutorial #2: Parsing a PCAP File 原文链接:https://jon.oberheide.org/blog/2008/10/15/dpkt-tutorial-2 ...
- 解析Markdown文件生成React组件文档
前言 最近做的项目使用了微前端框架single-spa. 对于这类微前端框架而言,通常有个utility应用,也就是公共应用,里面是各个子应用之间可以共用的一些公共组件或者方法. 对于一个团队而言,项 ...
- Linux使用tcpdump命令抓包保存pcap文件wireshark分析
[root@ok Desktop]# yum search tcpdump Loaded plugins: fastestmirror, refresh-packagekit, security Lo ...
- pcapng文件的python解析实例以及抓包补遗
为了弥补pcap文件的缺陷,让抓包文件可以容纳更多的信息,pcapng格式应运而生.关于它的介绍详见<PCAP Next Generation Dump File Format> 当前的w ...
- text2pcap: 将hex转储文本转换为Wireshark可打开的pcap文件
简介 Text2pcap是一个读取ASCII hex转储的程序,它将描述的数据写入pcap或pcapng文件.text2pcap可以读取包含多个数据包的hexdumps,并构建多个数据包的捕获文件.t ...
随机推荐
- Ubuntu16.04系统下汉字显示为方框解决办法(图文详解)
不多说,直接上干货! 问题详情 问题分析 今天一打开Ubuntu系统,竟然不支持中文显示了.开始时以为是搜狗拼音的问题,然后重装了一遍fcitx,然后用重装了一遍搜狗输入法.可是重装后问题根本没有解决 ...
- Hadoop MapReduce编程 API入门系列之自定义多种输入格式数据类型和排序多种输出格式(十一)
推荐 MapReduce分析明星微博数据 http://git.oschina.net/ljc520313/codeexample/tree/master/bigdata/hadoop/mapredu ...
- Computer Vision的尴尬
原文: Computer Vision是AI的一个非常活跃的领域,每年大会小会不断,发表的文章数以千计(单是CVPR每年就录取300多,各种二流会议每年的文章更可谓不计其数),新模型新算法新应用层出不 ...
- java学习笔记3——异或
异或原理: 转换两个字符或数为2进制的ASCII码,再按位异或,即 0001 0001 ---> 0000 0000 0000 ---> 0000 0001 0000 ---> 00 ...
- 优动漫PAINT个人版和EX版本差异
优动漫PAINT是一款功能强大的动漫绘图软件,适用于个人和专业团队创作,分为个人版和EX版,那么这两个版本有什么区别,应该如何去选择呢? 优动漫PAINT个人版即可满足基本的绘画创作需求,EX版在个人 ...
- 转载:轻量级浏览器特性检测库:feature.js
feature.js是一个很简单.快速和轻量级的浏览器特性检测库,它没有任何依赖,体积压缩最后只有1KB,它可以自动初始化,在你需要知道某个特性是否可用时,直接引入即可.以下中文为个人理解. /*! ...
- Windows批量查找文件
for /r 目录名 %i in (匹配模式1,匹配模式2) do @echo %i for /r SATA %i in (*.txt) do @echo %i D:\REY\test>for ...
- Javaee 方法的格式和注意事项
1.构造方法的格式是什么?有哪些注意事项? 修饰符+方法名称+(参数列表),构造的方法没有返回值,方法名称要和类名一样,有属性参数的需要在成员变量前加this,参数列表的值要和指定的方法格式相同. ...
- elasticsearch批量操作
1.批量查询的好处 就是一条一条的查询,比如说要查询100条数据,那么就要发送100次网络请求,这个开销还是很大的 如果进行批量查询的话,查询100条数据,就只要发送1次网络请求,网络请求的性能开销缩 ...
- Centos 7.2 安装和卸载 MySQL 5.7
一.背景 闲暇之余在虚拟机安装了 Centos 7.2 系统,按照 <简单安装MySQL(RPM方式)> 这篇文章安装 MySQL ,发现由于包依赖的问题安装失败,于是索性在官网查询相关文 ...