WireShark使用lua接口截获网络数据

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界面中的协议栈中的信息等价。

详细的API说明

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/john_crash/article/details/51037437
个人分类: lua
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭