wireshark的lua编写

作为一名硬件工程师,来理解C语言,如果之前学习的过得我不多说,如果没有学习过得那就很头疼了,关于这个方面,我也刚刚入手写了一个wireshark的解析文件,用的是verilog的思路来进行解释的,如果有解释不对的地方希望大家帮忙指出

mongodb_protocol = Proto("MongoDB",  "MongoDB Protocol")
//创建了一个顶层模块;MongoDB是wireshark的protocol 协议名字,如TCP,TDS等

message_length = ProtoField.int32("mongodb.message_length", "messageLength", base.DEC)
// mongodb.message_length (mongodb是顶层模块的名字message_length是根据取的名字决定的(历化的名字子模块);messageLength(可以自己命名) 过滤器下面的名字;base.DEC定义了数据的显示格式(DEC是10进制)

request_id     = ProtoField.int32("mongodb.requestid"     , "requestID"    , base.DEC)
response_to    = ProtoField.int32("mongodb.responseto"    , "responseTo"   , base.DEC)
opcode         = ProtoField.int32("mongodb.opcode"        , "opCode"       , base.DEC)

mongodb_protocol.fields = { message_length, request_id, response_to, opcode }
//将上面的子模块包含进去,相当于顶层的连线

function mongodb_protocol.dissector(buffer, pinfo, tree)//创建一个函数(always块)
  length = buffer:len()//获取buffer的长度
  if length == 0 then return end//如果buffer为0就返回值,不可能为0的

  pinfo.cols.protocol = mongodb_protocol.name
  //将模块的名字显示到wireshark的协议那一栏,第一种方法
  pinfo.cols.protocol:set(“Binary”) 
  //将模块的名字显示到wireshark的协议那一栏,第二种方法
  pinfo.cols.protocol:append(“:19007”) 
  //将模块的名字显示到wireshark的协议那一栏,并且在后面加上:19007

  local subtree = tree:add(mongodb_protocol, buffer(), "MongoDB Protocol Data")
// subtree 树的模块名字;mongodb_protocol包含这个库里面的子模块给下面 的subtree:add_le(message_length, buffer(0,4))使用; buffer()将buffer里面的数据存到这模块里面;MongoDB Protocol Data端口解析的名字

  subtree:add_le(message_length, buffer(0,4))
//在树得名字下,添加message_length名字buffer(0,4)buffer的数据
  subtree:add_le(request_id,     buffer(4,4))
  subtree:add_le(response_to,    buffer(8,4))

local opcode = buffer(12,4):le_uint()//为了获取操作码为整数,我们可以使用
le_uint()为了获取小的尾数整数型 opcode名字
  local opcode_name = get_opcode_name(opcode)

  subtree:add_le(opcode,         buffer(12,4)) :append_text(" (" .. opcode_name .. ")")

end

function get_opcode_name(opcode)
  local opcode_name = "Unknown"
      if opcode ==    1 then opcode_name = "OP_REPLY"
  else	opcode_name = "OP_UPDATE"end
return flags_description
end

local tcp_port = DissectorTable.get("tcp.port")
tcp_port:add(59274, mongodb_protocol)
//使用的TCP的端口是59274
 pinfo.cols.protocol = mongodb_protocol.name
 pinfo.cols.protocol:set(“CLIENT”) 
 pinfo.cols.protocol:append(“:10”) 

第一句话的意思等同于第二句话
在这里插入图片描述
第三句话就是在第一局话输出的结果长追加:10
wireshark的lua编写_第1张图片
从图片可以得到第二句话和第三句话执行了

  local subtree = tree:add(mongodb_protocol, buffer(), "MongoDB Protocol Data")

这句话的意思是在wireshark的树得名字是MongoDB Protocol Data
wireshark的lua编写_第2张图片

  subtree:add_le(request_id,     buffer(4,4))

这句话的意思是在下面打印出来,解析的这个数据的名字,和数据的内容
wireshark的lua编写_第3张图片

function get_opcode_name(opcode)
  local opcode_name = "Unknown"
      if opcode ==    1 then opcode_name = "OP_REPLY"
  else	opcode_name = "0"end
return flags_description
end

这段话就是给解析出来的数据的名字内容进行解释,相当于注释
wireshark的lua编写_第4张图片

2020年7月21日

更新子树的使用
前面我们讲到树是

subtree=tree:add(messageLength , buffer(0,4))

子树就是在这个分支下面再开一个分支

zitree=subtree:add(messageLength , buffer(0,4))

实际展示如图所示
在这里插入图片描述
大小端的问题是通过add_le_le来解决的

以下是我查阅的资料的网站
Creating a Wireshark dissector in Lua - part 1 (the basics)
Creating a Wireshark dissector in Lua - part 2 (debugging and a more advanced dissector)
Creating a Wireshark dissector in Lua - part 3 (parsing the payload)

你可能感兴趣的:(wireshark的lua编写)