wireshark数据包时间戳修改
1、数据包格式
两种数据包格式,pcap和pcapng两种。pcapng为升级版,时间戳细粒度更高。
2、时间戳位置(arrival time)
时间戳在数据包中表现为物理层的arrival time
a、pcap格式
打开包找到arrival time下面的Epoch Time根据时间戳计算十六进制(在线工具:https://tool.oschina.net/hexconvert/),打开二进制工具搜索十六进制直接修改。数据包中每帧都包含有一个时间戳,且不在包本身的内容里,需要查看二进制数据才能找到。
b、pcapng格式
pcapng格式修改时间较为复杂,需要通过复杂的计算出对应的时间。可以使用010 editer的格式工具查看pcapng包能够读到时间戳如下:
时间是根据Timestamp (High) 和 Timestamp (Low)计算出的,计算公式(算法内容pcapng文档有解释说明)取自010的模版:
local uint8 tsresol_base = 10; // 10 or 2 local uint8 tsresol = 6; local int64 tsoffset = 0; local double tsscale = Pow(tsresol_base, -tsresol); string Read_TimeStamp(TimeStamp &ts) { local string res; local double seconds = (((int64)ts.timestamp_high * (int64)0xFFFFFFFF + ts.timestamp_low) + tsoffset) * tsscale; local time_t timet = (time_t) seconds; local double rem = seconds - (uint32)timet; // NOTE: This is fragile. TimeToString wants time_t which is 32 bits SPrintf(res, "%s + %.9lf UTC", TimeTToString(timet, "yyyy-MM-dd hh:mm:ss"), rem); return res; }
读取方法为找到8位时间戳,分前后4位后分别以小端存储方式读取。
定位到算法后还是不明白为什么时间戳在新版的数据包中要使用如此复杂的方式进行计算存储,希望看到的前辈给予指导。
格式参考文档:https://pcapng.github.io/pcapng/