Chinaunix首页 | 论坛 | 博客
  • 博客访问: 643820
  • 博文数量: 155
  • 博客积分: 5688
  • 博客等级: 大校
  • 技术积分: 2134
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-15 15:12
文章分类

全部博文(155)

文章存档

2011年(58)

2010年(97)

分类: 系统运维

2010-06-23 20:27:30

声明:本文为原创
#####请转贴时保留以下内容######
作者GTT
本文档归属http://oldtown.cublog.cn/.转载请注明出处!
请提出宝贵意见Mail:mtloveft@hotmail.com
提示:本文是我学习计算机网络和协议的方法,希望对大家有说帮助!
 
Wireshark已经嵌入Script语言Lua,用lua编写的插件运行和修改很方便。不需要重新编译,只要wireshark重启动就可以了,如果对效率要求不高,那么采用lua插件是一个很好的选择。
没写插件前的效果如下:
 
解析前UDP的数据是一团遭,根本不清楚是什么。下图是加入LUA插件后的效果。
 
可以清晰地看出ProtocolStack。是ICMP协议数据。Lua是OOScript语言,如果有OO基础的话,马上就可以上手。不需要特殊学习。提供个上面的sample。
 
 do
        --Ucp1解析
 local p_ucp1 = Proto("Ucp1","User Customizing protocol1")
        local f_version = ProtoField.bytes("Ucp1.version","Version")
        local f_code = ProtoField.bytes("Ucp1.code","Code")
 local f_reserve = ProtoField.bytes("Ucp1.reserve","Reserve")
 local f_protocol = ProtoField.uint8("Ucp1.protocol","Protocol",base.HEX,{ [0] = "Ucp0", [1] = "Ucp2"})
 local f_id1 = ProtoField.uint16("Ucp1.id1","ID1")
 local f_id2 = ProtoField.uint16("Ucp1.id2","ID2")
 local f_options = ProtoField.uint16("Ucp1.options","Options")
 local f_length = ProtoField.uint16("Ucp1.length","Length")
 p_ucp1.fields = { f_version, f_code, f_reserve, f_protocol, f_id1, f_id2, f_options, f_length}
 --Ucp2解析
 local p_ucp2 = Proto("Ucp2","User Customizing protocol2")
        local f_msg_type = ProtoField.bytes("Ucp2.msg_type","Message Type")
        local f_send_no = ProtoField.uint8("Ucp2.send_no","Send Number")
 local f_ucp2_length = ProtoField.uint16("Ucp2.length","Length")
 p_ucp2.fields = { f_msg_type, f_send_no, f_ucp2_length}
 --PPP解析
 local p_ppp = Proto("PPP-u","Point to point protocol")
        local f_ppp_protocol = ProtoField.uint16("ppp-u.protocol","Protocol Type",base.HEX,{ [33] = "IP"})
 p_ppp.fields = { f_ppp_protocol}
 local data_dis = Dissector.get("data")
 --Ucp1詳細解析method
 local function Ucp1_dissector(buf,pkt,root)
  local buf_len = buf:len();
  if buf_len < 12 then return false end
                local v_version = buf(0,1)
                local v_code = buf(1,1)
                local v_reserve = buf(2,1)
                local v_protocol = buf(3,1)
                local v_id1 = buf(4,2)
                local v_id2 = buf(6,2)
                local v_options = buf(8,2)
                local v_length = buf(10,2)
  
  local t = root:add(p_ucp1,buf(0, buf_len))
  pkt.cols.protocol = "Ucp1"
  pkt.cols.info = "user customizing protocol 1"
  t:add(f_version,v_version)
  t:add(f_code,v_code)
  t:add(f_reserve,v_reserve)
  t:add(f_protocol,v_protocol)
  t:add(f_id1,v_id1)
  t:add(f_id2,v_id2)
  t:add(f_options,v_options)
  t:add(f_length,v_length)
  return true
 end
 --Ucp2詳細解析method
 local function Ucp2_dissector(buf,pkt,root)
  local buf_len = buf:len();
  if buf_len < 20 then return false end
                local v_msg_type = buf(0,1)
                local v_send_no = buf(1,1)
                local v_ucp2_length = buf(2,2)
  local s = root:add(p_ucp2,buf(0, buf_len))
  pkt.cols.protocol = "Ucp2"
  pkt.cols.info = "user customizing protocol 2 (- v -)"
  s:add(f_msg_type,v_msg_type)
  s:add(f_send_no,v_send_no)
  s:add(f_ucp2_length,v_ucp2_length)
               
  return true
 end
 --P2P詳細解析method
 local function PPP_dissector(buf,pkt,root)
  local buf_len = buf:len();
  if buf_len < 18 then return false end
                local v_ppp_protocol = buf(16,2)
  local s = root:add(p_ppp,buf(16,2))
  pkt.cols.protocol = "point to point protocol"
  pkt.cols.info = "point to point protocol"
  s:add(f_ppp_protocol,v_ppp_protocol)
               
  return true
 end
 
 --Ucp1解析
 function p_ucp1.dissector(buf,pkt,root)
  if Ucp1_dissector(buf,pkt,root) then
   ucp2_buf = buf(12, buf:len()-12):tvb()
   if Ucp2_dissector(ucp2_buf,pkt,root) then
    PPP_dissector(buf,pkt,root)
    ip_dissector = Dissector.get("ip")
    sub_buf = buf(18, buf:len()-34):tvb()
    ip_dissector:call( sub_buf, pkt, root )
   else
    data_dis:call(buf,pkt,root)
   end
   --DissectorTable.new("Ucp1.protocol", [1], [type], [base])
   --valid UCP1 diagram
  else
   data_dis:call(buf,pkt,root)
  end
 end
 
 local udp_encap_table = DissectorTable.get("udp.port")
 udp_encap_table:add(40001,p_ucp1)
end
 
详细学习内容请参照右面的URL
把编写好的程序保存为UCP.lua,放到wireshark的安装目录里。
编辑安装目录下的init.lua,comment掉disable_lua = true; do return end;这一行。
在文件尾加上dofile(UCP.lua)重起Wireshark就可以看到效果了。
很简单吧,如果Protocol复杂的话,也挺麻烦的。
我正在开发个通用的自动生成LuaScript的工具。希望以后能对大家有些帮助!
写的不详细,因为Wireshark开发插件只是业余的。我的主要目标是把linux实现
网络协议栈部分写完,贴出来!我的分析步骤是按照网络分层写的,
第一部分是NIC Driver,
第二部分是L2,主要分析Ethernet,LLC, Vlan, net bridge
第三部分是L3,主要分析IP, Route
第四部分是L4,主要分析TCP,UDP
第五部分是主要分析SOCKET的实现
希望大家多提出宝贵意见。如果想要详细信息,我可以多写些关于Wireshark插件的内容。不过这个没什么意思,人家都给留好接口了,很简单的,没技术含量。
 
如果需要CaptureFile的XDJM,请留下Email。我会发给你sample和cap文件。
阅读(5231) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~