WireShark使用lua接口截获网络数据
2016-04-01 15:58
555 查看
wireshark可以使用lua来扩展wireshark的功能。
例如你可以用wireshark结合lua来做一个截获http传输并存储到磁盘的脚本。
首先定义一个监听器用来监听http数据包。
然后定义里需要截获的分析好的数据,这需要使用Field对象。
例如
可以使用Field.list()函数来获得可用Field的完整列表。你也可以在wireshark的Filter Expression列表中找到这些字段。
然后可以为tap定义一个回调函数packet,每当有http协议的报文时wireshark将调用这个函数,参数tvb是报文的二进制缓冲区。在该函数中调用Field变量可以取得分析好的字段,如果不存在返回nil。
我们要截获的http协议包就包括这几层协议Frame,IP,TCP,HTTP,data-text-lines(这个是http内容),这些上层协议的字段你都可以通过Field字段取得。
下面这一个截获框架,你可以使用tshark -X lua_script:tap.lua来执行这个例子,当然它什么都不做。tshark -Q 可以关闭多余的打印,-i 2 选择设备2。
tap.lua
Field就是用来提取俘获包中的相应字段的,和WireShark界面中的协议栈中的信息等价。
详细的API说明
例如你可以用wireshark结合lua来做一个截获http传输并存储到磁盘的脚本。
首先定义一个监听器用来监听http数据包。
local tap = Listener.new("http")
然后定义里需要截获的分析好的数据,这需要使用Field对象。
例如
local host = Field.new("http.host")--用来获得http协议的host字段 local location = Field.new("http.location")--用来获得http协议的location字段 local dst_ip = Field.new("ip.dst") local src_ip = Field.new("ip.src")--获得包的目的ip地址与源ip地址 local dst_port = Field.new("tcp.dstport")--获得tcp协议的目的端口号
可以使用Field.list()函数来获得可用Field的完整列表。你也可以在wireshark的Filter Expression列表中找到这些字段。
然后可以为tap定义一个回调函数packet,每当有http协议的报文时wireshark将调用这个函数,参数tvb是报文的二进制缓冲区。在该函数中调用Field变量可以取得分析好的字段,如果不存在返回nil。
我们要截获的http协议包就包括这几层协议Frame,IP,TCP,HTTP,data-text-lines(这个是http内容),这些上层协议的字段你都可以通过Field字段取得。
下面这一个截获框架,你可以使用tshark -X lua_script:tap.lua来执行这个例子,当然它什么都不做。tshark -Q 可以关闭多余的打印,-i 2 选择设备2。
tap.lua
local tap = Listener.new("http") local http = Field.new("http") local host = Field.new("http.host") local location = Field.new("http.location") local dst_ip = Field.new("ip.dst") local src_ip = Field.new("ip.src") local dst_port = Field.new("tcp.dstport") local src_port = Field.new("tcp.srcport") local text = Field.new("data-text-lines") function tap.packet(pinfo,tvb,tapinfo) --获取对应的字段 local dst = dst_ip() local src = src_ip() local h = host() local dstp = dst_port() local srcp = src_port() --这里可以对截获的数据做存储打印等处理 print(tostring(dst)) print("host : "..tostring(h)) end function tap.draw() print("draw called") end function tap.reset() print("reset called") end
Field就是用来提取俘获包中的相应字段的,和WireShark界面中的协议栈中的信息等价。
详细的API说明