Android 抓包并通过 Wireshark 分析
- 分析 Android 中 app 的网络数据交互,需要在 Android 上抓包,常用工具为 tcpdump ,用 tcpdump 生成 Wireshark 识别的 pcap 文件,把 pcap 文件从手机上拷贝到电脑上,Wireshark 加载 pcap 文件,通过 Wireshark 分析 tcpdump 抓取的数据
tcpdump 安装
- 手机需要 root
- 下载 Android tcpdump
- 使用 adb 命令把 tcpdump 放入到手机中
adb push tcpdump /sdcard/
adb shell su cat /sdcard/tcpdump > /system/bin/tcpdump - 当提示没有权限时,输入
monut - 在结果中找到包含 /system 的一行,类似:
/dev/block/bootdevice/by-name/system /system ext4 rw,seclabel,relatime,data=ordered 0 0 - 执行如下命令
mount -o remount /dev/block/bootdevice/by-name/system - 这时 /system 拥有写权限,继续执行
cat /system/tcpdump > /system/bin/tcpdump
chmod 777 /system/bin/tcpdump - 这样 tcpdump 就成功安装到了 /system/bin 目录下
使用 tcpdump 抓包
-
使用 tcpdump 抓包。
tcpdump -i any -p -s 0 -w /sdcard/capture.pcap
命令参数:
# "-i any": listen on any network interface # "-p": disable promiscuous mode (doesn't work anyway) # "-s 0": capture the entire packet # "-w": write packets to a file (rather than printing to stdout)
可以结束时使用 Ctrl+C 让 tcpdump 结束抓包,抓到的数据会保存到 /sdcard/capture.pcap
-
通过 adb pull 命令拿到 pcap 文件,
adb pull /sdcard/capture.pcap .
-
使用 Wireshark 打开 pcap 文件,分析 log
tcpdump 语法
tcpdump [ -AdDefIKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ]
[ -C file_size ] [ -G rotate_seconds ] [ -F file ]
[ -i interface ] [ -m module ] [ -M secret ]
[ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ]
[ -E spi@ipaddr algo:secret,... ]
[ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
[ expression ]
-
类型的关键字
host(缺省类型): 指明一台主机,如:host 210.27.48.2
net: 指明一个网络地址,如:net 202.0.0.0
port: 指明端口号,如:port 23
-
确定方向的关键字
src: src 210.27.48.2, IP包源地址是210.27.48.2
dst: dst net 202.0.0.0, 目标网络地址是202.0.0.0
dst or src(缺省值)
dst and src
-
协议的关键字:缺省值是监听所有协议的信息包
fddi
ip
arp
rarp
tcp
udp
-
其他关键字
gateway
broadcast
less
greater
-
常用表达式:多条件时可以用括号,但是要用\转义
非 : ! or "not" (去掉双引号)
且 : && or "and"
或 : || or "or"
-
选项
-A:以ASCII编码打印每个报文(不包括链路层的头),这对分析网页来说很方便; -a:将网络地址和广播地址转变成名字; -c<数据包数目>:在收到指定的包的数目后,tcpdump就会停止; -C:用于判断用 -w 选项将报文写入的文件的大小是否超过这个值,如果超过了就新建文件(文件名后缀是1、2、3依次增加); -d:将匹配信息包的代码以人们能够理解的汇编格式给出; -dd:将匹配信息包的代码以c语言程序段的格式给出; -ddd:将匹配信息包的代码以十进制的形式给出; -D:列出当前主机的所有网卡编号和名称,可以用于选项 -i; -e:在输出行打印出数据链路层的头部信息; -f:将外部的Internet地址以数字的形式打印出来; -F<表达文件>:从指定的文件中读取表达式,忽略其它的表达式; -i<网络界面>:监听主机的该网卡上的数据流,如果没有指定,就会使用最小网卡编号的网卡(在选项-D可知道,但是不包括环路接口),linux 2.2 内核及之后的版本支持 any 网卡,用于指代任意网卡; -l:如果没有使用 -w 选项,就可以将报文打印到 标准输出终端(此时这是默认); -n:显示ip,而不是主机名; -N:不列出域名; -O:不将数据包编码最佳化; -p:不让网络界面进入混杂模式; -q:快速输出,仅列出少数的传输协议信息; -r<数据包文件>:从指定的文件中读取包(这些包一般通过-w选项产生); -s<数据包大小>:指定抓包显示一行的宽度,-s0表示可按包长显示完整的包,经常和-A一起用,默认截取长度为60个字节,但一般ethernet MTU都是1500字节。所以,要抓取大于60字节的包时,使用默认参数就会导致包数据丢失; -S:用绝对而非相对数值列出TCP关联数; -t:在输出的每一行不打印时间戳; -tt:在输出的每一行显示未经格式化的时间戳记; -T<数据包类型>:将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议); -v:输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息; -vv:输出详细的报文信息; -x/-xx/-X/-XX:以十六进制显示包内容,几个选项只有细微的差别,详见man手册; -w<数据包文件>:直接将包写入文件中,并不分析和打印出来; expression:用于筛选的逻辑表达式;
Wireshark 分析数据
Android利用tcpdump和wireshark抓取网络数据包: http://www.trinea.cn/android/tcpdump_wireshark/
iOS,Android网络抓包教程之tcpdump: http://mrpeak.cn/blog/tutorial-tcpdump/
聊聊tcpdump与Wireshark抓包分析: http://www.jianshu.com/p/a62ed1bb5b20
Filder 抓包: http://www.jianshu.com/p/f173ed2aed13
Wireshark 学习:https://community.emc.com/message/818739
tcpdump 命令详解:http://www.jianshu.com/p/15471420422c
Android通过tcpdump抓包: http://www.jianshu.com/p/23abbd62781e