作業中

-- カスタムプロトコルの識別子(任意の値を設定)

local NX_PROTOCOL = Proto("NXDlink", "nxdlink protocol dissector")

 

-- プロトコルのフィールド定義

local nx_protocol_fields = NX_PROTOCOL.fields

nx_protocol_fields.magic = ProtoField.string("nx_protocol.magic", "Magic Number")

nx_protocol_fields.message_length = ProtoField.uint32("nx_protocol.message_length", "Message Length")

nx_protocol_fields.source_address = ProtoField.uint32("nx_protocol.source_address", "Source Address")

nx_protocol_fields.destination_address = ProtoField.uint32("nx_protocol.destination_address", "Destination Address")

nx_protocol_fields.timestamp = ProtoField.uint32("nx_protocol.timestamp", "Timestamp")

nx_protocol_fields.message_number = ProtoField.uint32("nx_protocol.message_number", "Message Number")

nx_protocol_fields.m_ctl = ProtoField.uint32("nx_protocol.m_ctl", "M_CTL")

nx_protocol_fields.inq_id = ProtoField.string("nx_protocol.inq_id", "INQ_ID")

nx_protocol_fields.tcd = ProtoField.uint32("nx_protocol.tcd", "TCD")

nx_protocol_fields.ver = ProtoField.uint32("nx_protocol.ver", "VER")

nx_protocol_fields.gtid = ProtoField.string("nx_protocol.gtid", "GTID")

nx_protocol_fields.mode = ProtoField.uint32("nx_protocol.mode", "MODE")

nx_protocol_fields.pver = ProtoField.uint32("nx_protocol.pver", "PVER")

nx_protocol_fields.pri = ProtoField.uint32("nx_protocol.pri", "PRI")

nx_protocol_fields.cbn = ProtoField.uint32("nx_protocol.cbn", "CBN")

nx_protocol_fields.tbn = ProtoField.uint32("nx_protocol.tbn", "TBN")

nx_protocol_fields.bsize = ProtoField.uint32("nx_protocol.bsize", "BSIZE")

nx_protocol_fields.fui = ProtoField.uint32("nx_protocol.fui", "FUI")

-- nx_protocol_fields.fc = ProtoField.uint32("nx_protocol.fc", "FC", base.HEX)

nx_protocol_fields.fc = ProtoField.uint32("nx_protocol.fc", "FC")

nx_protocol_fields.field_x =  ProtoField.uint32("nx_protocol.field_x", "FIELD_X")

nx_protocol_fields.field_y =  ProtoField.uint32("nx_protocol.field_y", "FIELD_Y")

nx_protocol_fields.field_z =  ProtoField.uint32("nx_protocol.field_z", "FIELD_Z")

 

-- カスタムプロトコルの識別子(任意の値を設定)

--local DATA_PROTOCOL = Proto("DATALink", "datalink protocol dissector")

-- プロトコルのフィールド定義

--local data_protocol_fields = DATA_PROTOCOL.fields

--data_protocol_fields.fc = ProtoField.uint32("data_protocol.fc", "FC")

 

 

 

 

-- パケット解析関数

function NX_PROTOCOL.dissector(buffer, pinfo, tree)

-- フレーム情報を表示

pinfo.cols.protocol:set("NX Protocol")

local subtree = tree:add(NX_PROTOCOL, buffer(), "NX Protocol Data")

 

-- "NUXM" ヘッダ文字列を確認

local data = buffer():string()

-- local offset = data:find("NUXM")

local offset = data:find("NUXM") -1 -- 1を引かないと、ずれる

if not offset then

-- "NUXM" が見つからない場合は解析を中止

return

end

 

-- ヘッダ情報を解析

 

subtree:add(nx_protocol_fields.magic, buffer(offset, 4))

subtree:add(nx_protocol_fields.message_length, buffer(offset  + 4, 4))

subtree:add(nx_protocol_fields.source_address, buffer(offset  + 8, 4))

subtree:add(nx_protocol_fields.destination_address, buffer(offset + 12, 4))

subtree:add(nx_protocol_fields.timestamp, buffer(offset + 16, 4))

subtree:add(nx_protocol_fields.message_number, buffer(offset + 20, 4))

subtree:add(nx_protocol_fields.m_ctl, buffer(offset + 24, 4))

subtree:add(nx_protocol_fields.inq_id, buffer(offset + 28, 12))

subtree:add(nx_protocol_fields.tcd, buffer(offset + 40, 2))

subtree:add(nx_protocol_fields.ver, buffer(offset + 42, 2))

subtree:add(nx_protocol_fields.gtid, buffer(offset + 44, 8))

subtree:add(nx_protocol_fields.mode, buffer(offset + 52, 2))

subtree:add(nx_protocol_fields.pver, buffer(offset + 54, 1))

subtree:add(nx_protocol_fields.pri, buffer(offset + 55, 1))

subtree:add(nx_protocol_fields.cbn, buffer(offset + 56, 1))

subtree:add(nx_protocol_fields.tbn, buffer(offset + 57, 1))

subtree:add(nx_protocol_fields.fui, buffer(offset + 60, 4))

subtree:add(nx_protocol_fields.fc, buffer(offset + 64, 2))

 

-- fcの値を取得

-- local fc_value = buffer(offset + 64, 2):le_uint() -- リトルエンディアンの場合

local fc_value = buffer(offset + 64, 2)-- リトルエンディアンの場合

 

-- デバッグ情報を表示

-- print("fc_value:", string.format("0x%04X", fc_value)) -- 16進数表示

 

 

 

-- fcの値に応じてフィールドを追加

-- if fc_value == 0x181 then

-- if fc_value == 385 then

if fc_value = 0 then

-- 0x181の場合、特定のフィールドを追加

subtree:add(nx_protocol_fields.field_x, buffer(offset + 66, 4))

elseif fc_value == 0x183 then

-- 0x183の場合、別のフィールドを追加

subtree:add(nx_protocol_fields.field_y, buffer(offset + 66, 4))

elseif fc_value == 0x188 or fc_value == 0x189 then

-- 0x188または0x189の場合、共通のフィールドを追加

subtree:add(nx_protocol_fields.field_z, buffer(offset + 66, 4))

else

-- その他の場合、何もしない

end

 

 

end

 

--function DATA_PROTOCOL.dissector(buffer, pinfo, tree)

-- フレーム情報を表示

--   pinfo.cols.protocol:set("DATA Protocol")

--   local subtree = tree:add(DATA_PROTOCOL, buffer(), "DATA Protocol Data")

--   subtree:add(data_protocol_fields.fc, buffer(64, 2))

--end

 

 

-- プロトコルをWiresharkに登録

local udp_table = DissectorTable.get("udp.port")

udp_table:add(10631, NX_PROTOCOL) -- UDPポート10631でカスタムプロトコルを解析

udp_table:add(40311, NX_PROTOCOL) -- UDPポート40311でカスタムプロトコルを解析

udp_table:add(40312, NX_PROTOCOL) -- UDPポート40312でカスタムプロトコルを解析

 

 

未分類

Posted by ebata