2014-03-07 38 views
1

我在Android上捕获3G上的数据包,并且得到奇怪的输出。我看到了mac地址而不是IP地址,并且不知道如何解码它。当我通过WIFI运行相同的捕获时,我会看到IP地址。它看起来好像需要为3G接口更改链接类型。tcpdump - 通过Android上的3G /移动数据的奇怪输出

目前,我只在数据链接类型列表(tcpdump -L)下看到“EN10MB(以太网)”选项。我在tcpdump网站上看到不同的链接类型(http://www.tcpdump.org/linktypes.html),我想我可能需要重新编译源代码,以便在数据链接类型下获得“LINKTYPE_GPRS_LLC”以获得正确的捕获。

有谁知道如何做到这一点?我有libpcap(v0.9.8)和tcpdump(v3.9.8)(与AOSP 4.2.1源代码一起)的源代码。

谢谢,我真的很期待听到你们。

下面是一个示例输出,我得到了一个捕获了3G接口:

平google.com

tcpdump的-vvvs 0

22:11:51.450906 40:00:40: 11:12:18(oui未知)> 45:00:00:38:66:22(oui未知),ethertype Unknown(0x1528),长度56: 0x0000:4a4b 4201 2107 bad2 0035 0024 5a5e 140c JKB。!。 5。$ Z^.. 0x0010:0100 0001 0000 0000 0000 0667 6f6f 676c ........... googl 0x0020:6503 636f 6d00 0001 0001 e.com .....

22:11:52.363748 00:00:fd:11:0c:9c(oui Unknown)> 45:00:00:e8:ed:ed(oui Unknown),ethertype Unknown(0x4201),length 232:

回答

3

所以,这里就是解决了这个问题。

看起来像我们明确指定接口名称(cdma_rmnet4在我的情况下)或不指定任何接口(在这种情况下它会自动假定接口为cdma_rmnet4),它会给出相同的乱码输出。

但是当我们捕捉到它“ - 我任何”标志,但它捕捉一些“LINUX_SLL”的界面,这给正确的输出。我GOOGLE了它,结果发现,LINUX_SLL是在Linux通过libpcap的熟模式捕获从“任何”设备来捕捉并捕获在某些设备,其中本地链路层报头不可用或不能被使用,这是这种情况与3G /移动数据包。

2

如果按“目前,我只在数据链接类型列表(tcpdump -L)下看到”EN10MB(以太网)“选项。你的意思是,当你运行tcpdump -L时,这意味着,在你捕获的接口上,唯一的链路层报头类型声称它可以提供以太网报头。

如果这就是它提供的,tcpdump应该报告正确的数据包数据。

如果这就是它的供应,然后在Linux版本的驱动程序或网络协议栈内核你的手机/平板电脑的运行被打破 - 它提供了错误的ARPHRD_值libpcap的,然后通过该躺在tcpdump或任何其他程序使用libpcap。

解决此问题的最佳方法是修复驱动程序或任何提供的内容ARPHRD_ETHER。不幸的是,快速浏览3.11内核的include/uapi/linux/if_arp.h并没有显示一个ARPHRD_的值,这看起来是为了这个。

但是请注意,这是一定LINKTYPE_GPRS_LLC!该值为用于GPRS LLC帧的值,如3GPP TS 04.64中所述;那些可以封装子网相关收敛协议帧,可以封装IP帧(至少根据GPRS LLC帧的Wireshark解析器),但Android可能使用了一些完全不同的链路层头。 GPRS是不是的3G服务;我认为3G数据使用不同的链路层。

tcpdump的不知道如何解剖GPRS LLC帧,所以,IF这就是驱动程序提供,这不会改变没有帮助和tcpdump了解GPRS LLC和子网相关收敛协议。

快速浏览一下tcpdump的输出,并在this similar Wireshark question,表明链路层类型可能是LINKTYPE_RAW - 以太网帧的第一个字节是目标地址的第一个字节,所以看来的第一个字节这些帧是0x45,这也是没有选项的IPv4帧的第一个字节将具有的值(IP版本4,标头长度5 32位字或20字节)。

尝试一下tcpdump的一个版本,该版本将DLT_EN10MB视为DLT_RAW;如果它适用于3G接口,则需要更改驱动程序或网络堆栈以向libpcap提供ARPHRD_NONE,或者libpcap需要查看设备名称,并且针对Android设备或地图ARPHRD_ETHERDLT_RAW需要查看而不是DLT_EN10MB。您要捕获的设备的名称是什么,即-i标志的参数?如果您没有将参数传递给-i,Android上的ifconfig -a的输出是什么?

+0

感谢哈里斯。感谢你的帮助。我发现问题是什么。 –

+0

问题是,我记得,有些守护进程(DHCP守护进程)要求该接口具有链路层包头类型,如'ARPHRD_ETHERNET',他们(无论是谷歌的人或负责的Android移植到人你的手机)提供了一个非ARPHRD_'类型而非'ARPHRD_NONE'的非以太网接口,因此完全占用了libpcap。我想我们必须把一些废话放进libpcap来解决这个问题,叹气。 (Linux +网络+ libpcap =痛苦。) – 2014-03-21 02:10:06

+0

现在将垃圾扔进libpcap存储库的主干中。 – 2014-03-21 18:11:38