如何让wireshark解码任意层的数据
前几天,需要解码iphone吐出的LTE-RRC数据包,对于协议解码,自然第一想到的是wireshark工具。但是wireshark的解码默认都是需要从其支持的链路层开始解码,否则是不能直接打开LTE-RRC数据包的,即使这个数据包存为了pcap文件格式。这是因为从iphone拿到的lte数据包,是从L3 RRC层开始的,并不包含链路层MAC、RLC等层。而实际上,这种情况是很多的,例如你有时只获
前几天,需要解码iphone吐出的LTE-RRC数据包,对于协议解码,自然第一想到的是wireshark工具。但是wireshark的解码默认都是需要从其支持的链路层开始解码,否则是不能直接打开LTE-RRC数据包的,即使这个数据包存为了pcap文件格式。这是因为从iphone拿到的lte数据包,是从L3 RRC层开始的,并不包含链路层MAC、RLC等层。而实际上,这种情况是很多的,例如你有时只获取了TCP之上HTTP的数据包,没有底层,又想利用wireshark进行内容的详细解析。
那么,有办法不需要从代码上改造wireshark而能达到此功能吗?答案是肯定的。
我们知道,当wireshark读取pcap格式文件时,需要知道数据包的最底层协议类型,于是就从最底层协议开始依次往上层协议进行解码。wireshark支持的链路层协议类型多达上百种(支持的定义在http://www.tcpdump.org/linktypes.html)。而具体数据是那种链路层协议,是在数据捕获生成时就给定了,例如捕获以太网卡,就是以太类型,捕获wlan无线空口数据,就是802.11类型,捕获ss7 64k信令,就有MTP2等。但像LTE-RRC这种层3协议,想交给wireshark解码,保存为pcap文件时,链路层协议应该填多少呢?其实,pcap格式文件的链路层协议值,空出了几个给我们自己定义映射用的。他的范围是147~162(定义为:DLT_USER0 ~USER15)。
例如,这有个LTE-RRC BCCH_DL_SCH的PDU文件lte_rrc.dat(怎么把附件文件贴上来呢?)。需要把它保存为pcap文件,在linux下运行:
od -Ax -tx1 -v lte_rrc.dat | text2pcap -l 147 - lte_rrc.pcap
od命令用来用16进制格式输出数据,导入给text2pcap命令,生成pcap文件。-l 147参数,表示这个pcap数据的链路层协议值为147 (USER0类型)。
但这时候,用wireshark打开lte_rrc.pcap文件,还是不认,因为你并没有告诉wireshark 这个147的数据应该交给lte-rrc去解码。所以,需要对wireshark作配置。
配置步骤如下:
打开wireshark界面的Edit--> preferences-->protocols--> DLT_USER,界面如下:
点击Edit,出现编辑链路层数字对应协议的表。点击New,增加147对应得协议:
确定后,就能看到LTE-RRC的解码了,如何这个RRC数据包,含有LTE的NAS层数据,相应也解码出来了。
对与LTE-RRC数据,在这里存在2个问题:
一就是在增加User DLTs Table时,Payload Protocol协议应该怎么填?具体参考我也没有找到(有知道的请告我),目前,我是从代码中查看到的。在epan/dissector/packet-lte-rrc.c文件中,注册了一些PDU类型的解码,类似于这样:
new_register_dissector("lte-rrc.bcch.bch", dissect_BCCH_BCH_Message_PDU, proto_lte_rrc);
new_register_dissector("lte-rrc.bcch.dl.sch", dissect_BCCH_DL_SCH_Message_PDU, proto_lte_rrc);
new_register_dissector("lte-rrc.mcch", dissect_MCCH_Message_PDU, proto_lte_rrc);
new_register_dissector("lte-rrc.pcch", dissect_PCCH_Message_PDU, proto_lte_rrc);
new_register_dissector("lte-rrc.dl.ccch", dissect_DL_CCCH_Message_PDU, proto_lte_rrc);
new_register_dissector("lte-rrc.dl.dcch", dissect_DL_DCCH_Message_PDU, proto_lte_rrc);
new_register_dissector("lte-rrc.ul.ccch", dissect_UL_CCCH_Message_PDU, proto_lte_rrc);
new_register_dissector("lte-rrc.ul.dcch", dissect_UL_DCCH_Message_PDU, proto_lte_rrc);
new_register_dissector("lte-rrc.ue_cap_info", dissect_UECapabilityInformation_PDU, proto_lte_rrc);
new_register_dissector("lte-rrc.ue_eutra_cap", dissect_lte_rrc_UE_EUTRA_Capability_PDU, proto_lte_rrc);payload protocol里面就应该根据数据是哪种PDU而填这里面的对应某种。
二就是,从手机获取的数据包有很多种PDU,有BCCH_DL_SCH的,有BCCH _BCH的,有DL_CCCH、DL_DCCH 。。。。等等。肯定不能都设置为147,一个pcap文件也不能设置成多种。怎么办?这就需要使用wireshark的命令行程序tshark了,因为命令行程序很方便跟脚本、程序等对接,这个后续再写。
上面只是以LTE-RRC为例来如何配置让wireshark支持解任意层协议的数据。
好了,让wireshark接任意层协议的基本方法就是这样。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)