Android 真机抓包

在 Android 开发过程中,可能会遇到和服务端交互有问题的情况,这时候就得拿出证据来和服务端撕逼, 而最有力的证据自然是抓取的网络数据包;又或者是遇到很诡异的网络问题,这时候就可以借助抓包来分析和定位问题。

如果我们和服务端的交互没有通过 VPN, 而且也不是视频流这种网络性能要求苛刻的情况,我们可以通过 tPacketCapture 这种应用来抓包;

其他情况我们可以通过 root 手机,然后安装 tcpdump 来抓包。

下面我们详细介绍下 通过 tcpdump 抓包这种方法:

  • Root 手机

Root 手机的原理是利用系统存在的漏洞来获得 root 权限,XDA Developers 上有不少 root 工具,很多手机都可以用它们 root。

  • 安装 tcpdump

可以到网上搜索为 Android 编译好的 tcpdump 二进制包,例如这里就有一个。

1
2
3
4
5
6
7
8
9
10
11
// Copy tcpdump to device
$ adb -d push /path/to/tcpdump /sdcard/tcpdump

// Device shell
$ adb -d shell

// Switch to root
$ su

// Copy tcpdump to /data/local/
# cat /sdcard/tcpdump /data/local/tcpdump
  • 抓包
1
2
3
4
5
6
7
8
9
10
11
12
13
/# cd /data/local
/# ./tcpdump -i any -p -s 0 -w /sdcard/capture.pcap

//  Options
    # "-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)

  ... do whatever you want to capture, then ^C to stop it ...
  • 分析
1
2
3
4
// Copy capture.pcap to computer
$ adb -d pull /sdcard/capture.pcap /path/to/capture.pcap

Analyze with Wireshark.
  • Shell Commands

Android 手机上的命令通常不全,我们可以通过安装 BusyBox 来提供一个相对完成 Shell 命令集方便我们的开发工作。

1,Download BusyBox 的压缩包;
2,获取设备 CPU 的架构版本 adb -d shell cat /proc/cpuinfo
3,解开压缩包,把对应 CPU 架构版本的二进制包生命名为 busybox,例如 mv busybox-armv7l busybox;
4,安装 busybox 到设备上,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Copy busybox to device
$adb -d push /path/to/busybox /sdcard/busybox

// Switch to device shell
$adb -d shell

// Install busybox
$ su

\# cat /sdcard/busybox /system/xbin/busybox

// Check install result
# busybox 

...

Reference