基于Wireshark的报文按需切割方法

发表于:2018-4-10 13:14

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:村中少年    来源:CSDN博客

  本文简单说明一下基于wireshark的大报文的按需切割方法,主要说明的是如何将一个很大的报文按照需求变成一个较小的报文。
  我们在面对百G的数量级报文的时候,可能只关注报文中的少数内容,这个时候就需要按需切割。通常的做法是使用wireshark自带的editcap等工具按照数据包的个数进行分割。但是此种方法的缺点显而易见,就是破坏了流的完整性,例如一条流http的请求和相应可能会被切分到两个数据包中。而且局限性也很大,只能按照数量大小切割。
  本次所介绍的方法的一个应用场景就是面对比较大的报文,由于数据传输的内容并不是关注的重点,只想取每条流的tcp握手,ssl握手以及http请求相应头等。用来进行数据的识别测试,而整个系统所要求的报文深度为16个包,因此只取每条流的前16个报文。
  首选应用的环境是在Linux上面进行的,因为windows上在读取大报文的时候,会抛出内存错误,而这个问题在Linux上面是不存在的。环境的问题,可以查看我以前的文章,具体的应用脚本如下:
  shell脚本,读取指定目录指定文件,并向Lua脚本传递参数(文件名):
#!/bin/bash
find big_pcap -name '*.pcap' > pcapForOldFileName.txt
while read LINE
do
echo ${LINE##*/}
tshark -X lua_script:flowcut.lua -X lua_script1:${LINE##*/} -r $LINE  -q -l
done < pcapForOldFileName.txt
  lua脚本,取每条流的前16个报文,生成的文件和以前的文件名相同:
local args = { ... }--命令行参数列表
local fileName = {}--过滤器对象列表
-- 没有参数返回
if #args == 0 then
return
end
for i, arg in ipairs(args) do
fileName[i] = arg
--print(fileName[i])
fileDumper = Dumper.new(tostring(fileName[i]))
end
--local fileDumper = Dumper.new(tostring(fileName[0]))
--local fileDumper = Dumper.new("sslsl.pcap")
local getStream = Field.new("tcp.stream")
local getGtpSegmentData = Field.new("gtp")
--local getGtpSegmentData = Field.new("ip.len")
local tcpStreamTable = {}--每一条流的索引哈希表
local getTcpLen = Field.new("tcp.len")
local pcapNumberCount = {}--每一条流的包数统计
do
local function packet_listener()
local tap =Listener.new("frame", "frame")
--frame是监听器的名称,tcp是wireshark过滤器规则
function tap.reset()
--print("tap reset")
end
function tap.packet(pinfo,tvb)
--回调函数,每收到一个包执行一次。
local tcpStream = getStream()
local tcpStreamNumber =tonumber(tostring(tcpStream))
local gtpSegmentData = getGtpSegmentData()
local tcpLen = getTcpLen()
if(tcpStreamTable[tcpStreamNumber])
then
if(pcapNumberCount[tcpStreamNumber] < 19)
then
fileDumper:dump_current()
fileDumper:flush()
if(gtpSegmentData)
then
pcapNumberCount[tcpStreamNumber] = pcapNumberCount[tcpStreamNumber] + 1
end
end
else
--排除ARP等没有流号的报文
if(tcpStream ~= nil)
then
tcpStreamTable[tcpStreamNumber] =tcpStream
pcapNumberCount[tcpStreamNumber] = 0
fileDumper:dump_current()
fileDumper:flush()
end
end
end
function tap.draw()
--结束执行
--print("tap.draw")
end
end
--监听报文
packet_listener()
--tcpStreamTable =nil
end
  经过这些操作之后所剩下的报文就很少了,也比较利于分析。

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号