WireShark UDP 解析

↓ModBus/RTUの時に書いた

https://qiita.com/1994koki/items/748c6f160db8251074a4

UDPを解析する機会があったのでWiresharkのLuaを作った件

# Luaの作成

大半は１個目の参考URL様をベースとして作成しました。
作り方の詳細は各URLを参考にしてください。
作ったまま乗せるのはあれなので適当にアレンジして載せます。
(動作確認しましたが、bufferの位置とか間違ってるかもしれません、、
```ruby:
-- （１）独自プロトコルの定義
-- Org.lua
OrgProto = Proto.new("Org", "Org DATA PACKET")
-- （２）プロトコルフィールドの定義
f_ContData1 = ProtoField.new("Frame Bytes" , "Org.frame"  , ftypes.UINT16 , nil)
f_ContData2 = ProtoField.new("Version" , "Org.ver"  , ftypes.UINT8  , nil, base.DEC_HEX)
f_ContData3 = ProtoField.new("Reserved1" , "Org.Reserved1"  , ftypes.UINT8  , nil, base.DEC_HEX, 0x03)
f_ContData4 = ProtoField.new("Reserved2" , "Org.Reserved2"  , ftypes.UINT8  , nil, base.DEC_HEX, 0x60)
f_ContData5 = ProtoField.new("データ数" , "Org.datasize"  , ftypes.UINT16 , nil)
f_ContData6 = ProtoField.new("DATA_ID" , "Org.dataid"  , ftypes.UINT32 , nil)
f_ContData7 = ProtoField.new("DATA" , "Org.data"  , ftypes.FLOAT , nil)
f_ContData8 = ProtoField.new("TIME" , "Org.time"  , ftypes.UINT64, nil)
-- （３）定義したプロトコルフィールドをプロトコルフィールド配列に登録
OrgProto.fields = {f_ContData1, f_ContData2, f_ContData3, f_ContData4, f_ContData5,f_ContData6,f_ContData7,f_ContData8}
-- （４）dissector関数の定義
function OrgProto.dissector(buffer, pinfo, tree)
    -- （５）dissector関数内で使用するローカル変数の定義及びbufferからの値の取得
    local ContData1 = buffer(0, 2):uint()
    local ContData2 = buffer(2, 1):uint()
    local ContData3 = buffer(3, 1):uint()
    local ContData4 = buffer(3, 1):uint()
    local ContData5 = buffer(4, 2):uint()   
    local ContData6 = buffer(6, 4):uint()
    local ContData7 = buffer(10, 8):float()
    local ContData8 = buffer(18, 8):uint64()
    -- （６）プロトコル情報を設定
    -- "Protocol"列の表示
    pinfo.cols.protocol = "Org protocol"
    -- "info"列の表示
   pinfo.cols.info = "Frame Bytes:" .. ContData1 ..   " データ数:" .. ContData5.. " データ 1:" .. ContData7
    -- （７）treeに"Original Protocol"の情報を追加 
    -- treeにサブツリーとして"Original Protocol"を追加
    local subtree = tree:add( OrgProto, buffer() )   
    -- サブツリー内に上記で定義した各プロトコルフィールドの値を追加
    subtree:add( f_ContData1, buffer(0, 2) )
    subtree:add( f_ContData2, buffer(2, 1) , buffer(2, 1):uint(),  "Version: " .. buffer(2, 1):uint() ..  string.format("", buffer(2, 1):uint()) .. "(0 :Version A)")
    subtree:add( f_ContData3, buffer(3, 1) )
    subtree:add( f_ContData4, buffer(3, 1) )
    subtree:add( f_ContData5, buffer(4, 2) )    

   local datalen = buffer:len() - 6
    local subtree2=subtree:add(buffer(6,datalen), "DATA" )    
    --  データ数分ループする
    local i = 1
    local offset =6  
    for i = 1,ContData5 do
      offset =20*(i-1)
      subtree2:add( f_ContData6, buffer(6+offset,4), buffer(6+offset,4):uint(),  "DATA_ID:" .. buffer(6+offset,4):uint() ..  string.format("(0x%04x)", buffer(6+offset,4):uint()) .. " ")    
      subtree2:add( f_ContData7, buffer(6+4+offset,8), buffer(6+4+offset,8):float(),  "DATA:" .. buffer(6+4+offset,8):float() )   
      local timestamp = buffer(6+12+offset,8):uint64()
      -- UNIX時間（秒）に変換
      local unix_time = timestamp / 1000  
      local formatted_time = os.date("!%Y-%m-%d %H:%M:%S", tostring(unix_time))
      -- local time zone of the system
      -- local formatted_time = os.date("%Y-%m-%d %H:%M:%S", tostring(unix_time))
      subtree2:add( f_ContData8,buffer(6+12+offset,8), buffer(6+12+offset,8):uint64(), "TIME: " .. formatted_time)
     end
end

-- （８）定義したプロトコルをUDPポート番号を指定した紐づけ
udp_table = DissectorTable.get("udp.port")
udp_table:add(9898, OrgProto)

```
作成時困ったことは時間の所くらいです。
msで入っていたので秒に変換してosdateで表示
システムのtime zoneで表示したいときはコメントアウトしているところを使用
一つのパケットに複数のデータを送れるようになっていたので
データ数を見てループしました。

# 使い方
wireshark\pluginsに入れて起動する


# 動作

データが１回の時と
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/48a1e08a-00f5-d109-8ad3-89749b695767.png)
データが２個の時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/51311640-b63e-e46e-7689-15792d58c49e.png)

UDPの送信はＵＤＰ／ＩＰテストツールをお借りして模擬的に送信しました。
送ったデータは適当です。







# 参考URL
https://taekwongineer.hatenablog.jp/entry/2020/04/05/235043

https://taekwongineer.hatenablog.jp/entry/2020/04/19/175207

https://io.cyberdefense.jp/entry/wireshark_lua_original_dissector/

https://qiita.com/yokoi-engineering/items/6ab9fbdbb3d6322c2703

https://qiita.com/RCA3610/items/5f6e8238a8e9dbb89a11

http://nonsoft.la.coocan.jp/Download/UdpTool/index.html