您的位置:首页 > 理论基础 > 计算机网络

NDK交叉编译tcpdump实现安卓抓包

2017-03-27 16:09 489 查看
下面介绍一下具体过程。

1.Git clone libpcap和tcpdump两个项目。

git clone https://github.com/the-tcpdump-group/tcpdump.git[/code] 
git clone https://github.com/the-tcpdump-group/libpcap.git[/code] 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
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: