如何在Android智能手機上捕獲數據包

出處: http://www.cnblogs.com/anee/archive/2013/09/12/3316139.html

        當前Android系統越來越流行,無論是對於安卓應用的開發人員,還是對於網絡安全的研究人員,都有可能需要掌握捕獲Android應用通信數據包的方法。根據技術手段不同,常用的抓包方法分兩類,一類是通過Androidf智能移動終端所接入的上層網絡設備或線路獲取數據流,另一類則是直接在Android移動終端上監聽數據流。本文主要探討第二類方法,下面分別就前期準備、一般步驟、常見問題、擴展說明四方面詳談。(由於本人使用的是Android手機,所以後文在描述的時候都說的是Android手機,但其實本文所說的內容是Android移動終端基本都可以通用的)

        所謂學以致用,建議大家看了本文之後還是能實際選擇一個安卓應用分析一下。我本人利用本文所說的抓包技術實際分析了百度貼吧安卓客戶端的網絡通信行爲,分析結果參見我的上一篇博文《百度貼吧客戶端(Android)網絡通信行爲分析》,也可直接下載PDF版的完整分析報告,地址是:http://download.csdn.net/detail/ping_fani07/6028411

 

一、前期準備

1.1 爲Android手機的Root權限解鎖

        Root是Android手機系統中的超級管理員賬戶,Root權限(即底層權限)和我們在Windows系統下的Administrator權限類似。默認狀態下,爲了防止系統文件被更改,Android系統並沒有把Root賬戶開放給我們普通用戶,我們必須先爲Root權限解鎖才能獲取Root權限。網上一般把Android手機的Root權限是否解鎖,簡稱爲Android手機是否root過。

        這些年網上涌現了大量手機root工具,使用你自己的手機型號搜,應該能找到合適你的工具。作爲一個華爲黨,俺最後使用了刷機精靈,兩次之後成功解鎖Root權限。解鎖成功後,刷機精靈會在手機上安裝一個授權管理工具,以幫助咱們管理哪些應用和程序可以獲取Root授權。最新版的授權管理工具還自帶了一個工具箱,可以自由卸載手機上的預裝軟件和系統軟件,很省心,很方便!刷機精靈使用教程參照:《手機root權限獲取方法:[4]刷機精靈》。

1.2 下載相關工具

        要用到的工具主要有兩個,tcpdump(Android版) 和 adb 。打包下載地址爲:http://download.csdn.net/detail/ping_fani07/6218853

        tcpdump是Linux系統中普遍使用的一款開源網絡協議分析工具,使用方法詳參:《Tcpdump的詳細用法》。

        adb是谷歌提供的安卓遠程調試工具,應該使用方法詳參:《ADB命令介紹》。如果你前面使用了刷機精靈爲手機的Root權限解鎖,那麼可以在刷機精靈的實用工具裏找到Adb命令行,直接調用此工具,而無需專門下載;又或者你以前搭建過安卓開發環境,那麼應該也可以在***\platform-tools目錄下找到該工具。 

 

二、一般步驟

        爲了讓大家看起來方便,我先把所有步驟拉通放在一張圖上,給大家一個直觀的印象,如圖2-0。(考慮到通用性,在上傳tcpdump前修改了手機上目的目錄權限,部分手機不用。)

pic 2-0

圖2-0 在某手機上第一次抓包完整過程

下面是分步解說,其中有些步驟是僅在第一次使用的時候才需要,用【僅需第一次】標註(也就是圖2-0中用白色方框圈起來的部分)。

  • (1)將 adb.exe 放在合適的目錄下,並將該目錄的完整路徑添加到Windows的 PATH 環境變量中。【僅需第一次】【已經搭建過安卓開發環境則不需要此步】
  • (2)打開windows命令提示符窗口,輸入命令: adb version ,如果正常顯示adb的版本,則說明上一步環境變量設置沒有問題,且adb.exe本身完整,如圖2-1;反之,則可能是adb.exe本身文件損壞,環境變量設置有誤,或者環境變量設置後尚未生效,請自行檢查。【僅需第一次】

pic 2-1

圖2-1 檢查adb工具是否正常可用

  • (3)勾選Android手機的"USB調試",將Android手機與電腦USB相連,在命令提示符窗口輸入命令: adb devices ,若正常顯示所連接手機的設備號,則說明連接成功,如圖2-2。(注:有些手機的設備號可能讀取有問題,顯示的是一個問號,這也是可以的,並不會影響後面的操作)

pic 2-2

圖2-2 查看PC與安卓手機是否連接成功

  • (4)將 tcpdump (for Android)上傳至Android手機上,在命令提示符窗口中輸入命令:adb push  <LocalPath of tcpdump>   /data/local/tcpdump,如圖2-3。【僅需第一次】

pic 2-3

圖2-3 上傳tcpdump

  • (5)給 tcpdump 增加可執行權限,如圖2-4。【僅需第一次】
    • 在命令提示符窗口中使用命令 adb shell 遠程打開Android手機上的終端Shell;
    • 在當前Shell中使用su命令獲取管理員權限;
    • 在當前Shell中使用 chmod 命令修改 tcpdump 的權限。

pic 2-4

圖2-4 修改 tcpdump 的權限

  • (6)使用 tcpdump 抓包,並將結果寫入一個pcap文件保存,如圖2-5。
    • 在命令提示符窗口中使用命令 adb shell 遠程打開Android手機上的終端Shell;
    • 在當前Shell中使用 su 命令獲取管理員權限;
    • 在當前Shell中輸入命令: /data/local/tcpdump -p -s 0 -w /sdcard/001.pcap
    • 在Android手機上進行相關操作,產生通信數據包,通信行爲完成後在命令提示符窗口中使用 Ctrl + C 組合鍵退出當前Shell,以停止抓包。

pic 2-5

圖2-5 抓包過程 

上述過程中,tcpdump命令的參數含義如下:
  # "-p": disable promiscuous mode (不使用混雜模式)
  # "-s 0": capture the entire packet(-s參數用以指定數據包捕獲長度,此處指定爲0,意爲抓取完整的數據包)
  # "-w *.pcap": write packets to a file (將結果寫入一個pcap文件,而不在終端上直接顯示)

  • (7)將抓包結果下載到本地PC上。在命令提示符窗口中使用命令:adb pull /sdcard/001.pcap <LocalPath of PcapFile >,如圖2-6。

pic 2-6

圖2-6 下載抓包結果到本地

  • (8)使用Wireshark等協議分析工具查看抓包結果。

 

三、常見問題的解決

3.1 部分手機使用adb的push命令上傳tcpdump失敗

提示信息:"failed to copy 'd:/tcpdump' to '/data/local/tcpdump': Permission denied";

出錯原因:該Android手機上的目的目錄沒有寫權限;

解決方法:給Android手機上的目的目錄/data/local增加寫權限,步驟如圖4-1;

pic 4-1

圖4-1 給/data/local目錄增加寫權限

3.2 部分手機使用chmod命令改變文件或目錄的權限時失敗

提示信息:"Read-only file system";

出錯原因:從字面上理解,就是說文件系統是隻讀的,不允許改權限;【好像是在同學的小米手機上遇到的這個問題】

解決方法:重新掛載根目錄,並在掛載的時候指定爲可讀寫。步驟如下,

  • 在命令提示符窗口中使用命令 adb shell 遠程打開Android手機上的終端Shell;
  • 在當前Shell中使用 su 命令獲取管理員權限;
  • 在當前Shell中輸入命令: mount -o remount,rw / 。之後再使用chmod命令應該就沒問題了。

 

四、擴展與說明

4.1 上傳tcpdump到Android手機的時候,是否一定要選擇/data/local目錄

        應該不是唯一的選擇,但是我試過上傳到一些其他的目錄/sdcard等,會遇到更多的權限限制問題。所以出於方便的考量,建議還是都儘量固定傳往/data/local目錄。

4.2 使用終端模擬器代替adb工具的shell命令

        終端模擬器是一款Android平臺上的Linux Shell工具,相當於Windows中的CMD命令提示符,有了它,我們可以在Android上進行Linux系統的命令操作。

        通過前面的描述,我們可以看出,adb工具在這主要起到兩個作用,一是基於push、pull命令的文件上傳下載(本地PC與Android手機之間的文件交換);二是基於shell命令對Android內置Linux命令行Shell的遠程訪問(通過Android內置Shell來執行su、chmod、tcpdump等命令或程序)。其中第二個功能可以使用終端模擬器代替。例如圖3-1

pic 3-1

圖3-1 使用終端模擬器執行系統命令

4.3 使用USB文件傳輸功能代替adb工具的pull命令

        我們前面在運行tcpdump時,使用-w參數指定了抓包結果的文件保存路徑在/sdcard目錄下。/sdcard目錄對應安卓手機的內部存儲空間,也就是我們手機插上USB線,選擇“打開USB存儲設備”後,用Windows的資源管理器打開所看到的根目錄,如圖3-2。因此我們可以用USB連接手機後,像訪問U盤一般直接獲取我們前面抓包生成的001.pcap文件。

pic 3-2

圖3-2 /sdcard目錄對應PC上可見的手機內部存儲空間的根目錄

4.4 chmod命令中3位(或4位)八進制數字所代表含義的說明

        那些八進制數字對應着我們要爲目標文件/目錄設定的權限。先說3位的情況,假使我們將三位八進制數分別看做a,b,c的話,那麼a,b,c分別表示User(該檔案的屬主)、Group(與該檔案的屬主屬於同一個組的用戶)、及Other(其他用戶)的權限。

        八進制的a/b/c可以轉成3位二進制數,這三位數的取值從高到低分別對應是否具有執行權限。對應位置1,則有相應權限;反之若置0,則無相應權限。例如:

  • 777 [111,111,111],所有用戶均有讀、寫、執行權限;
  • 700 [111,000,000],只有檔案的所有者擁有讀、寫、執行權限,其他用戶無權限;
  • 644 [110,100,100],只有檔案的所有者擁有讀、寫權限,其他用戶只有讀權限。

        回看前文,我們在修改 /data/local 權限時設置爲777,算是最簡單方便,但也是最不安全的該法。可以根據此處的介紹,你可以自行計算權限值該設爲多少纔是最科學的。

        至於4位八進制數,則是在3位八進制數的最左邊加上1位八進制數來設置特殊屬性,該特殊位默認取0。詳參:《linux系統中 chmod nnnn file 命令中的n 怎麼是四位啊不是三位嗎?

4.5 chmod命令中用數字表示的權限值是否可用文本字符串代替

        在Linux下工作過的童鞋應該知道,chmod命令中的權限值除了可以用上文所述3位/4位八進制數表示以外,也可以用形如: [ugoa...][[+-=][rwxX]...] 形式的字符串表示,如下:【以下例子取自博文《chmod 命令詳解》,謝謝該文博主lyg105504(林榆耿)】

  • 例1.以下兩條命令作用相同,都是給FileName的屬主分配讀、寫、執行的權限,給FileName的屬主所在組分配讀、執行權限,給其他用戶僅分配執行權限

# chmod 751 FileName

# chmod u=rwx,g=rx,o=x FileName

  • 例2.以下三條命令作用相同,都是爲所有用戶僅分配讀權限

# chmod 444 FileName

# chmod =r FileName

# chmod a-wx,a+r FileName

        那麼在Android系統中是否可用文本字符串形式的代替八進制數形式的權限值呢?以我實驗的結果來看,是不可以的,系統給的錯誤提示是:"Bad mode"。可能是系統本身不支持吧。

 

 

REFERENCES:http://blog.csdn.net/howeverpf/article/details/10517351


---------------------------------------------------------------------------------------------------------------------------------
copyright:http://www.cnblogs.com/anee/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章