创建Wireshark协议分析器

2020-07-17 22:23:16

这篇文章将解释如何使用Lua编程语言在Wireshark中轻松创建协议解析器。当您使用Wireshark还没有解析器的自定义协议时,这会很有用。例如,如果Wireshark看起来像这样,就很难判断数据部分中的各个字节代表什么。Wireshark是用C语言编写的,Wireshark的解析器通常也是用C语言编写的。但是,Wireshark有一个Lua实现,使得不熟悉C的人可以很容易地编写解析器。对于那些不熟悉Lua的人来说,它是一种非常轻量级的编程语言,旨在作为脚本语言在应用程序中实现,以扩展其功能。使用Lua的缺点是,分析器将比用C编写的分析器慢。在我们开始编写分析器之前,让我们先来看一下关于Lua的速成课程。了解这门语言的细节并不重要,但我们必须了解基础知识。Lua速成课程Lua是多范例的,在一定程度上支持过程化风格、函数式编程,还具有一些面向对象的编程特性。它没有开箱即用的类、原型或继承,但它们可以由程序员创建。它是动态键入的。作用域可以是本地的,也可以是全局的。如果不申报就是全球性的。不需要分号。空格并不像在Python中那样重要。以--开头的行是注释。不要使用++或+=。改用i=i+1。条件句中的不相等是~=而不是!=。类型有:字符串、数字、布尔值、nil、函数、userdata、线程、表。Number表示所有数字,包括浮点和整数。布尔人要么是对的,要么是假的。字符串可以是单引号或双引号。您可以忘记线程和用户数据。Nil是非值。变量在被赋予适当的值之前将具有nil值。在条件句中:Nil和False是假的,其余的是假的。Lua有一个名为table的类型,这也是它拥有的唯一数据结构。表实现了关联数组。关联数组既可以按数字编制索引,也可以按其他类型(如字符串)编制索引。它们没有固定的大小,可以动态添加元素。表通常称为对象。它们是这样创建的:new_table={}值的赋值方式如下:new_table[20]=10new_table[“x”]=“test”A.x=10--与a[“x”]=10相同,它们可以有函数,通常非常类似于JavaScript中的对象。条件分支如下所示:如果i==0,则变量=200,否则,如果i==1,则变量=300,否则变量=400结束循环如下:当i<10时,当i=0,10,1时,i=i+1end,则打印(I)end,即i=first,last,Delta。可以使用Break,但不能使用Continue。函数的声明方式如下:function add(arg1,arg2)返回arg1+arg2 end,调用方式如下:local add_number=add(2,3)如果您看到这样调用的函数:a:func1()a.func2(),则函数func1和func2属于table(Object)a。使用冒号是将对象本身作为参数传递给函数的语法优势。这意味着a:func1()类似于a.func1(A)。这才是最重要的。如果您对详细信息感兴趣,可以阅读Lua5.3参考手册。设置如果您进入Help->About Wireshark->Folders,您会找到Wireshark从中读取Lua脚本的所有文件夹。选择Personal Lua Plugins、Global Lua Plugins或Personal Configuration文件夹。例如,Windows上的C:\Program Files\Wireshark\Plugin\2.4.2。启动Wireshark时,该脚本将处于活动状态。您必须在更改脚本后重新启动Wireshark,或者使用Ctrl+Shift+L重新加载所有Lua脚本。我使用的是当前最新版本。我在这里做的事情在早期版本上可能不起作用。这篇文章中要研究的最有趣的协议可能是wireshark还不知道的自定义协议,但我使用过的所有自定义协议都是与工作相关的,我不能在这里发布有关它们的信息。因此,取而代之的是,我们将研究MongoDB有线协议。(Wireshark中已经有一个Mongo解析器,但我不会使用那个。)。根据以上链接的规范,MongoDB有线协议是使用端口号27017的tcp/ip协议。字节排序为小端,这意味着最低有效字节排在第一位。大多数协议都是高字节顺序的。唯一的区别是字节的排序。例如,如果我们有一个int32,字节:004F2311采用大端,那么小端版本将是11234F00。这是编写解析器时必须考虑的问题。在这篇文章中,我将只看一下协议的报头。它看起来是这样的我们可以看到它有四个int32,每个包含4个字节,因为4*8=32。设置样板代码让我们从设置一些需要的样板代码开始