Lua wireshark dissector 提取 OLE 自动化格式的时间戳

参考: 在 Lua 中使用 OLE 自动化日期

我正在用 LUA 写一个简单的 UDP 解析器来解码包含以 OLE 自动化日期编码的时间戳的数据包。编码结果为一个 8 字节的数据模式:

C2 F5 4F 12 FD 6B E5 40

解码结果为 43871.90848539352 = '2020 年 2 月 10 日 21:48:13'。在 C# .NET 中,这是通过 DateTime.ToOADate() 方法完成的(这个方法工作得很好)。

这是我的简化解析器,它“解码”仅包含时间戳的 8 字节消息:

local logger_proto = Proto("logger", "LOGGER")
local logger_hdr={
    atime = ProtoField.absolute_time("test.atime","test atime",base.UTC),
    rtime = ProtoField.relative_time("test.rtime","test rtime",base.UTC),
}
logger_proto.fields=logger_hdr

function logger_proto.init() end

function logger_proto.dissector(tvbuf, pktinfo, root)
    root:add(logger_hdr.atime,tvbuf:range(0,8))
    root:add(logger_hdr.atime,tvbuf:range(8,8))
end

在测试数据包中,我发送了两次时间戳,第二次是以相反顺序的字节进行测试,以测试端点问题(这是“抓虫”的做法)。数据包数据为:

C2 F5 4F 12 FD 6B E5 40 40 E5 6B FD 12 4F F5 C2

检索到的两个时间戳为:

2073  8  25  03:14:26.-4360608 UTC
2004  7  2  14:06:53.307230146 UTC

“正确”的时间戳应该是

2020  2  10  21:48:13 UTC

看起来 ProtoField.absolute_time 和 base.UTC 搭配使用并不完全是我想要的。所以我的问题是:

  1. 是否有 ProtoField 选项可以正确提取此时间戳,以不包括小数秒的格式?
  2. 如果没有,我应该如何按字节提取日期/时间并进行计算以手动格式化正确的日期时间?
点赞