如何让wireshark解码任意层的数据

来源:互联网 发布:淘宝购物车需求分析 编辑:程序博客网 时间:2024/05/17 08:13

     前几天,需要解码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接任意层协议的基本方法就是这样。


1 0
原创粉丝点击