Ethereal 也可以使用lua做一些自定义的功能了--编写lua脚本扩展ethereal的功能

原创 2006年06月07日 13:15:00

编写lua脚本扩展ethereal的功能
 一直用ethereal做一些网络截包的工作,感叹于ethereal强大的同时,也为其无法如analsys捕获工具的netpdl语言一般扩展而感到不便,自己写解析器又觉得麻烦,现在ethereal由了0.99.0版本(一个跟前一个版本跳跃很大的版本号),支持lua扩展,真是福音。

 当然做法就是采用lua扩展,把一些基本功能变成lua可以调用的库,然后在启动的时候把lua脚本作为参数传递进去。用lua脚本可以做三种方式的事情:

tap:一种从每一帧中提取数据的方式,可以用显示过滤器定义,下面是一个例子:

    一个简单的tap,可以用于tethereal,用于统计通过10.0.0.1得http和dns包:
   
   
    -- this is going to be our counter
    http_packets = 0
   
    -- this is going to be our tap
    tap_http = nil
   
    -- first we declare the tap called "http tap" with the filter it is going to use
    tap_http = new_tap("mytap","ip.addr == 10.0.1.3 && http")
   
    -- then we define a function to (re)initialize our counter
    -- this one is going to be called every time the capture restarts (2)
    function tap_http.init()
        http_packets = 0
    end
   
    -- this function will get called at the end(3) of the capture to print the summary
    function tap_http.draw()
        print("http packets:",http_packets)
    end
   
    -- this function is going to be called once each time the filter of the tap matches
    function tap_http.packet()
        http_packets = http_packets + 1
   
        -- We return true to have ethereal printing a report every few seconds
        -- if we returned false ethereal would call the draw function never
        return true
    end
   
    GUI方式
    -- text_window_tap.lua
    -- an example of a tap that registers a menu
    -- and prints to a text window
   
    instances = 0 -- number of instances of the tap created so far
   
    function mytap_menu()
        instances = instances + 1
   
        local td = {}
        -- the tap data, passed to every function of the tap
        -- beware not to use a global for taps with multiple instances or you might
        -- find it been written by more instances of the tap, not what we want.
       
        td.win = TextWindow.new("My Tap " .. instances) -- the window we'll use
        td.text = "" -- the text of the tap
        td.instance = instances -- the instance number of this tap
   
        -- this tap will be local to the menu_function that called it
        -- it's called mytap
        -- has no filter (filter = nil)
        -- and we pass to it the tap data so that it gets passed to the tap's functions
        local tap = new_tap("mytap"..instances,nil, td)
       
        -- make sure the tap doesn't hang arround after the window was closed
        td.win:at_close(remove_tap,tap)
   
        -- this function will be called for every packet
        function tap.packet(pinfo,tvb,tapdata)
            local text = "packet " .. pinfo.number
            tapdata.text = tapdata.text .. "/n" .. text
            -- print("packet " .. pinfo.number, tapdata.instance)
        end
   
        -- this function will be called once every few seconds to redraw the window
        function tap.draw(tapdata)
            tapdata.win:set(tapdata.text)
            -- print("draw", tapdata.instance)
        end
   
        -- this function will be called before every run of the tap
        function tap.init(tapdata)
            tapdata.text = ""
            -- print("init", tapdata.instance)
        end
   
    end
   
    -- last we register the menu
    -- the first arg is the menu name
    -- the 2nd arg is the function to be called
    -- the third argument (defaults to false) tells to re-run the capture once the function is run
    register_menu("Lua Tap Test",mytap_menu,true)
   
    -- print("registered")


dissectors:解析器
 解析器用与分析包的数据,类似C解析器,可以注册lua写的解析器来某个协议,ethereal会将一个数据缓冲区和一个包信息传递给lua处理函数
   
   
    -- trivial protocol example
   
    -- declare our protocol
    trivial_proto = Protocol("trivial","TRIVIAL","Trivial Protocol")
   
    -- create a function to dissect it
    function trivial_proto.dissector(buffer,pinfo,tree)
        pinfo.cols.protocol = "TRIVIAL"
        local subtree = tree:add_item(trivial_proto,buffer(),"Trivial Protocol Data"):add_subtree()
        subtree:add_item(buffer(0,2),"The first two bytes: " .. buffer(0,2):uint())
    end
   
    -- load the udp.port table
    udp_table = DissectorTable.get("udp.port")
   
    -- register our protocol to handle udp port 7777
    udp_table:add(7777,trivial_proto)
   
postdissectors 后解析器:
 一个后解析器是在其他解析器已经被调用后才调用的解析器,由于所有的域已经被解析,所以这种类型的解析器可以存取所有域并且能加域到解析树中:

   
    -- trivial postdissector example
   
    -- declare some Fields to be read
    ip_src_f = Field("ip.src")
    ip_dst_f = Field("ip.dst")
    tcp_src_f = Field("tcp.srcport")
    tcp_dst_f = Field("tcp.dstport")
   
    -- declare our (pseudo) protocol
    trivial_proto = Protocol("trivial","TRIVIAL","Trivial Postdissector")
   
    -- create the fields for our "protocol"
    src_F = ProtoField.string("trivial.src","Source");
    dst_F = ProtoField.string("trivial.dst","Destination");
    conv_F = ProtoField.string("trivial.conv","Conversation","A Conversation");
   
    -- add the field to the protocol
    trivial_proto.fields = ProtoFieldArray.new(src_F, dst_F, conv_F)
   
    -- create a function to "postdissect" each frame
    function trivial_proto.dissector(buffer,pinfo,tree)
        -- obtain the current values the protocol fields
        local tcp_src = tcp_src_f()
        local tcp_dst = tcp_dst_f()
        local ip_src = ip_src_f()
        local ip_dst = ip_dst_f()
        if tcp_src then
           local subtree = tree:add_item(trivial_proto,"Trivial Protocol Data"):add_subtree()
           local src = ip_src .. ":" .. tcp_src
           local dst = ip_dst .. ":" .. tcp_dst
           local conv = src  .. "->" .. dst
    
           subtree:add_item(src_F,src)
           subtree:add_item(dst_F,dst)
           subtree:add_item(conv_F,conv)
        end
    end
   
    -- register our protocol as a postdissector
    register_postdissector(trivial_proto)
   
看来,以后常跟截包打交道的同仁们有了自由发挥的余地了,记得一定要学lua,这是最火的脚本语言之一

 

Windows下使用Wireshark(ethereal)进行抓包分析

http://pjing1124.blog.163.com/blog/static/5142315120091065133328/ 说明:由于版权问题,该开源软件的新版本现已更名为Wireshark...
  • s_k_yliu
  • s_k_yliu
  • 2011年08月06日 10:58
  • 3094

Ethereal 过滤规则

Ethereal 过滤规则 过滤规则: 一、IP过滤:ip.addr==192.168.100.25 或者 !(192.168.100.25) IP过滤有ip.s...
  • gtkknd
  • gtkknd
  • 2016年10月19日 11:29
  • 327

网络协议分析工具Ethereal的使用

大学时计算机网络课的实验报告,当时提不起兴趣,今天看来还挺有用的。可以学习下怎样抓数据包,然后分析程序的通信协议。 一:学习使用网络协议分析工具Ethereal的方法,并用它来分析一些协...
  • dc_726
  • dc_726
  • 2011年11月28日 21:21
  • 3590

使用ethereal(wireshark)抓数据包。

现在ethereal名字成为wireshark。我使用的版本是0995 。安装按照默认即可。启动wireshark后,先设置网卡。选择Capture-Options。Interface:选择物理网卡(...
  • gby630
  • gby630
  • 2007年11月05日 11:45
  • 1182

Ethereal简介

ethereal 可以用来从网络上抓包,并能对包进行分析。下面介绍windows 下面ethereal 的使用方法安装1)安装winpcap,下载地址http://netgroup-serv.poli...
  • Suprman
  • Suprman
  • 2006年09月29日 20:42
  • 6124

获取Ethereal抓包中数据得程序段

前提:             libcap的库以及头文件:)代码:#include #include  #define LINE_LEN 16#define TS_SPLIT_VERSION    ...
  • da5le
  • da5le
  • 2006年10月20日 12:21
  • 1381

ethereal识别不了网卡解决办法

    很久以前,装了个ethereal,自动安装了winpacp,之后因为长时间不用把这个ethreal卸载了,没有卸载winpacp,想想它也没什么用。不知道当时为什么会留下它。今天因为学习需要双...
  • veizz
  • veizz
  • 2010年04月25日 09:36
  • 993

Ethereal的使用解释[转]

Ethereal这个软件我是我接触的第一款抓包软件,当时长沙大学某宿舍区出现大批掉线的情况,校方,锐捷网络,还有我公司工程人员通过该软件的抓包,终于发现某MM机器为毒源,一个8139的网卡,开机1分钟...
  • nihousheng
  • nihousheng
  • 2014年12月23日 00:16
  • 369

ethereal 无法找到网卡问题(no interface )

      这两天想把windows中的sniffer在linux中用起来,在网络上找了一下,发现各方对ethereal的评价较高,就装了.我是用source安装的,在安装的过程中只出现一个问题,是依...
  • BlueCY
  • BlueCY
  • 2009年04月16日 16:41
  • 3907

LUA脚本的作用。

本文的另一个标题我觉得可以叫做《读“游戏人工智能编程案例精粹”的第六章“”的头几个段落有感》。 在第6.1节作者的意思就是 (1)初始化功能(如配置参数之类的)是脚本的最“初级的形式”。就是说lo...
  • unsv29
  • unsv29
  • 2015年12月03日 10:51
  • 1092
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Ethereal 也可以使用lua做一些自定义的功能了--编写lua脚本扩展ethereal的功能
举报原因:
原因补充:

(最多只允许输入30个字)