Wireshark:显示过滤器vs嵌套解析器
我有一个通过AMQP发送JSON对象的应用程序,我想用Wireshark检查网络流量。 AMQP解析器将有效载荷作为字段amqp.payload
中的一系列字节提供,但我想提取并过滤JSON对象中的特定字段,所以我试图在Lua中为此编写一个插件。Wireshark:显示过滤器vs嵌套解析器
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
(。一开始,我只是在看result
领域,我与测试有效载荷{"result":"ok"}
)
这让我中途在那里。下面以包夹层显示出来,而没有我的插件,我只得到了AMQP部分:
Advanced Message Queueing Protocol
Type: Content body (3)
Channel: 1
Length: 15
Payload: 7b22726573756c74223a226f6b227d
JavaScript Object Notation
Object
Member Key: result
String value: ok
Key: result
AMQP JSON payload
Result: "ok"
现在我希望能够使用这些新领域的显示过滤器,并且也将其添加为列Wireshark的。两个以下工作:
json
-
json.value.string
(我也可以用json.value.string == "ok"
筛选)(当为一列添加显示为Yes
) amqp_json
但amqp_json.result
没有按” t工作:如果我将它用作显示过滤器,Wireshark不会显示任何数据包,并且如果我将它用作列,那么列是空的。
为什么它的行为不同json.value.string
和amqp_json.result
?我怎样才能达到我想要的? (好像我需要一个定制的剥离,与json.value.string
我只能在具有一定的价值任何成员,不一定result
筛选)。
我发现a thread on the wireshark-dev mailing list(“Lua的后剥离不获取字段值“,2009-09-17,2009-09-22,2009-09-23),指向interesting_hfids
哈希表,但从那时起,代码似乎发生了很大变化。
如果你想试试这个,这是我的PCAP文件,base64编码,包含一个单一的数据包:
1MOyoQIABAAAAAAAAAAAAAAABAAAAAAAjBi1WfYOCgBjAAAAYwAAAB4AAABgBMEqADcGQA
AAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAB/tcWKO232y46mkSqgBgxtgA/AAAB
AQgKRjDNvkYwzb4DAAEAAAAPeyJyZXN1bHQiOiJvayJ9zg==
解码与base64 -d
(在Linux上)或base64 -D
(在OSX)。
原来,我不应该试图比较json.member
字段的display
属性。有时它会被JSON解析器设置,有时它只能保持为Member
。
正确的解决方案将涉及检查字段的值,但因为我在寻找可能的关键就永远也不会逃跑了,我可以寻找字符串中的成员字段的range
财产字面脱身。
所以不是:
if member.display == 'result' then
我:
if member.range:range(1, 6):string() == 'result' then
现在无论过滤和列工作。