自定义解析器,字段根据数据包顺序不同
情况
我正在为一个协议写一个自定义 lua 解析器。我们使用定制硬件捕获协议,从而获得 PCAP 文件。该协议由 64 位数据包组成。
协议具有“开始交易”位,表示 8 个数据包交易的开始,根据交易进展,数据包的某些部分具有不同的含义,例如,在带有开始交易位的数据包中,数据包以头部开头,然后下一个数据包在相同位置包含消息代码。总共有 8 种不同的方式来解释数据包的相同偏移量,具体取决于交易进展。
我想解析该协议,并使字段根据交易进展而变化。
我尝试过的方法
我创建了一个简单的序列计数器变量,在解析器函数之外,如果遇到交易开始位置,则重置它,并向其计数到 8。根据计数器,我选择应添加到树中的 protofields。
这种方法有些可行,如果我选择将所有不同的字段作为列显示,则它们在正确的位置具有正确的值。但是,当我单击数据包时,数据包详细信息显示不正确的字段名称或根本不显示,具体取决于我单击数据包的顺序。例如,如果我单击带有“交易开始”字段的数据包,则数据包信息正确显示数据为“header”。然而,如果我然后单击任何其他数据包,则该字段将显示为“消息代码”。
似乎数据包信息字段中用于解析的顺序并不固定,它使用我单击数据包的顺序,而不是它们被捕获的顺序。
难道 wireshark 甚至适合仅基于其接收到的顺序来解析某个数据包吗?
我曾经遇到过类似的情况。
我的解决方案很简单,就是在解析器函数之外的表格中存储我所需的信息 - 在您的情况下是计数器 - 并使用当前数据包编号(pinfo.number)作为数据的索引。
正如@Christopher Maynard所说,Wireshark将按顺序在第一次遍历时经过数据包。使用这个信息,配合pinfo.visited,将允许你在第一次遍历时存储计数器信息。
有一个小问题。如果在.pcap文件中记录了其他协议,这些协议会显示为表格中的空隙,因为您的解析器只会针对指定的协议进行激活。在遍历表格时插入一个简单的nil检查即可解决此问题。(我不确定这是否会成为你的问题,但我认为值得提出)
附言:我认为Wireshark并不适合根据接收到的顺序来解析数据包,但我们可以让它工作!
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

请注意:以下内容保留原本的 markdown 格式。
Wireshark是否适合仅根据接收顺序分解特定数据包的方式?
Wireshark仅在第一阶段按顺序处理数据包,并且您可以使用
pinfo.visited来判断数据包是否在第一次被分析。第一次分析数据包时pinfo.visited将为false,所有其它时间将为true。但这还不够,您还需要保存数据包的计数器(1-8),以便在下一次解析数据包时知道如何正确解析该特定数据包,而下一次解析可能会在任何时间发生。使用 C 解析器,这通常是使用会话构建实现的,比如
conversation_add_proto_data()和conversation_get_proto_data(),但在这种情况下,我不确定是否这是最好的方法,或者在 Lua 解码器中是否支持。不过,这可能是一个好的起点吧?请查看doc/README.request_response_tracking或 Wireshark Lua Wiki 页面 或在 Wireshark Q&A 站点 上咨询,获取 Wireshark 社区中其它人的可能想法。 (我已经有一段时间没有编写过 Lua 解码器了,我不记得是否有适合您需求的 Lua 方法可用。)