Wireshark 解码64位十六进制

我有困难来解码64位十六进制并且从我所读的资料来看,做这个的方式是使用ProtoField.uint64。

我可以看到Wireshark在没有protofield的情况下可以很好的解码,但对于uint64没有用。

-- 声明我们的协议
trivial_proto = Proto("triviala","trivial Protocol")

-- 创建一个函数来解析它
function trivial_proto.dissector(buffer,pinfo,tree)
    pinfo.cols.protocol = "TRIVIA"
    local subtree = tree:add(trivial_proto,buffer(),"Trivia Protocol Data")
    subtree:add(buffer(0,2),"序列号: " .. buffer(0,2):uint())
    subtree:add(buffer(2,4),"序列号: " .. buffer(2,4):uint())
    subtree:add(buffer(6,2),"消息数量: " .. buffer(6,2):uint())
    --无法工作
    --subtree:add(buffer(8,8),"消息数量: " .. buffer(8,8):uint64())

end
-- 加载udp.port表
udp_table = DissectorTable.get("udp.port")
-- 注册我们的协议以处理udp端口
udp_table:add(20004,trivial_proto)
udp_table:add(20006,trivial_proto)
udp_table:add(20021,trivial_proto)

Wireshark解剖消息

当我尝试恰好相同的事情,使用相同的pcap使用ProtoField,我可以看到我的消息类型"TRIVIA"在wireshark中,但没有解码在它的子树中

-- 声明我们的协议
trivial_proto = Proto("triviala","Trivia Protocol")

local F = trivial_proto.fields

F.f_1 = ProtoField.uint8("triviala.sessnum","会话号",base.HEX)
F.f_2 = ProtoField.uint32("triviala.seqnum","序列号",base.HEX)
F.f_3 = ProtoField.uint8("triviala.nomsgs","消息数",base.HEX)
F.f_4 = ProtoField.uint64("triviala.time","日期时间",base.HEX)

-- 创建一个函数来解析它
function trivial_proto.dissector(buffer,pinfo,tree)
    pinfo.cols.protocol = "TRIVIA"
    local subtree = tree:add(trivial_proto,buffer(),"Trivia Protocol Data")
    subtree:add(F.f_1, buffer(0,2))
    subtree:add(F.f_2, buffer(2,4))
    subtree:add(F.f_3, buffer(6,2))
    --subtree:add(F.f_4, buffer(8,8))
end
-- 加载udp.port表
udp_table = DissectorTable.get("udp.port")
-- 注册我们的协议以处理udp端口
udp_table:add(20004,trivial_proto)
udp_table:add(20006,trivial_proto)
udp_table:add(20021,trivial_proto)

Wireshark不解剖消息

请帮忙!

点赞
用户2755698
用户2755698

你需要将 trivial_proto.fields 分配给 F,而不是反过来。

如果你参考了 Wireshark Lua/Examples 页面中可用的 fpm.lua 脚本,你会看到你需要这样做:

local F =
{
    f_1 = ProtoField.uint8("triviala.sessnum","Session Number",base.HEX),
    f_2 = ProtoField.uint32("triviala.seqnum","Sequence Number",base.HEX),
    f_3 = ProtoField.uint8("triviala.nomsgs","Number Mesages",base.HEX),
    f_4 = ProtoField.uint64("triviala.time","Date Time",base.HEX),
}

trivial_proto.fields = F

...

subtree:add(F.f_1, buffer(0,2))
subtree:add(F.f_2, buffer(2,4))
subtree:add(F.f_3, buffer(6,2))
2016-08-11 18:24:08