首先我们需要明确抓包的目的:
举个栗子: 电话会议通话中,此时通话突然异常中断。查看日志后发现没有收到心跳response回应,那么此时就需要抓包,来确认对方设备是否发送了response信息,从而来确定问题根源。
charles的有点不言而喻,简单,上手快,但是只能抓取HTTP协议。 wireshark功能强大,学习成本比较高,但是可以抓取TCP、UDP协议满足我们现有业务需求。
具体步骤:
1、把电脑的网络做为热点 2、开启wifi热点后,被测设备连接到该热点; 3、启动wireshark/charles,选择做为热点的网卡,开始抓包; 4、操作手机,可以抓取到手机所有与网络交互的数据包 5、操作结束后停止抓包即可。
以上方式对于我们目前的开发条件来说局限性较大,目前没有笔记本可以开启热点供抓包(笔记本开启热点需要申请权限)
安卓tcpdump下载地址:https://download.csdn.net/download/github_33304260/10820344
此方式使用有个前提就是待抓包设备必须具有root权限,因为我们需要往data/local下写入文件,如果非eng版本或非root版本会遇到权限问题,如下如图:
接下来开始我们的抓包
1、下载tcpdump文件
2、将下载好的tcpdump文件,放入设备的data/local下
执行如下命令:
adb push 路径:/tcpdump /data/local
eg:adb push c:/tcpdump /data/local
3、进入shell
输入如下命令进入shell
adb shell
4、给tcpdump分配权限
进入/data/local
目录下,执行如下命令:
chmod 777 tcpdump
对linux权限不太清楚的同学可以自行google
5、开始抓包
在/data/local
目录下输入如下命令:
./tcpdump -p -s 0 -w 文件名.cap
eg:抓包并写入文件名为text.cap
./tcpdump -p -s 0 -w test.cap
看到如上命令说明抓包成功,可以坐等。
6、结束 等待抓包结束后,直接按ctrl+c 结束抓包
看到上图说明成功结束此次抓包。 7、退出sehll
执行如下命令:
exit
8、导出cap文件
执行如下命令:
adb pull cap文件路径 将要保存的路径
eg:将/data/local/下的text.cap文件导出到d盘workSpace文件夹下
adb pull /data/local/test.cap D:\workSpace
附录:常用的tcpdump命令
-a:尝试将网络和广播地址转换成名称;
-c<数据包数目>:收到指定的数据包数目后,就停止进行倾倒操作;
-d:把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出;
-dd:把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出;
-ddd:把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出;
-e:在每列倾倒资料上显示连接层级的文件头;
-f:用数字显示网际网络地址;
-F<表达文件>:指定内含表达方式的文件;
-i<网络界面>:使用指定的网络截面送出数据包;
-l:使用标准输出列的缓冲区;
-n:不把主机的网络地址转换成名字;
-N:不列出域名;
-O:不将数据包编码最佳化;
-p:不让网络界面进入混杂模式;
-q :快速输出,仅列出少数的传输协议信息;
-r<数据包文件>:从指定的文件读取数据包数据;
-s<数据包大小>:设置每个数据包的大小;
-S:用绝对而非相对数值列出TCP关联数;
-t:在每列倾倒资料上不显示时间戳记;
-tt: 在每列倾倒资料上显示未经格式化的时间戳记;
-T<数据包类型>:强制将表达方式所指定的数据包转译成设置的数据包类型;
-v:详细显示指令执行过程;
-vv:更详细显示指令执行过程;
-x:用十六进制字码列出数据包资料;
-w<数据包文件>:把数据包数据写入指定的文件。