lua语言学习之自定义wireshark插件来解析自定义协议

  • 关于wireshark这个抓包工具
  • 关于lua
    • 使用lua写wireshark插件
      • wireshark接口文档
  • 如何在wireshark使用自己写的lua脚本
    • 使用教程及完整代码

关于wireshark这个抓包工具

wireshark工具的功能十分强大,它可以抓取你想抓取的主机的所有网络封包。并且对于一般的网络协议,wireshark可以做到自动解析数据。可以用它来干坏事,你也可以用来测试一个你自己封装的网络协议的安全性,再或者测试一个新的协议是否可行等等。剩下的自行百度,本菜鸟也不精通。

关于lua

由于需求,百度第一次发现还有一种叫”撸啊“的语言,不禁让我想起了LOL。(扯远了~) lua是一种用c语言写的轻量级语言,源码好像说只有2.4万行c,安装教程可以百度菜鸟教程。但是当我们在wireshark上使用时是不需要安装环境的,因为wireshark继承了lua的解释器,且给用户留了API供数据包处理。这里有几点要说明的:

  1. lua语言在wireshark上使用时,你的调试过程完全不依赖lua的环境,所以你不需要安装lua的包,只需要wireshark加载你写的name.lua就可以(可以用文本编辑器写,后缀为.lua)。至于怎么加载,请往下翻。
  2. lua语言经过我的苦战之后发现其不足之处–虽然它是用c写的,但是它没有继承c语言的位操作。也就是说没有<< >> || &&等操作。要这个有啥用呢? 首先,如果你想要解析一包网络数据里面的一段信息,一般一包数据的发送都是以大端发送,若涉及8bit以上的包解析,你肯定要用到位运算,故用lua你就要想别的办法解决。
  3. 在wireshark里面的接口和lua的环境没任何关系,你只能用wireshark调试,比较麻烦。
  4. 剩下的基本能百度到

使用lua写wireshark插件

先看代码和解析,然后再去后面看接口相应文档:
首先打开文本编辑器,新建一个(你想写的名字).lua的文件。加入以下代码:

local _808_proto = Proto ("2013","2013","Self-defined Protocol")--以下根据协议定义消息字段--
--标识符
local _808_message_flag_start= ProtoField.uint8("_808_message_flag_start", "start_flag", base.HEX)    --  消息标识符
local _808_message_flag_end = ProtoField.uint8("_808._message_flag_end", "end_flag", base.HEX)
--消息头
local _808_message_id = ProtoField.uint16("_808.messageid", "Message ID", base.HEX)    -- 消息id
local _808_message_property = ProtoField.uint16("_808_message_property", "Message Property", base.HEX) --消息体-- 将字段添加都协议中
_808_proto.fields = {_808_message_flag_start,_808_message_flag_end,_808_message_id,_808_message_property,
}

这段话是创建字段的意思,看下图:


上述代码里出现的变量后面定义的字段名字出现在第一部分红圈里面。然后,怎么让它在后面显示你想解析的字段?继续看下面:

function _808_proto.dissector(tvb, pinfo, treeitem)

这个函数是用来解析报文用的,参数tvb里面放了有用的报文,wireshark自动帮你过滤了tcp/ip报头,tvb从0开始就是你要抓得有用数据。但是tvb并非数组,本菜鸟后来也没有摸清里面的数据结构,反正也不是字符串。解析完成后,用tvb(x,y)的形式取出数据。x指起始位,(从0开始)y指从x起向后几位。
下面贴出部分代码:

function _808_proto.dissector(tvb, pinfo, treeitem)-- 设置一些 UI 上面的信息pinfo.cols.protocol:set("_808")pinfo.cols.info:set("_808 Protocol")    local offset = 0local tvb_len = tvb:len()-- 在上一级解析树上创建 _808 的根节点local _808_tree = treeitem:add(_808_proto, tvb:range(tvb_len))--创建消息标识位树--local Ms_flag_bit=_808_tree:add(_808_proto,"MSG_FLAG_BIT")Ms_flag_bit:add(_808_message_flag_start,tvb(0,1))             --暂不解析--创建消息头树--Ms_head_tree=_808_tree:add(_808_proto,"MSG_HEADER: 0x"..tvb(1,16))   Ms_head_tree:add(_808_message_id,tvb(1,2))       --消息id显示Ms_head_tree:add(_808_message_property,tvb(3,6))   --消息属性显示--消息属性子树local  Ms_end=_808_tree:add(_808_proto,"end_flag")  Ms_end:add(_808_message_flag_end,tvb(tvb_len-1,1))end

wireshark接口文档

这里贴出大佬的网站,下面有中文介绍
链接: https://www.cnblogs.com/zzqcn/p/4827337.html.声明一下,这位老哥的文档对我这个英语菜鸡给了很大帮助,所以帮他打广告,开个传送门在这里。

如何在wireshark使用自己写的lua脚本

既然写了就要用,那么下面介绍如何运行脚本:

  1. 打开Wireshark,点击help -> about Wireshark 看看是否支持lua


2. 然后打开wireshark的安装目录下的init.lua文件(可在安装目录下面搜索),看看如下的值是否为false 是则开启了lua插件。

3. 将上述打开的init.lua文件拉到最后,会看见一个名dofile的函数,如下图:

被马赛克的部分就是你的lua脚本的路径了
在dofile函数里面写上自己将lua插件存放的路径即可,为保证不被转义,最好使用”\”分割。
4.完成上述动作后,重启wireshark即可完成插件的重新加载。若要更改此插件,改完后需重启wireshark或者点击分析->重新加载插件即可。

使用教程及完整代码

教程
打开wireshark,若有错误,会有窗口报错。若无则像下面这样使用:
点击Fliter,输入你定义的协议名字,搜索到后,选择网卡设备,点击1或者start开始抓包,开始后需要光标移动到fliter后回车,过滤生效。然后解析你的数据包。


下面贴出部分源代码,由于涉及保密信息,只能贴应用代码,关于解析数据的代码,有大佬可以讨论一下,毕竟没有移位操作可太难了。

local _808_proto = Proto ("2013","2013","Self-defined Protocol")--以下根据协议定义消息字段--
--标识符
local _808_message_flag_start= ProtoField.uint8("_808_message_flag_start", "start_flag", base.HEX)    --  消息标识符
local _808_message_flag_end = ProtoField.uint8("_808._message_flag_end", "end_flag", base.HEX)
--消息头
--local  MSG_HEAD=ProtoField.uint32("_808.MSG_HEAD","MSG_HEAD",)
local _808_message_id = ProtoField.uint16("_808.messageid", "Message ID", base.HEX)    -- 消息id
local _808_message_property = ProtoField.uint16("_808_message_property", "Message Property", base.HEX) --消息体属性---消息体-- 将字段添加都协议中
_808_proto.fields = {_808_message_flag_start,_808_message_flag_end,_808_message_id,_808_message_property,
}function _808_proto.dissector(tvb, pinfo, treeitem)-- 设置一些 UI 上面的信息pinfo.cols.protocol:set("_808")pinfo.cols.info:set("_808 Protocol")local offset = 0local tvb_len = tvb:len()-- 在上一级解析树上创建 _808 的根节点local _808_tree = treeitem:add(_808_proto, tvb:range(tvb_len))--创建消息标识位树--local Ms_flag_bit=_808_tree:add(_808_proto,"MSG_FLAG_BIT")Ms_flag_bit:add(_808_message_flag_start,tvb(0,1))             --暂不解析--创建消息头树--Ms_head_tree=_808_tree:add(_808_proto,"MSG_HEADER: 0x"..tvb(1,16)) Ms_head_tree:add(_808_message_id,tvb(1,2))   Ms_head_tree:add(_808_message_property,tvb(3,6))--消息属性子树local  Ms_end=_808_tree:add(_808_proto,"end_flag") Ms_end:add(_808_message_flag_end,tvb(tvb_len-1,1))end
-- 向 wireshark 注册协议插件被调用的条件
local tcp_port_table = DissectorTable.get("tcp.port")
tcp_port_table:add(8010, _808_proto)

lua语言学习之自定义wireshark插件来解析自定义协议相关推荐

  1. 转 LUA语言学习教程

    转 LUA语言学习教程 写在最前面,为什么要了解LUA语言?因为WOW的宏甚至插件的编写都离不开LUA!功欲擅其事,必先利其器,如果想玩转魔兽世界,而不是被魔兽世界玩的话,先来学习一下LUA语言吧! ...

  2. LUA语言学习教程(转)

    转自:http://www.cnblogs.com/chuncn/archive/2010/07/03/1770464.html 写在最前面,为什么要了解LUA语言?因为WOW的宏甚至插件的编写都离不 ...

  3. 我还是没有忍住,于是乎我开通了lua语言学习专栏!

    前言 北京时间2021年05月22日20点20分(今天周六晚),我还是决定要写一写关于lua语言方面的文章:于是刚好看到新功能有一个专栏,就开通了Lua语言学习专栏:Lua语言从入门到实战. 关于想要 ...

  4. steam饥荒mod编写,基础的lua语言学习笔记——第二期

    今天我们安装lua语言的环境以及配置环境变量.所使用的代码编辑器则是:Notepad++. 所以我们还需要配置使用此编辑器,运行lua程序. (一)首先我们登陆lua官网:https://www.lu ...

  5. 微信小程序自定义组件/插件等解析

    自定义组件 从小程序基础库版本 1.6.3 开始,小程序支持简洁的组件化编程.所有自定义组件相关特性都需要基础库版本 1.6.3 或更高. 开发者可以将页面内的功能模块抽象成自定义组件,以便在不同的页 ...

  6. Lua语言学习-垃圾回收

    菜鸟教程 https://www.runoob.com/lua/lua-garbage-collection.html Lua 采用了自动内存管理,当一个变量不再使用,或者我们在变量不被引用的前提下主 ...

  7. 霖呆呆的六个自定义Webpack插件详解-自定义plugin篇(3)

    霖呆呆的webpack之路-自定义plugin篇 你盼世界,我盼望你无bug.Hello 大家好!我是霖呆呆! 有很多小伙伴在打算学写一个webpack插件的时候,就被官网上那一长条一长条的API给吓 ...

  8. lua菜鸟教程_Lua语言学习

    根据百科描述:Lua是一个小巧的脚本语言,是巴西里约热内卢天主教大学里的一个研究小组,由Roberto Ierusalimschy.Waldemar Celes 和 Luiz Henrique de ...

  9. 【lua语言从青铜到王者】第一篇:lua前世今生

    前言 哈喽,大家好,我是阿沐童鞋!一个喜欢钻研各种新技术的程序员,哎哎呀,就是玩!!! 前两天我开通了lua语言学习专栏,虽然在掘金社区没多少小伙伴看,但是突然在知乎上了推荐,"火" ...

最新文章

  1. [转载]C#中实现强制整除 来源:网络
  2. 太恐怖了,Linux服务器感染了kerberods病毒...
  3. idea会抛出Unable to import maven project: See logs for details错误
  4. android+notepad教程,Android Sample学习——NotePad
  5. 教你10分钟搭建酷炫的个人博客
  6. linux fsck命令,Linux中fsck命令起什么作用呢?
  7. matlab数组补零,fft补零 - 木头弯弯的小窝 - 与非博客 - 与非网
  8. 5G 的 NSA 和 SA,到底是啥?
  9. VB编PiView4注册机
  10. python源码不需要编译成二进制代码_编译 Python 源代码
  11. HTML学习总结(3)——Audio/Video
  12. Linux中使用 if 、for、while等循环来写脚本
  13. mysql 8 my.ini skip_mysql8.0版本skip-grant-tables出现的新问题
  14. php ucfirst,Arale源码解析(3)——Base模块和Aspect模块
  15. 条形码 Ean13 的校验方法
  16. 计算机excel教程ppt,计算机应用基础教程ppt课件 全套450页.ppt
  17. ds18b20驱动程序Linux,基于linux下的ds18b20驱动程序的编写
  18. 4种方法!怎么把电脑上的音频传到苹果手机上?
  19. React-Native 知识点小结
  20. 数据结构详解——最大(小)左倾树

热门文章

  1. Mybatis之分组查询
  2. 共享单车之租赁需求预估第2关:特征工程
  3. 达观数据笔试题目最长子串和去除链表重复元素
  4. Unity2D_鼠标拖动物体移动
  5. 大数据之Flink的看了就可入门
  6. 胶片相机和露天电影存储
  7. iOS 为图片 照片 添加水印 文字及图片
  8. JS实现记录用户在网站的停留时间
  9. chrome(谷歌浏览器) network看不到请求发送出的url信息
  10. [C#]Minecraft启动器制作(KMCC)