• 分析 Android 中 app 的网络数据交互,需要在 Android 上抓包,常用工具为 tcpdump ,用 tcpdump 生成 Wireshark 识别的 pcap 文件,把 pcap 文件从手机上拷贝到电脑上,Wireshark 加载 pcap 文件,通过 Wireshark 分析 tcpdump 抓取的数据

tcpdump 安装

  1. 手机需要 root
  2. 下载 Android tcpdump
  3. 使用 adb 命令把 tcpdump 放入到手机中
    adb push tcpdump /sdcard/
    adb shell su cat /sdcard/tcpdump > /system/bin/tcpdump
  4. 当提示没有权限时,输入
    monut
  5. 在结果中找到包含 /system 的一行,类似:
    /dev/block/bootdevice/by-name/system /system ext4 rw,seclabel,relatime,data=ordered 0 0
  6. 执行如下命令
    mount -o remount /dev/block/bootdevice/by-name/system
  7. 这时 /system 拥有写权限,继续执行
    cat /system/tcpdump > /system/bin/tcpdump
    chmod 777 /system/bin/tcpdump
  8. 这样 tcpdump 就成功安装到了 /system/bin 目录下

使用 tcpdump 抓包

  1. 使用 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

  1. 通过 adb pull 命令拿到 pcap 文件,
adb pull /sdcard/capture.pcap .
  1. 使用 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 ]
  1. 类型的关键字
    host(缺省类型): 指明一台主机,如:host 210.27.48.2
    net: 指明一个网络地址,如:net 202.0.0.0
    port: 指明端口号,如:port 23
  2. 确定方向的关键字
    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
  3. 协议的关键字:缺省值是监听所有协议的信息包
    fddi
    ip
    arp
    rarp
    tcp
    udp
  4. 其他关键字
    gateway
    broadcast
    less
    greater
  5. 常用表达式:多条件时可以用括号,但是要用\转义
    非 : ! or "not" (去掉双引号)
    且 : && or "and"
    或 : || or "or"
  6. 选项
-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

直面挑战,躬身入局