基于wireshark lua 插件的报文按需切割方法

本文介绍一种基于Wireshark的按需切割大报文方法,尤其适用于仅需关注特定部分如TCP握手、SSL握手及HTTP头部的情况。通过Shell脚本与Lua脚本结合,实现了对每条流的前16个报文的提取。

       本文简单说明一下基于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  

        经过这些操作之后所剩下的报文就很少了,也比较利于分析。

       本文为优快云村中少年原创文章,转载记得加上小尾巴偶,博主链接这里

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村中少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值