2017-09-11 48 views
2

我有一個通過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.stringamqp_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)。

回答

1

原來,我不應該試圖比較json.member字段的display屬性。有時它會被JSON解析器設置,有時它只能保持爲Member

正確的解決方案將涉及檢查​​字段的值,但因爲我在尋找可能的關鍵就永遠也不會逃跑了,我可以尋找字符串中的成員字段的range財產字面脫身。

所以不是:

  if member.display == 'result' then 

我:

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

現在無論過濾和列工作。