如何在Wireshark Lua dissectors中处理横跨字段?
2018-7-6 13:34:20
收藏:0
阅读:88
评论:1
我正在编写针对跨越字节边界的协议的Wireshark Lua dissector:
Octet 0:
bits 0..3:a
bits 4..6:b
bits 7: c
Octet 1:
bits 0..3:x
bits 4..7:y(ls半字节)
Octet 2:
bits 0..3:y(ms半字节)
bits 4..7:z
如何在Lua中管理这些字段?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 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 代码?

这里应该能解决大部分问题。(问题在于
y,因为你指出了最不重要的半字节在低位字节中,而不是在一般情况下可能期望的最重要的半字节中。)local p_foo = Proto("foo", "FOO 协议") local f_foo_a = ProtoField.uint8("foo.a", "A", base.DEC, nil, 0xf0) local f_foo_b = ProtoField.uint8("foo.b", "B", base.DEC, nil, 0x0e) local f_foo_c = ProtoField.uint8("foo.c", "C", base.DEC, nil, 0x01) local f_foo_x = ProtoField.uint8("foo.x", "X", base.DEC, nil, 0xf0) local f_foo_y = ProtoField.uint16("foo.y", "Y", base.DEC, nil, 0x0ff0) local f_foo_z = ProtoField.uint8("foo.z", "Z", base.DEC, nil, 0x0f) p_foo.fields = { f_foo_a, f_foo_b, f_foo_c, f_foo_x, f_foo_y, f_foo_z } function p_foo.dissector(buf, pinfo, tree) local foo_tree = tree:add(p_foo, buf(0,-1)) pinfo.cols.protocol:set("FOO") foo_tree:add(f_foo_a, buf(0, 1)) foo_tree:add(f_foo_b, buf(0, 1)) foo_tree:add(f_foo_c, buf(0, 1)) foo_tree:add(f_foo_x, buf(1, 1)) foo_tree:add(f_foo_y, buf(1, 2)) foo_tree:add(f_foo_z, buf(2, 1)) end -- 注册:TODO如果您确实需要处理
y,则必须进行位交换。也许有一种更优雅的方法,但这是一个解决方案:local p_foo = Proto("foo", "FOO 协议") local f_foo_a = ProtoField.uint8("foo.a", "A", base.DEC, nil, 0xf0) local f_foo_b = ProtoField.uint8("foo.b", "B", base.DEC, nil, 0x0e) local f_foo_c = ProtoField.uint8("foo.c", "C", base.DEC, nil, 0x01) local f_foo_x = ProtoField.uint8("foo.x", "X", base.DEC, nil, 0xf0) local f_foo_y = ProtoField.uint16("foo.y", "Y", base.DEC, nil, 0x0ff0) local f_foo_z = ProtoField.uint8("foo.z", "Z", base.DEC, nil, 0x0f) p_foo.fields = { f_foo_a, f_foo_b, f_foo_c, f_foo_x, f_foo_y, f_foo_z } nib2bin = { [0] = "0000", [1] = "0001", [2] = "0010", [3] = "0011", [4] = "0100", [5] = "0101", [6] = "0110", [7] = "0111", [8] = "1000", [9] = "1001", [10] = "1010", [11] = "1011", [12] = "1100", [13] = "1101", [14] = "1110", [15] = "1111" } function nibble2binary(n) return nib2bin[bit.band(n, 0x0f)] end function p_foo.dissector(buf, pinfo, tree) local foo_tree = tree:add(p_foo, buf(0,-1)) local y_lsn = bit.band(buf(1, 1):uint(), 0x0f) local y_msn = bit.band(buf(2, 1):uint(), 0xf0) local y = bit.bor(y_lsn, y_msn) pinfo.cols.protocol:set("FOO") foo_tree:add(f_foo_a, buf(0, 1)) foo_tree:add(f_foo_b, buf(0, 1)) foo_tree:add(f_foo_c, buf(0, 1)) foo_tree:add(f_foo_x, buf(1, 1)) foo_tree:add(f_foo_y, buf(1, 2)):set_text(".... " .. nibble2binary(bit.rshift(y_msn, 4)) .. " " .. nibble2binary(y_lsn) .. " .... = Y: " .. y) foo_tree:add(f_foo_z, buf(2, 1)) end -- 注册:TODO