编写wireshark插件解析自定义协议数据包
wireshark支持大量RFC标准协议,将每类协议解析的非常详细,功能很强大,
但用户自定义的协议,wireshark就无能为力了,只能显示一堆二进制,
导致分析问题,DEBUG时很麻烦,还得自己每个字节,每个Bit的算,
以t1->t2回传数据的DDP协议为例,
DDP协议头部字段的C语言定义如下:
struct ddp_hdr {
unsigned int magic;
#if __BYTE_ORDER == __LITTLE_ENDIAN
unsigned char stream:1;
unsigned char reliable:1;
unsigned char chunk:1;
unsigned char keepalive:1;
unsigned char data_type:3;
unsigned char reserved2:1;
#elif __BYTE_ORDER == __BIG_ENDIAN
unsigned char reserved2:1;
unsigned char data_type:3;
unsigned char keepalive:1;
unsigned char chunk:1;
unsigned char reliable:1;
unsigned char stream:1;
#else
# error "Please fix <bits/endian.h>"
#endif
};
OK,编写wireshark插件第一步:
wireshark官方文档很详细,详见: https://www.wireshark.org/docs/wsdg_html
仔细阅读肯定能写出一个插件来。
但回想我们第一次写C语言时,没人会先看C99规范吧,那会打击绝大部分人的学习兴趣,而是先写个”hello, world”。
不管会不会写C代码,先看运行效果再说,
我也先给出一个wireshark-plug版的hello-world:
先打开下面这个pcap包,看一下默认情况下,wireshark解析DDP是什么样:
因为是私有协议,默认情况下, wireshark肯定解析不出来,显示一堆二进制:
然后,将下面这个脚本文件mesa_lab_ddp_example.lua,存储于本机wireshark的安装目录/plugins/2.2.1下;
(可能实际版本有差别,不一定是2.2.1)
再用wireshark打开看看:
这样DEBUG起来方便多了吧!
Lua脚本主要步骤和语句我做了注释,我想大家即便看不懂某行具体代码,照猫画虎、照葫芦画瓢,也能写出其他自定义协议的插件了。
这篇简短小文只负责带领大家尽快的从0到1,更复杂的功能还是要自己去看官方文档深入学习吧。