最近需要对wireshark抓到的报文进行二次筛选和分析,为了提高工作效率,还是使用lua脚本来扩展wireshark的功能,主要做法为将符合条件的报文找出来,然后重新保存到单独的pcap文件中,这里笔记一下简单的思路和部分工具代码。
简单起见,我们可以在lua脚本启动时创建一个pcap文件,也可以在发现符合条件的报文时创建一个文件,为了减少复杂度,这里pcap文件保存为IP层报文。参考代码如下:
--当前日期 当前时间 local curr_time = os.date("%Y%m%d_%H_%M_%S") local raw_file = nil local raw_file_name = "cap_files/"..curr_time..".pcap" local function create_new_pcap_file() if(raw_file ~= nil) then return nil end Dir.make("cap_files") raw_file = io.open(raw_file_name, "wb") -- pcap 文件头部Global Header 共 24 Byte local global_pcap_header = { 0xD4, 0xC3, 0xB2, 0xA1, -- Magic 4Byte 0x02, 0x00, -- Major 2Byte 0x04, 0x00, -- Minor 2Byte 0x00, 0x00, 0x00, 0x00, -- ThisZone 4Byte 0x00, 0x00, 0x00, 0x00, -- SigFigs 4Byte 0x00, 0x00, 0x04, 0x00, -- SnapLen 4Byte ffff 0000 0x65, 0x00, 0x00, 0x00 -- LinkType 4Byte 目前只保存IP层的报文(101) } raw_file:write( string.char( table.unpack(global_pcap_header) ) ) raw_file:flush() end
当我们发现符合筛选条件的报文时,把报文附加到pcap文件尾巴上:
-- B1 B2 B3 B4 local function B4(value) return value % 256 end local function B3(value) return B4(value/256) end local function B2(value) return B3(value/256) end local function B1(value) return B2(value/256) end local function write_pkt_to_pcap_file(pinfo, tvb) -- create_new_pcap_file() local cap_sec = math.floor(pinfo.abs_ts) local cap_msec = math.floor( (pinfo.abs_ts - cap_sec) * 1000000 ) local ip_packet_len = pinfo.len - pkt_ip_offset local packet_pcap_header = { B4(cap_sec), B3(cap_sec), B2(cap_sec), B1(cap_sec), -- Timestamp 被捕获时间的高位 单位是seconds B4(cap_msec), B3(cap_msec), B2(cap_msec), B1(cap_msec), -- Timestamp 被捕获时间的低位 单位是microseconds B4(ip_packet_len), B3(ip_packet_len), B2(ip_packet_len), B1(ip_packet_len), -- Caplen B4(ip_packet_len), B3(ip_packet_len), B2(ip_packet_len), B1(ip_packet_len) -- Len } raw_file:write( string.char( table.unpack(packet_pcap_header) ) ) raw_file:write( tvb:raw(pkt_ip_offset) ) raw_file:flush() end
当整个报文序列分析结束后,我们可以关闭报文IO句柄:
-- 关闭文件句柄,考虑到一般都是实时抓取,强制退出,一般都不会有调用机会。 local function close_pcap_file() if(raw_file ~= nil) then raw_file:flush() raw_file:close() raw_file = nil end end
发表评论