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.git2.編譯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,內容如下:
(3)然後執行如下命令#!/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 ..
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分析資料