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 4.9.0


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分析数据

wireshark下载地址,中文版地址:http://www.onlinedown.net/softdown/2883_2.htm,英文版地址(需要翻墙)http://www.wireshark.org/download.html

wireshark打开capture.pcap即可分析log
关于wireshark具体可见:http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html


猜你喜欢

转载自blog.csdn.net/xuqiqiang1993/article/details/66972221