Lua解剖器用于自定义协议。
2015-8-12 11:8:24
收藏:0
阅读:74
评论:1
我编写了几个 Lua Dissectors 来解析我们使用的自定义协议,它们工作得很好。为了发现丢失数据包的问题,我需要检查自定义协议的序列号是否与旧数据包匹配。 设备 A 到设备 B 的 IP 源地址和目的地址始终相同。 在此数据包中,我们有一个自定义 ID。 每个 ID 都有一个序列号,所以设备 B 可以确定数据包是否丢失。序列号每 256 个递增一次,并在达到 65k 时回滚。 我尝试使用全局字典,但当您在跟踪中向上或向下滚动时,解码器会重新运行并更改值。 几行以下显示了信息存储的位置。
ID = buffer(0,6):bitfield(12,12)
SeqNum = buffer(0,6):bitfield(32,16)
理想情况下,我想列出每个已解码帧的列表,如果上一个序列号相差大于 256,则在其中列出,并生成一个表格列出所有这些不良帧。
源IP;目的IP;ID;序列号
1 10.12.1.2; 10.12.1.3; 10; 0
2 10.12.1.2; 10.12.1.3; 11; 0
3 10.12.1.2; 10.12.1.3; 12; 0
4 10.12.1.2; 10.12.1.3; 11; 255
5 10.12.1.2; 10.12.1.3; 12; 255
6 10.12.1.2; 10.12.1.3; 10; 511 如果重要的序列号 255 丢失,则为带有序号 255 的数据包
我现在成功地让解析器通过使用全局数组来检查当前数据包与先前数据包的匹配性,在其中存储有关每个帧的特定信息。在分析的当前数据包中,我重新检查最近的数据包,并从末尾开始向前找到适当的数据包。
dict[pinfo.number] = {frame = pinfo.number, dID = ID, dSEQNUM = SeqNum}
local frameCount = 0
local frameFound = false
while frameFound == false do
if pinfo.number > frameCount then
frameCount = frameCount + 1
if dict[(pinfo.number - frameCount)] ~= nil then
if dict[(pinfo.number - frameCount)].dID == dict[pinfo.number].dID then
seq_difference = (dict[(pinfo.number)].dSEQNUM - dict[(pinfo.number - frameCount)].dSEQNUM)
if seq_difference > 256 then
pinfo.cols.info = string.format('ID-%d SeqNum-%d missing packet(s) %d last frame %d ', ID,SeqNum, seq_difference, dict[(pinfo.number - frameCount)].frame)
end
frameFound = true
end
end
else
frameFound = true
end
end
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
我不确定我看到了需要回答的问题?如果你的问题是“我该如何避免重复调用分析器并损坏前面解码的值”,那么答案就是使用
pinfo.visited布尔值。对于特定数据包第一次分析时,它将为false,在此之后无论用户点击多少次,它都将为true- 直到重新加载文件或加载新的文件。为了处理重新加载/新文件情况,您需要将
init()函数调用挂钩到您的协议中,通过定义一个function myproto.init()函数,并在其中清除您的整个数组表。此外,你可能想要查询有关 ask.wireshark.org 上的相关问题/答案,因为该网站更常被用于 wireshark Lua API 问题。例如,这个问题/答案 与你的情况类似并相关。