fmtp

阅读 / 问答 / 标签

什么是wireshark中FMTP协议和operational message

一、平台操作系统:windows 7wireshark:1.10.3lua:5.1二、准备lua 语言基本语法,特别是关于表操作和循环wireshark 文档,包括用户使用文档和开发者文档,这些在 wireshark 官方网站都能找到三、开始我们首先定义一个简单的协议,我们使用 C 语言的语法描述,1 struct foo2 {3 char protocol_type[16]; /* request response notify */4 char service_type[16]; /* 我们定义的各种服务类型 */5 unsigned int msg_len; /* 消息体的长度 */6 char msg_content[0]; /* 消息体的内容,由于是变长的所以采用此方法定义 */7 };现在可以让我们使用 lua 定义一个最基本的框架1 do 2 --[[ 3 创建一个新的协议结构 foo_proto 4 第一个参数是协议名称会体现在过滤器中 5 第二个参数是协议的描述信息,无关紧要 6 --]] 7 local foo_proto = Proto("foo", "Foo Protolcol") 8 9 --[[10 下面定义字段11 --]]12 local foo_protocol_type = ProtoField.string("foo.prototype", "Protocol Type", base.NONE)13 local foo_service_type = ProtoField.string("foo.servicetype", "Service Type", base.NONE)14 local foo_msg_len = ProtoField.uint32("foo.msglen", "Message Length", base.DEC)15 local foo_msg_content = ProtoField.string("foo.msgcontent", "Message Content", base.NONE)16 17 -- 将字段添加都协议中18 foo_proto.fields = {19 foo_protocol_type,20 foo_service_type,21 foo_msg_len,22 foo_msg_content23 }24 25 --[[26 下面定义 foo 解析器的主函数,这个函数由 wireshark调用27 第一个参数是 Tvb 类型,表示的是需要此解析器解析的数据28 第二个参数是 Pinfo 类型,是协议解析树上的信息,包括 UI 上的显示29 第三个参数是 TreeItem 类型,表示上一级解析树30 --]]31 function foo_proto.dissector(tvb, pinfo, treeitem)32 33 -- 设置一些 UI 上面的信息34 pinfo.cols.protocol:set("FOO")35 pinfo.cols.info:set("Foo Protocol")36 37 local offset = 038 local tvb_len = tvb:len()39 40 -- 在上一级解析树上创建 foo 的根节点41 local foo_tree = treeitem:add(foo_proto, tvb:range(offset))42 43 -- 下面是想该根节点上添加子节点,也就是自定义协议的各个字段44 -- 注意 range 这个方法的两个参数的意义,第一个表示此时的偏移量45 -- 第二个参数代表的是字段占用数据的长度46 foo_tree:add(foo_protocol_type, tvb:range(offset, 16))47 offset = offset+16 48 foo_tree:add(foo_service_type, tvb:range(offset, 16))49 offset = offset+1650 foo_tree:add(foo_msg_len, tvb:range(offset, 4))51 offset = offset+452 53 -- 计算消息内容的长度54 local foo_content_len = tvb_len-offset55 foo_tree:add(foo_msg_content, tvb:range(offset, foo_content_len))56 offset = offset+foo_content_len57 58 end59 60 -- 向 wireshark 注册协议插件被调用的条件61 local tcp_port_table = DissectorTable.get("tcp.port")62 tcp_port_table:add(12345, foo_proto)63 end