pcap文件生成metadata

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import os
  5. import time, datetime
  6. import struct
  7.  
  8. in_path = "/home/bonelee/dns_tunnel_tool/iodine_when_idle.pcap"
  9. tmp_dir = "/tmp"
  10. out_path = "/tmp/out_metadata.txt"
  11. tshark_path = "/usr/bin/tshark"
  12.  
  13. os.system(tshark_path + " -T fields -E separator=\"^\" "
  14. "-e data ""-e data "
  15. "-e ip.src " # 3=sourceIP
  16. "-e ip.dst " # 4=destIP
  17. "-e udp.srcport " # 5=sourcePort
  18. "-e udp.dstport " # 6=destPort
  19. "-e ip.proto " # 7=protocol
  20. "-e data ""-e data ""-e data ""-e data " # 8-11
  21. "-e frame.time_epoch " # flowStartSeconds
  22. # 带插入
  23. "-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 "
  24. "-e dns.flags.rcode " # 54 = DNSReplyCode
  25. "-e dns.qry.name " # 55 = DNSQueryName
  26. "-e dns.qry.type " # 56 = DNSRequestRRType
  27. "-e dns.qry.class " # 57 = DNSRRClass
  28. "-e dns.time " # 58 = DNSDelay #每个请求包和响应包的时间间隔,换算
  29. "-e dns.resp.ttl " # 59 = DNSReplyTTL
  30. "-e ip.addr " # 60 = DNSReplyIPv4
  31. "-e ipv6.addr " # 61 = DNSReplyIPv6
  32. "-e dns.resp.type " # 62 = DNSReplyRRType
  33. "-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 "
  34. "-e dns.resp.name " # 77 = DNSReplyName
  35. "-e data ""-e data ""-e data "
  36. # 待插payload
  37. "-e data ""-e data ""-e data ""-e data ""-e data ""-e data "
  38. "-e dns.length " # 88 = DNSRequestLength
  39. "-e data " # 89=DNSRequestErrLength
  40. "-e dns.resp.len " # 90 = DNSReplyLength
  41. "-e data " # 91=DNSReplyErrLength
  42. "-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data ""-e data "
  43. "-Y dns -r %s >%s/tsharkResult.txt" % (in_path, tmp_dir))
  44.  
  45. #读取pcap文件,解析相应的信息,为了在记事本中显示的方便。
  46. payloadResultwithBlank = "%s/payloadResultwithBlank.txt" % tmp_dir
  47. fpcap = open(in_path, 'rb+')
  48. ftxt = open(payloadResultwithBlank,'w')
  49. string_data = fpcap.read()
  50. #pcap文件包头解析
  51. pcap_header = {}
  52. pcap_header['magic_number'] = string_data[0:4]
  53. pcap_header['version_major'] = string_data[4:6]
  54. pcap_header['version_minor'] = string_data[6:8]
  55. pcap_header['thiszone'] = string_data[8:12]
  56. pcap_header['sigfigs'] = string_data[12:16]
  57. pcap_header['snaplen'] = string_data[16:20]
  58. pcap_header['linktype'] = string_data[20:24]
  59. step = 0
  60. packet_num = 0
  61. packet_data = []
  62. pcap_packet_header = {}
  63. i =24
  64. while(i<len(string_data)):
  65. # 数据包头各个字段
  66. pcap_packet_header['GMTtime'] = string_data[i:i+4]
  67. pcap_packet_header['MicroTime'] = string_data[i+4:i+8]
  68. pcap_packet_header['caplen'] = string_data[i+8:i+12]
  69. pcap_packet_header['len'] = string_data[i+12:i+16]
  70. #求出此包的包长len
  71. packet_len = struct.unpack('I',pcap_packet_header['len'])[0]
  72. #写入此包数据
  73. packet_data.append(string_data[i+58:i+16+packet_len])
  74. i = i+ packet_len+16
  75. packet_num+=1
  76. # 把pacp文件里的数据包信息写入result.txt
  77. for i in range(packet_num):
  78. ftxt.write(''.join(x.encode('hex') for x in packet_data[i]) + '\n')
  79. ftxt.close()
  80. fpcap.close()
  81. infp = open(payloadResultwithBlank, "r")
  82.  
  83. payloadResultOver = "%s/payloadResultOver.txt" % tmp_dir
  84. outfp = open(payloadResultOver, "w")
  85. lines = infp.readlines()
  86. for li in lines:
  87. if li.split():
  88. outfp.writelines(li)
  89. infp.close()
  90. outfp.close()
  91.  
  92. def copyTimeMetadata(string):
  93. string = string.split('^')
  94. string.insert(11,string[11])
  95. return string
  96.  
  97. payloadFile = open("%s/payloadResultOver.txt" % tmp_dir)
  98. tsharkFile = open("%s/tsharkResult.txt" % tmp_dir)
  99. tsharkData = []
  100. payload = []
  101. meteData = []
  102.  
  103. for line in tsharkFile:
  104. line = line.replace("\n", "")
  105. line = copyTimeMetadata(line)
  106. tsharkData.append(line)
  107. for line in payloadFile:
  108. line = line.replace("\n","")
  109. payload.append(line)
  110. count1 = len(payload)
  111. for i in range(0,count1):
  112. tsharkData[i].insert(80,payload[i])
  113. if (tsharkData[i][76]=="<Root>"):
  114. tsharkData[i][76]=tsharkData[i][54]
  115.  
  116. meteDataWithPayload = open("%s/meteDataWithPayload.txt" % tmp_dir,'w')
  117. for line in tsharkData:
  118. meteDataWithPayload.write("^".join(line)+"\n")
  119.  
  120. finallyMetedata = []
  121. dataListFromQuery = []
  122. dataListFromRespon = []
  123. QueriesName_map = {}
  124. DNSQueryName = 55 -1
  125. destPort = 6 -1
  126. DNSDelay = 0
  127.  
  128. with open("%s/meteDataWithPayload.txt" % tmp_dir) as f:
  129. lines = f.readlines()
  130. for index,line in enumerate(lines):
  131. line = line.replace("\n","")
  132. dataFromQuery = line.split("^")
  133. if dataFromQuery[destPort] == "": # 此时是请求报文,合并到请求报文中
  134. dataListFromQuery.append(dataFromQuery) #dataListFromQuery列表保存的全是请求字段
  135. QueriesName = dataFromQuery[DNSQueryName]
  136. QueriesName_map[QueriesName] = index
  137. count = len(QueriesName_map) #计算总共多少条请求报文
  138. for line in lines:
  139. dataFromRespon = line.split("^")
  140. if dataFromRespon[destPort] != "":
  141. NAME = dataFromRespon[DNSQueryName] #响应报文中的域名
  142. if (NAME in QueriesName_map):
  143. for i in range(0, count):
  144. if dataListFromQuery[i][DNSQueryName] == NAME:
  145. dataListFromQuery[i][12] = dataFromRespon[12]
  146. dataListFromQuery[i][53] = dataFromRespon[53]
  147. dataListFromQuery[i][57] = dataFromRespon[57]
  148. dataListFromQuery[i][58] = dataFromRespon[58]
  149. dataListFromQuery[i][89] = dataFromRespon[89]
  150. DNSDelay = (float(dataListFromQuery[i][12])-float(dataListFromQuery[i][11]))*1000000
  151. dataListFromQuery[i][57] = str(DNSDelay)
  152. else:
  153. print "warning: The response message could not find the requested message", line
  154.  
  155. meteDataFile = open(out_path,'w')
  156. for line in dataListFromQuery:
  157. if line[53]!="":
  158. line[59] = line[59].replace(",",";")
  159. meteDataFile.write("^".join(line) + "\n")
  160. meteDataFile.close()

示意结果:

  1. ^^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^^^^^^^^^^^
  2. ^^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包的更多相关文章

  1. Android first---xml文件生成与解析

    一.使用append进行xml生成 Message类属性:private String body;        private String date;       private String a ...

  2. 自主创建tcpdump/wireshark pcap文件

      pcap文件格式是bpf保存原始数据包的格式,很多软件都在使用,比如tcpdump.wireshark等等,了解pcap格式可以加深对原始数据包的了解,自己也可以手工构造任意的数据包进行测试. p ...

  3. 构建tcpdump/wireshark pcap文件

      pcap文件格式是bpf保存原始数据包的格式,很多软件都在使用,比如tcpdump.wireshark等等,了解pcap格式可以加深对原始数据包的了解,自己也可以手工构造任意的数据包进行测试. p ...

  4. NodeJs之word文件生成与解析

    NodeJs之word文件生成与解析 一,介绍与需求 1.1,介绍 1,officegen模块可以为Microsoft Office 2007及更高版本生成Office Open XML文件.此模块不 ...

  5. python dpkt 解析 pcap 文件

    dpkt Tutorial #2: Parsing a PCAP File 原文链接:https://jon.oberheide.org/blog/2008/10/15/dpkt-tutorial-2 ...

  6. 解析Markdown文件生成React组件文档

    前言 最近做的项目使用了微前端框架single-spa. 对于这类微前端框架而言,通常有个utility应用,也就是公共应用,里面是各个子应用之间可以共用的一些公共组件或者方法. 对于一个团队而言,项 ...

  7. Linux使用tcpdump命令抓包保存pcap文件wireshark分析

    [root@ok Desktop]# yum search tcpdump Loaded plugins: fastestmirror, refresh-packagekit, security Lo ...

  8. pcapng文件的python解析实例以及抓包补遗

    为了弥补pcap文件的缺陷,让抓包文件可以容纳更多的信息,pcapng格式应运而生.关于它的介绍详见<PCAP Next Generation Dump File Format> 当前的w ...

  9. text2pcap: 将hex转储文本转换为Wireshark可打开的pcap文件

    简介 Text2pcap是一个读取ASCII hex转储的程序,它将描述的数据写入pcap或pcapng文件.text2pcap可以读取包含多个数据包的hexdumps,并构建多个数据包的捕获文件.t ...

随机推荐

  1. Pinpoint 监控

    ####Hbase数据################ 参考: 然而没有卵用: https://blog.csdn.net/iamlihongwei/article/details/52882749? ...

  2. [ Linux ] [ OS ] [ memory ] Linux 如何查看系統硬體的記憶體(RAM)資訊

    cat /proc/meminfo https://blog.longwin.com.tw/2013/05/linux-ram-memory-info-2013/

  3. (转载) IaaS, PaaS, Saas

    如果你是一个网站站长,想要建立一个网站.不采用云服务,你所需要的投入大概是:买服务器,安装服务器软件,编写网站程序. 现在你追随潮流,采用流行的云计算,如果你采用 IaaS 服务,那么意味着你就不用自 ...

  4. AI:**消灭程序员需要一百年吗?

    这篇博文真的很长,不过挺有意思.关于智能机器人的发展前景还是很广的,因为每一步都异常艰难,而什么时候可以终止还无法预料,所以程序员没办法失业啊! 转自于图灵社区:http://www.ituring. ...

  5. 服务端Linux机器日志查看命令

    常用查看命令 ps -ef | grep java 查看当前机器运行程序: tail -100f /... 查看日志,实时的 less /- 按页查看日志,空格翻页,q退出 cat /.. | gre ...

  6. vc++创建Win32 Application窗体过程

    #include<windows.h>#include<stdio.h>LRESULT CALLBACK WinSunProc( HWND hwnd, UINT uMsg, W ...

  7. C#学习 第十节

    操作符(operator) 1.操作符的概览 从上到下优先级依次减弱: 2.操作符的本质 操作符的本质是函数的简记法: 计算机的操作符不能脱离与它关联的数据类型: 3.操作符的优先级 可以使用括号 4 ...

  8. python之子类调用父类的两种方式

    第一种方式 直接在子类中调用父类名: Vehicle.__init__(self,name,speed,load,power)#调用父类的实例 Vehicle.run(self) #调用父类的方法 # ...

  9. WEBGL学习【十五】利用WEBGL实现三维场景的一般思路总结

    实现三维场景载入操作的实现步骤: 主要知识点:着色器,纹理贴图,文件载入 实现思路: 获取canvas,初始化WEBGL上下文信息. 主要是实现WEBGL上下文的获取,设置视的大小,此时gl存储了WE ...

  10. 洛谷P1739 表达式括号匹配

    题目描述 假设一个表达式有英文字母(小写).运算符(+,-,*,/)和左右小(圆)括号构成,以"@"作为表达式的结束符.请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返 ...