本文简单说明一下基于wireshark的大报文的按需切割方法,主要说明的是如何将一个很大的报文按照需求变成一个较小的报文。
我们在面对百G的数量级报文的时候,可能只关注报文中的少数内容,这个时候就需要按需切割。通常的做法是使用wireshark自带的editcap等工具按照数据包的个数进行分割。但是此种方法的缺点显而易见,就是破坏了流的完整性,例如一条流http的请求和相应可能会被切分到两个数据包中。而且局限性也很大,只能按照数量大小切割。
本次所介绍的方法的一个应用场景就是面对比较大的报文,由于数据传输的内容并不是关注的重点,只想取每条流的tcp握手,ssl握手以及http请求相应头等。用来进行数据的识别测试,而整个系统所要求的报文深度为16个包,因此只取每条流的前16个报文。
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),我们将立即处理。