2014-03-07 63 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