Skip to content

Instantly share code, notes, and snippets.

@michaelgruenewald
Last active March 6, 2022 23:34
Show Gist options
  • Save michaelgruenewald/b2372c9e6d50c47288575da906df9e73 to your computer and use it in GitHub Desktop.
Save michaelgruenewald/b2372c9e6d50c47288575da906df9e73 to your computer and use it in GitHub Desktop.
iscp_protocol = Proto("ISCP", "ISCP protocol")
iscp_protocol.fields.header = ProtoField.bytes("iscp.header", "header")
iscp_protocol.fields.magic = ProtoField.string("iscp.magic", "magic")
iscp_protocol.fields.hsize = ProtoField.uint32("iscp.hsize", "hsize")
iscp_protocol.fields.dsize = ProtoField.uint32("iscp.dsize", "dsize")
iscp_protocol.fields.version = ProtoField.uint8("iscp.version", "version")
iscp_protocol.fields.payload = ProtoField.bytes("iscp.payload", "payload")
iscp_protocol.fields.start = ProtoField.char("iscp.start", "start")
iscp_protocol.fields.dest = ProtoField.char("iscp.dest", "dest")
iscp_protocol.fields.cmd = ProtoField.string("iscp.cmd", "cmd")
iscp_protocol.fields.param = ProtoField.string("iscp.param", "param")
iscp_protocol.fields.end_ = ProtoField.string("iscp.end", "end")
iscp_protocol.fields.garbage = ProtoField.bytes("iscp.garbage", "garbage")
iscp_protocol.fields = { magic, hsize, dsize, version, start, dest, cmd, param, end_, garbage }
function iscp_protocol.dissector(buffer, pinfo, tree)
length = buffer:len()
if length == 0 then return end
pinfo.cols.protocol = iscp_protocol.name
local subtree = tree:add(iscp_protocol, buffer(), "ISCP Protocol Data")
local header = buffer(0, 16)
local header_tree = subtree:add(iscp_protocol.fields.header, header, "Header")
header_tree:add(iscp_protocol.fields.magic, header(0, 4))
header_tree:add(iscp_protocol.fields.hsize, header(4, 4))
header_tree:add(iscp_protocol.fields.dsize, header(8, 4))
header_tree:add(iscp_protocol.fields.version, header(12, 1))
local payload = buffer(16, header(8, 4):uint())
local payload_tree = subtree:add(iscp_protocol.fields.payload, payload, "Payload")
payload_tree:add(iscp_protocol.fields.start, payload(0, 1))
payload_tree:add(iscp_protocol.fields.dest, payload(1, 1))
payload_tree:add(iscp_protocol.fields.cmd, payload(2, 3))
paramend = payload(5)
local stop = string.find(paramend:string(), "[\r\n\25\26]+$") - 1
payload_tree:add(iscp_protocol.fields.param, paramend(0, stop))
payload_tree:add(iscp_protocol.fields.end_, paramend(stop))
local expectedsize = 16 + header(8, 4):uint()
if buffer:len() > expectedsize then
subtree:add(iscp_protocol.fields.garbage, buffer(expectedsize), "[Garbage]")
end
end
DissectorTable.get("tcp.port"):add(60128, iscp_protocol)
DissectorTable.get("udp.port"):add(60128, iscp_protocol)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment