1. 程式人生 > >NDK交叉編譯tcpdump實現安卓抓包

NDK交叉編譯tcpdump實現安卓抓包

下面介紹一下具體過程。
1.Git clone libpcap和tcpdump兩個專案。

    git clone https://github.com/the-tcpdump-group/tcpdump.git
    git clone https://github.com/the-tcpdump-group/libpcap.git
2.編譯libpcap:

   (1)進入libpcap目錄,開啟configure。將下面兩端程式碼註釋掉

     #if test -z "$with_pcap" && test "$cross_compiling" = yes; then
     # { { echo "$as_me:$LINENO: error: pcap type not determined when cross-compiling; use --with-pcap=..." >&5
     #echo "$as_me: error: pcap type not determined when cross-compiling; use --with-pcap=..." >&2;}
     #   { (exit 1); exit 1; }; }
     #fi
   .......
     #   if test $ac_cv_linux_vers = unknown ; then
     #   { { echo "$as_me:$LINENO: error: cannot determine Linux version when cross-compiling" >&5
     #echo "$as_me: error: cannot determine linux version when cross-compiling" >&2;}
     #   { (exit 1); exit 1; }; }
     #   fi

(如果不註釋掉上面兩段程式碼,可能會出現determine linux version when cross-compiling或pcap type not determined when cross-compiling導致無法configure)。

    (2)返回上一目錄,建立compile-pcap.sh,內容如下:

#!/bin/bash

BASEPATH=$(cd `dirname $0`; pwd)
cd libpcap-master

export NDK=/root/Documents/android-ndk-r10e
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt
export PLATFORM=$NDK/platforms/android-8/arch-arm
export PREFIX=$BASEPATH/build/libpcap

build_pcap() {
  ./configure --host=arm-linux \
  CC="$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=$PLATFORM" \
  --prefix=$PREFIX
}

build_pcap

make
make install

cd ..
     (3)然後執行如下命令
chmod +x ./compile-pcap.sh
./compile-pcap.sh

3.編譯tcpdump
   (1)進入tcpdump目錄,開啟configure,將下面一段程式碼註釋掉

     #   if test $ac_cv_linux_vers = unknown ; then
     #   { { echo "$as_me:$LINENO: error: cannot determine linux version when cross-compiling" >&5
     #echo "$as_me: error: cannot determine linux version when cross-compiling" >&2;}
     #   { (exit 1); exit 1; }; }
     #   fi

   (2)返回上一目錄,建立compile-tcpdump.sh,內容如下:

#!/bin/bash

BASEPATH=$(cd `dirname $0`; pwd)
cd tcpdump-master

export NDK=/root/Documents/android-ndk-r10e
export PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt
export PLATFORM=$NDK/platforms/android-8/arch-arm
export PREFIX=$BASEPATH/build/tcpdump
export LIBPCAP=$BASEPATH/build/libpcap

build_tcpdump() {
  ./configure --host=arm-linux \
  --target=arm-linux \
  CC="$PREBUILT/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=$PLATFORM" \
  ac_cv_linux_vers=2 \
  CFLAGS="-I$LIBPCAP/include -pie -fPIE" \
  LDFLAGS="-L$LIBPCAP/lib -pie -fPIE" \
  --prefix=$PREFIX
}

build_tcpdump

make
make install

cd ..
(上面的兩個標準需要加入-pie -fPIE。PIE安全機制從安卓4.1引入,但是Android L之前的系統版本並不會去檢驗可執行檔案是否基於PIE編譯出的。因此不會報錯。但是Android L已經開啟驗證,如果呼叫的可執行檔案不是基於PIE方式編譯的,則無法執行。)

     (3)然後執行如下命令

chmod +x ./compile-tcpdump.sh
./compile-tcpdump.sh

    最終生成tcpdump可執行檔案。

    最新tcpdump可執行檔案下載地址:(Android6.0可用)

    Version: 4.9.0 / 1.8.1
    Release Date: January 18, 2017
    File Size: 2057576

tcpdump抓包的簡單命令

tcpdump 的抓包儲存到檔案的命令引數是-w xxx.cap
抓eth1的包 
tcpdump -i eth1 -w /tmp/xxx.cap 
抓 192.168.1.123的包 
tcpdump -i eth1 host 192.168.1.123 -w /tmp/xxx.cap 
抓192.168.1.123的80埠的包 
tcpdump -i eth1 host 192.168.1.123 and port 80 -w /tmp/xxx.cap 
抓192.168.1.123的icmp的包 
tcpdump -i eth1 host 192.168.1.123 and icmp -w /tmp/xxx.cap 
抓192.168.1.123的80埠和110和25以外的其他埠的包 
tcpdump -i eth1 host 192.168.1.123 and ! port 80 and ! port 25 and ! port 110 -w /tmp/xxx.cap 
抓vlan 1的包 
tcpdump -i eth1 port 80 and vlan 1 -w /tmp/xxx.cap 
抓pppoe的密碼 
tcpdump -i eth1 pppoes -w /tmp/xxx.cap 
以100m大小分割儲存檔案, 超過100m另開一個檔案 -C 100m 
抓10000個包後退出 -c 10000 
後臺抓包, 控制檯退出也不會影響: 
nohup tcpdump -i eth1 port 110 -w /tmp/xxx.cap & 
抓下來的檔案可以直接用ethereal 或者wireshark開啟。

tcpdump抓包使用示例

1、下載並安裝tcpdump請用NDK編譯最新tcpdump,或者從上面的下載地址下載。
安裝tcpdump,命令列模式依次執行:

1

2

3

adb root

adb push tcpdump /data/local/tcpdump

adb shell chmod 6755 /data/local/tcpdump

其中adb push的第一個引數為本地tcpdump的路徑。

2、啟動並執行tcpdump命令列模式執行下面命令:

1

adb shell /data/local/tcpdump -n -s 0

這時在手機上做任何涉及到網路的操作都會在螢幕上打印出來,可以通過ctrl+c停止。

由於命令列最大輸出的限制及螢幕不斷滾動,檢視不方便,我們可以將抓取的網路包儲存到sd卡,如下命令:

1

adb shell /data/local/tcpdump -i any -p -s 0 -w /sdcard/netCapture.pcap

依然通過ctrl+c停止,將檔案拉取到本地PC

1

adb pull /sdcard/netCapture.pcap .

通過–help我們發現tcpdump支援如下引數:
tcpdump [-aAdDeflLnNOpqRStuUvxX] [-c count] [ -C file_size ]
[ -E algo:secret ] [ -F file ] [ -i interface ] [ -M secret ]
[ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ] [ -y datalinktype ] [ -Z user ]
[ expression ]
其中-c表示監控的請求個數;-C表示儲存檔案的最大大小;
-i
表示監控的型別;-s表示抓取的網路請求返回的大小,0表示抓取整個網路包;-w表示抓取的包儲存的檔案路徑,此時不會在標準輸出列印。並且可以新增port引數表示埠。

3、利用wireshark分析資料