1. 程式人生 > >android基於tcpdump的資料包捕獲完整解決方案

android基於tcpdump的資料包捕獲完整解決方案

如何在Android智慧手機上捕獲資料包?

本文由CSDN-蚍蜉撼青松【主頁:http://blog.csdn.net/howeverpf】原創,轉載請註明出處!

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

一、前期準備

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是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.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"。可能是系統本身不支援吧。