使用lua腳本寫自己的私有協議

-基本的程序框架:
--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()能夠繼續調用下一層的協議來進行分析 --]]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章