Wireshark:显示过滤器与嵌套解析器
Wireshark: display filters vs nested dissectors
我有一个通过 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
(首先,我只是查看 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
(添加为列时显示为 Yes
)
json.value.string
(我也可以用json.value.string == "ok"
过滤)
amqp_json
但是amqp_json.result
不起作用:如果我将它用作显示过滤器,Wireshark 不会显示任何数据包,如果我将它用作列,则该列为空。
为什么 json.value.string
和 amqp_json.result
的行为不同?我怎样才能实现我想要的? (似乎我确实需要一个自定义解析器,因为 json.value.string
我只能过滤具有特定值的 any 成员,不一定 result
。)
我发现 a thread on the wireshark-dev mailing list ("Lua post-dissector not getting field values", 2009-09-17, 2009-09-22, 2009-09-23),它指向 interesting_hfids
散列 table,但从那时起代码似乎发生了很大变化。
如果您想尝试这个,这是我的 PCAP 文件,base64 编码,包含一个数据包:
1MOyoQIABAAAAAAAAAAAAAAABAAAAAAAjBi1WfYOCgBjAAAAYwAAAB4AAABgBMEqADcGQA
AAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAB/tcWKO232y46mkSqgBgxtgA/AAAB
AQgKRjDNvkYwzb4DAAEAAAAPeyJyZXN1bHQiOiJvayJ9zg==
使用 base64 -d
(在 Linux 上)或 base64 -D
(在 OSX 上)解码。
事实证明我不应该尝试比较 json.member
字段的 display
属性。有时它由 JSON 解析器设置,有时它只是保持 Member
.
正确的解决方案是检查 json.key
字段的值,但由于我正在寻找的密钥可能永远不会被转义,所以我可以在 range
属性 成员字段。
所以代替:
if member.display == 'result' then
我有:
if member.range:range(1, 6):string() == 'result' then
现在过滤和列都可以使用了。
我有一个通过 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
(首先,我只是查看 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
(添加为列时显示为Yes
)json.value.string
(我也可以用json.value.string == "ok"
过滤)amqp_json
但是amqp_json.result
不起作用:如果我将它用作显示过滤器,Wireshark 不会显示任何数据包,如果我将它用作列,则该列为空。
为什么 json.value.string
和 amqp_json.result
的行为不同?我怎样才能实现我想要的? (似乎我确实需要一个自定义解析器,因为 json.value.string
我只能过滤具有特定值的 any 成员,不一定 result
。)
我发现 a thread on the wireshark-dev mailing list ("Lua post-dissector not getting field values", 2009-09-17, 2009-09-22, 2009-09-23),它指向 interesting_hfids
散列 table,但从那时起代码似乎发生了很大变化。
如果您想尝试这个,这是我的 PCAP 文件,base64 编码,包含一个数据包:
1MOyoQIABAAAAAAAAAAAAAAABAAAAAAAjBi1WfYOCgBjAAAAYwAAAB4AAABgBMEqADcGQA
AAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAB/tcWKO232y46mkSqgBgxtgA/AAAB
AQgKRjDNvkYwzb4DAAEAAAAPeyJyZXN1bHQiOiJvayJ9zg==
使用 base64 -d
(在 Linux 上)或 base64 -D
(在 OSX 上)解码。
事实证明我不应该尝试比较 json.member
字段的 display
属性。有时它由 JSON 解析器设置,有时它只是保持 Member
.
正确的解决方案是检查 json.key
字段的值,但由于我正在寻找的密钥可能永远不会被转义,所以我可以在 range
属性 成员字段。
所以代替:
if member.display == 'result' then
我有:
if member.range:range(1, 6):string() == 'result' then
现在过滤和列都可以使用了。