-基本的程序框架:

--mydns
do --把代码放到do ... end中,避免命名冲突
mydns = Proto("MyDns","MyDns","MyDns")
--定义自己的协议,参数都是字符串,返回一个协议对象
mydns.dissector = function(buffer,pinfo,tree)
--定义这个协议的解析函数,最后会将这个函数注册到wireshark用来解析数据的表中。这个函数的三个参数很重要,是wireshar引擎在调用该函数是会传入,
--buffer就是我们要分析的数据,
--pinfo记录了前面分析过协议留下的信息
--tree是用来在详细框中添加我们信息的结构。 这三个参数在后面的程序中经常会用到的 pinfo.cols.protocol = "MyDns"
--在pinfo上面加mydns的protocol字段,这会是显示在界面上protocol栏里面

pinfo.cols.info = "This is a special dns"

--这是显示在界面的info里面的东西
tb = tree:add(buffer(),"DNS")
--buffer(start,offset),这里buffer以start为起点,offset为偏移返回数据,是以字节(byte)为单位的,详细的buffer操作看help.这样操作以后,这个解析器生效的时候就可以在详细框中看到dns了
end
udp_table = DissectorTable.get("udp.port")
--获取udp.port表,我还不知道具体有哪些表,但这个是能用的

udp_table:add(53,mydns.dissector)

--把新协议加到上面获取的表中,匹配udp.port == 53,当有符合端口数据进来,wireshark引擎就会调用mydns.dissector.这个优先级比软件内部解析器要高,所以原来的DNS你就找不到了,取而代之的是MyDns
end
--note
--[[ 1,关于dissector的参数: pinfo还有很多选项,参考help中的api,要用那个具体再选 buffer一定要注意,返回的单位是byte,而且数据类型为userdata.所以解析的时候还要做很多转换工作,如转换为字符串,整数这些都有相应的函数支持 tree我现在知道的就是用来显示详细信息的,这部分就是我们解析buffer,把相关的信息加到tree里面,以后就可以在wireshark里面直接分析协议了 2,buffer其实应该是TvbRange,可以看看他有很多的操作提供在api里面,如果你的应用需要把协议在分,那么TvbRange:call()能够继续调用下一层的协议来进行分析 --]]