wireshark可以使用lua来扩展wireshark的功能。
例如你可以用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界面中的协议栈中的信息等价。
本文介绍了如何使用Wireshark的Lua接口扩展其功能,以捕获和存储HTTP传输数据。通过创建监听器和定义Field对象,可以获取并分析HTTP包的各个层次,包括Frame、IP、TCP、HTTP及数据内容。提供了一个简单的Lua脚本示例,该脚本可以在tshark中运行以执行包截取。Field类用于提取包中的特定字段信息,与Wireshark协议栈显示的信息相同。
1万+

被折叠的 条评论
为什么被折叠?



