我是Lua的新手,这是我第一次尝试编写wirehark解剖器。
我想通过Lua脚本分析没有密码的SSH。我编写了一个脚本来检测第一步的数据包长度和填充长度。
这是我的剧本:
do
local p_test = Proto("test","Test.");
local f_packet_length = ProtoField.uint32("packet_length")
local f_padding_length = ProtoField.uint8("padding_length")
p_test.fields = {
f_packet_length,
f_padding_length
}
function p_test.dissector(buf,pkt,root)
local offset = 0
local buf_len = buf:len()
local t = root:add(p_test, buf:range(offset))
t:add(f_packet_length,buf:range(offset,4))
offset = offset+4
t:add(f_padding_length,buf:range(offset,1))
offset = offset+1
end
local tcp_table = DissectorTable.get("tcp.port")
tcp_table:add(22,p_test)
end
通过Evalutate Lua运行代码并应用测试过滤器后,我发现数据包详细信息中存在错误:
Lua Error: [string "do..."]:19: Tree item ProtoField/Protocol handle is invalid (ProtoField/Proto not registered?)
第19行对应t:add(f_packet_length...
行。
有人可以帮忙解释一下这个错误吗? 提前谢谢。
答案 0 :(得分:3)
如果上面的代码在Wireshark的真实Lua脚本中,可以正常工作......或者通过个人插件目录中的.lua
文件,或者加载“-X lua_script:<filename>
“命令行开关。
但是你无法在tools->evaluate
窗口中注册新协议,因为那时注册新协议(或新字段)为时已晚。不幸的是,Wireshark报告的错误并不清楚,因为它有一半是有效的,但实际上它不起作用而且无法工作。
问题是新的协议注册在内部分两个阶段发生:第一阶段是加载和执行Lua脚本,将协议和字段添加到内部临时表,然后在所有lua脚本加载之后第二阶段有新的协议和字段从临时表移动到他们的最终运行时表并注册,然后wireshark完成加载,你看到GUI。当Wireshark首次启动时,第二阶段发生一次且仅发生一次。但是运行tools->evaluate
窗口后会发生这种情况,所以为时已晚。