Lua Wireshark:显示过滤器与嵌套剖析器

Lua Wireshark:显示过滤器与嵌套剖析器,lua,wireshark,amqp,wireshark-dissector,Lua,Wireshark,Amqp,Wireshark Dissector,我有一个通过AMQP发送JSON对象的应用程序,我想用Wireshark检查网络流量。AMQP解析器在字段AMQP.payload中以一系列字节的形式提供有效负载,但我想提取JSON对象中的特定字段并对其进行过滤,因此我正试图为此编写一个Lua插件 Wireshark已经有了一个JSON解析程序,所以我希望能够利用它,而不必自己处理JSON解析 这是我的密码: local amqp_json_p = Proto("amqp_json", "AMQP JSON payload") local am

我有一个通过AMQP发送JSON对象的应用程序,我想用Wireshark检查网络流量。AMQP解析器在字段
AMQP.payload
中以一系列字节的形式提供有效负载,但我想提取JSON对象中的特定字段并对其进行过滤,因此我正试图为此编写一个Lua插件

Wireshark已经有了一个JSON解析程序,所以我希望能够利用它,而不必自己处理JSON解析

这是我的密码:

local amqp_json_p = Proto("amqp_json", "AMQP JSON payload")
local amqp_json_result = ProtoField.string("amqp_json.result", "Result")
amqp_json_p.fields = { amqp_json_result }
register_postdissector(amqp_json_p)

local amqp_payload_f = Field.new("amqp.payload")
local json_dissector = Dissector.get("json")

local json_member_f = Field.new("json.member")
local json_string_f = Field.new("json.value.string")

function amqp_json_p.dissector(tvb, pinfo, tree)
   local amqp_payload = amqp_payload_f()
   if amqp_payload then
      local payload_tvbrange = amqp_payload.range
      if payload_tvbrange:range(0,1):string() == "{" then
         json_dissector(payload_tvbrange:tvb(), pinfo, tree)
         -- So far so good.  Let's look at what the JSON dissector came up with.
         local members = { json_member_f() }
         local strings = { json_string_f() }
         local subtree = tree:add(amqp_json_p)
         for k, member in pairs(members) do
            if member.display == 'result' then
               for _, s in ipairs(strings) do
                  -- Find the string value inside this member
                  if not (s < member) and (s <= member) then
                     subtree:add(amqp_json_result, s.range)
                     break
                  end
               end
            end
         end
      end
   end
end
现在,我希望能够将这些新字段用作显示过滤器,并将它们作为列添加到Wireshark中。这两方面的工作如下:

  • json
    (作为列添加时显示为
    Yes
  • json.value.string
    (我也可以使用
    json.value.string==“ok”
    进行过滤)
  • amqp\u json
但是
amqp_json.result
不起作用:如果我将其用作显示过滤器,Wireshark不会显示任何数据包,如果我将其用作列,则该列为空

为什么
json.value.string
amqp_json.result
的行为会有所不同?我怎样才能实现我想要的?(看起来我确实需要一个自定义解析器,就像
json.value.string
一样,我只能对任何具有特定值的成员进行筛选,而不一定是
result


我发现(“Lua post dissector not get field values”,2009-09-172009-09-222009-09-23),它指向了
有趣的\u hfids
哈希表,但从那以后代码似乎发生了很大的变化

如果您想试试这个,下面是我的PCAP文件,base64编码,包含一个数据包:

1MOyoQIABAAAAAAAAAAAAAAABAAAAAAAjBi1WfYOCgBjAAAAYwAAAB4AAABgBMEqADcGQA
AAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAB/tcWKO232y46mkSqgBgxtgA/AAAB
AQgKRjDNvkYwzb4DAAEAAAAPeyJyZXN1bHQiOiJvayJ9zg==

使用
base64-d
(在Linux上)或
base64-d
(在OSX上)进行解码。

结果表明,我不应该尝试比较
json.member
字段的
display
属性。有时它由JSON解析器设置,有时它只是作为
成员

正确的解决方案包括检查
json.key
字段的值,但由于我要查找的键可能永远不会被转义,因此我可以在成员字段的
range
属性中查找字符串文字

因此,不是:

            if member.display == 'result' then
我有:

            if member.range:range(1, 6):string() == 'result' then
现在过滤和列都可以工作了

            if member.range:range(1, 6):string() == 'result' then