下面介绍一下具体过程。
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,内容如下:
#!/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分析数据
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