1、目的:解析rssp2协议

 
2、如何使用wireshark lua插件

  将编写的(假设为rssp2.lua)lua文本,放入wireshark 安装目录下,放哪里都行只要dofile添加了路径.

并且在安装目录下找到init.lua,最后一行添加路径代码 :

dofile(DATA_DIR.."RSSP2.lua") 

 
3、介绍

  解析由rssp2.lua、p2_data.lua、p2_parse.lua3个文件组成。如果协议内容很少,一个lua文件就能完全解决.init.lua会调用rssp.lua,rssp2.lua会加载p2_data.lua、p2_parse.lua文件.解析器dissectors介绍可以参照官网:https://wiki.wireshark.org/Lua/Dissectors

  • 必须注册为句柄
  • 解析函数必须设置为 Proto对象
  • call wireshark时可通过 TVB buffer(TVB object) ORZ a packet information record(pinfo object:) ORZ a tree root(TreeItem object)
  • 只有当包与解析表匹配,或者用户强制“decode as”,才能解析
4、dofile、require用法
  • 加载一个lua文件时require会先在package.load中查找此模块是否存在,如果存在,直接返回模块。如果不存在加载此模块文件。

  @require仅加载一次,对于模块会按照特定的搜索规则查找文件加载。 在rssp2.lua先添加路径:

      package.path = "D:/professional program/WireShark/plugins/?.lua;;"

  require("data") 那么加载路径
  D:/professional program/WireShark/plugins/data/lua
  • dofile和loadfile区别;dofile:读入代码文件并编译执行。每调用一次dofile都会重新编译执行一次。loadfile:编译代码,将整个模块文件当成一个函数返回,但是不执行代码。dofile是对loadfile的一次包装。dofile使用:

  dofile("D:/professionalprogram/WireShark/plugins/data.lua")

5、wireshark 库函数
  • package.path = "D:/professional program/WireShark/plugins/?.lua;;"
          添加路径package.path
  • require("p2_data")

这里面是要用到的全部解析全局变量,函数没有放里面

  • func = dofile("D:/professional program/WireShark/plugins/p2_parse.lua")

         func返回了rssp2.lua需要调用的所有函数

  • self_rssp2 = Proto ("RSSP2","RSSP2_Protocol")

注册协议,函数Proto

  • f_usALELen = ProtoField.uint16("rssp2.len", "Length", base.DEC)
ProtoField.uint16解析2字节的f_usALELen字段,Length在wireshark中显示名称,base.DE 十进制显示

  • f_usRole = ProtoField.uint8("rssp2.Role", "Role", base.HEX, { [0x10] = "Client", [0x11] = "Server"})
          还可以是这样的,不仅显示值 [0x10] = "Client",还显示含义.
  • self_rssp2.fields = {f_usALELen, f_usALEVer, f_usAPPType, f_usSequen, f_usNRFlag}
          最终将所有需要解析的字段添加到field中,如果只是定义了这个字段,而不添加到这里是解析不了的.
  • function self_rssp2.dissector(buffer,pinfo,tree)
可以把函数dissector理解为我们编写脚本的主函数,入口函数。形参是数据帧buffer,消息pinfo和 wireshark上层已经解析的tree
  • pinfo.cols.protocol:set("RSSP-II")
         在wireshark protocol列显示“RSSP-II”协议字符串
         同理pinfo.cols.info:set("Invalid Msg")
         在info中显示"Invalid Msg"

  • local RSSP2Tree = tree:add(self_rssp2, buffer(offset, buffer_len),
    "RSSP-II Msg Structure")
添加自己的tree,"RSSP-II Msg
Structure",然后就可以解析在这个tree下面的字段
RSSP2Tree 下面又有ALE_tree.
local ALE_tree = RSSP2Tree:add(self_rssp2,buffer(offset, 10),"ALE
Layer")
  • local usMsgLen = buffer(offset,2):le_uint()
offset是自己定义的局部变量,帧的偏移量,表示解析到offset字节数了.offset后面两个字节转化成无符号 32进制赋值给变量usMsgLen 
  • ALE_tree:add(f_usALELen, buffer(offset,2))
ALE_tree下面解析f_usALELen字段,该字段在帧的offset位置起始的后面两个字节
  • local tcp_port_table = DissectorTable.get("tcp.port")
将该解析函数添加到tcp_port_table ,这一步是必须的
  • tcp_port_table:add(60005, self_rssp2)
该帧是通过60005端口采集,这个打开wireshark满足帧条件,就能自动解析.
 
实在不懂,可以到github中搜关键字“wireshark
lua”,有很多人的lua代码
 
6、注意

  @不同于其他语言的数组把0作为数组的初始索引,Lua里表的默认初始索引一般从1开始

  @在Lua中0为true

  @~= 不等于

 
7、wireshark中tcp帧格式
  # wireshark
数据解析格式#
  0000   70 ba ef 56 e7 cb dc 49 c9 01 01 96 08 00| 45 00
  0010   00 28 bf 8f 00 00 40 06 a0 d8 0a 41 01 18 0a 02
  0020   05 0e| ea 65 40 19 ca b2 10
  0030   c3 ae 00 00 00 00 00 00
  分隔符| 分隔 数据链路层 网络层传输层
 
参考文档:
http://manual.luaer.cn/  lua在线手册
http://blog.csdn.net/leecrest/article/details/31742419 讲得比较透彻#require
、dofile区别#

wireshark lua脚本的更多相关文章

  1. Wireshark lua dissector 对TCP消息包合并分析

    应用程序发送的数据报都是流式的,IP不保证同一个一个应用数据包会被抓包后在同一个IP数据包中,因此对于使用自制dissector的时候需要考虑这种情况. Lua Dissector相关资料可以见:ht ...

  2. lua脚本简介

    Lua [1]  是一个小巧的脚本语言.它是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个由Roberto Ier ...

  3. 在redis中使用lua脚本让你的灵活性提高5个逼格

    在redis的官网上洋洋洒洒的大概提供了200多个命令,貌似看起来很多,但是这些都是别人预先给你定义好的,但你却不能按照自己的意图进行定制, 所以是不是感觉自己还是有一种被束缚的感觉,有这个感觉就对了 ...

  4. 《转》Unity3D研究院编辑器之创建Lua脚本模板

    Unity里能创建 c#脚本模板,但是如果我想创建Lua脚本模板怎么办呢?拓展一下编辑器吧. 设置一下Lua脚本的模板地址 :  Assets/Editor/Lua/Template/lua.lua ...

  5. StackExchange.Redis加载Lua脚本进行模糊查询的批量删除和修改

    前言 使用StackExchange.Redis没有直接相关的方法进行模糊查询的批量删除和修改操作,虽然可以通过Scan相关的方法进行模糊查询,例如:HashScan("hashkey&qu ...

  6. 使用Lua脚本语言开发出高扩展性的系统,AgileEAS.NET SOA中间件Lua脚本引擎介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  7. redisTemplate的spring配置以及lua脚本驱动

    最近在使用spring-data-redis的redisTemplate,所以写篇使用记录吧. 1.不用多说,使用maven引入相关依赖,因为项目已经引入其他的 <dependency> ...

  8. redis原子性读写操作之LUA脚本和watch机制

    最近在开发电商平台的子系统--储值卡系统,系统核心业务涉及到金额消费以及库存控制,因此为了解决建立在内存上高并发情况下的事务控制,使用了spring封装的RedisTemplate执行lua脚本进行原 ...

  9. online_jf.lua --累计在线时间领取物品(积分)的lua脚本

    原作者: ayase 8-27修正 修复首次使用后的红字不需要额外进数据库导入计分表,这lua全自动生成 ----------------------------------------------- ...

随机推荐

  1. Activity生命周期

    在开始之前我们先了解一下什么是Activity: 直接翻译为:"活动",而在Android中更多的是代表手机的屏幕,是Android的四大组件之一,重要的组成单元,提供了与用户交互 ...

  2. ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量

    当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使效率大大降低. 加载因 ...

  3. nginx端口占用案例分享

    这里分享一个案例,问题的原因是反向代理使用不当. 现象 首先描述一下问题的现象.当时的问题是应用启动失败,日志里面报错显示端口占用.我们的应用都是通过脚本发布的,之前发布过多次都没有出现过问题.那么同 ...

  4. MVC下压缩输入的HTML内容

    在MVC下如何压缩输出的HTML代码,替换HTML代码中的空白,换行符等字符? 1.首先要了解MVC是如何输出HTML代码到客户端的,先了解下Controller这个类,里面有很多方法,我们需要的主要 ...

  5. 纯js实现10分钟倒计时

    一个简单实现倒计时的小栗子~ 效果图:简陋的不能再简陋了,捂脸 代码: <!DOCTYPE HTML> <html> <head> <title> 倒计 ...

  6. asp.net mvc 之旅 —— 第五站 从源码中分析asp.net mvc 中的TempData

    在mvc的controller中,我们知道有很多的临时变量存放数据,比如说viewData,viewBag,还有一个比较特殊的tempData,关于前两个或许大家都明白, 基本上是一个东西,就是各自的 ...

  7. CSS:@font-face的使用方法

    1.介绍 @font-face是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,我们在Web的开发中使用字体不怕只能使用Web安全字体,你们当 ...

  8. HDOJ 2393. Higher Math

    Higher Math Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  9. Linux下的串口编程及非阻塞模式

    本篇介绍了如何在linux系统下向串口发送数据.包括read的阻塞和非阻塞.以及select方法. 打开串口 在Linux系统下,打开串口是通过使用标准的文件打开函数操作的. #include < ...

  10. [No000094]SVN学习笔记4-版本库概念与部分日常操作

    基本概念 版本库 Subversion 使用集中的数据库,它包含了所有的版本控制文件及其完整历史.这个数据库就是版本库.版本库通常位于运行 Subversion 服务器的文件服务器上,向 Subver ...