使用场景
1、排查线上问题,在APP上有兼容问题,或者是接口数据问题
2、在端上联调和端上的交互有问题,需要抓包查看
3、想爬某个APP的请求内容数据等。
常用的抓包工具
抓包工具也非常多,比如 Fiddler、Charles、mitmproxy、anyproxy 等等,我们用这些工具抓到 HTTP 请求包,就能看到这个请求的 Method、Headers、Data 等内容了。另外可以看到请求的静态资源。
但是,这个过程中你可能遇到非常多的问题,毕竟 App 的数据也是非常宝贵的,所以一些 App 也添加了各种反爬措施,比如:
- 这个 App 的请求根本抓不到包,原因可能是 App 本身设置了不走系统代理。
- 对一些 HTTPS 的请求,抓包失败,原因可能是系统或 App 本身设置了 SSL Pining,对 HTTPS 证书进行了校验,代理软件证书校验不通过,拒绝连接。
- 某些包即使抓到了,也发现了其中带了加密参数,比如 sign、token 等等,难以直接用程序模拟。
- 为了破解一些加密参数可能需要对 App 进行逆向,逆向后发现是混淆后的代码,难以分析逻辑。
随着移动互联网的发展,App 上承载的数据也越来越多,越来越重要,很多厂商为了保护 App 的数据也采取了非常多的手段。因此 App 的爬取和逆向分析也变得越来越难。
抓包
抓包的工具有很多,常见的如 Charles、Fiddler、mitmproxy 等。下面使用Charles来介绍
如何使用Charles详细见:blog.csdn.net/yangbindxj/…
抓包的时候在 PC 端运行抓包软件,抓包软件会开启一个 HTTP 代理服务器,然后手机和 PC 连在同一个局域网内,设置好抓包软件代理的 IP 和端口,另外 PC 和手机都安装抓包软件的证书并设置信任。这样在手机上再打开 App 就能看到 App 在运行过程中发起的请求了。
抓包完成之后在抓包软件中定位到具体数据包,查看其详情,了解其请求 Method、URL、Headers、Data。
静态资源的话,可以看到静态资源的代码,这时候就可以利用抓包工具的一些调试模式,增加断点,替换文件等功能。
当然如果遇到抓不到包,那就要用到后面介绍的方法了。
抓不到包
一些 App 在内部实现的时候对代理加了一些校验,如绕过系统代理直接连接或者检测到了使用了代理,直接拒绝连接。
这种情形往往是手机的 HTTP 客户端对系统的网络环境做了一些判断,并修改了一些 HTTP 请求方式,使得数据不走代理,这样抓包软件就没法直接抓包了。
另外对于一些非 HTTP 请求的协议,利用常规的抓包软件也可能抓不到包。这里提供一些解决方案。
HTTP可以正常抓到接口,HTTPS抓不到的情况
charles可以使用,chls/pro:ssl安装证书,手机上信任,就可以https能正常获取了
强制全局代理
虽然有些数据包不走代理,但其下层还是基于 TCP 协议的,所以可以将 TCP 数据包重定向到代理服务器。比如软件 ProxyDroid 就可以实现这样的操作,这样我们就能抓到数据包了。
ProxyDroid:github.com/madeye/prox…
手机代理
如果不通过 PC 上的抓包软件设置代理,还可以直接在手机上设置抓包软件,这种方式是通过 VPN 的方式将网络包转发给手机本地的代理服务器,代理服务器将数据发送给服务端,获取数据之后再返回即可。
使用了 VPN 的方式,我们就可以截获到对应的数据包了,一些工具包括 HttpCanary、Packet Capture、NetKeeper 等。
- HttpCanary:play.google.com/store/apps/…
- Packet Capture:play.google.com/store/apps/…
- NetKeeper:play.google.com/store/apps/…
以上应用链接来源于 Google Play,也可以在国内应用商店搜索或直接下载 apk 安装。
特殊协议抓包
可以考虑使用 Wireshark、Tcpdump 在更底层的协议上抓包,比如抓取 TCP、UDP 数据包等等。
使用的时候建议直接 PC 上开热点,然后直接抓取 PC 无线网卡的数据包,这样 App 不管有没有做系统代理校验或者使用了非 HTTP 协议,都能抓到数据包了。
SSL Pining
SSL Pining,就是证书绑定,这个只针对 HTTPS 请求。
SSL Pining 发生在下面的一些情况:
- 对于 Android 7.0 以上的手机,系统做了改动,HTTPS 请求只信任系统级别证书,这会导致系统安全性增加,但是由于抓包软件的证书并不是系统级别证书,就不受信任了,那就没法抓包了。
- 一些 App 里面专门写了逻辑对 SSL Pining 做了处理,对 HTTPS 证书做了校验,如果发现是不在信任范围之内的,那就拒绝连接。
对于这些操作,我们通常有两种思路来解决:
- 让系统信任我们的 HTTPS 证书;
- 绕开 HTTPS 证书的校验过程。
对于这两种思路,有以下一些绕过 SSL Pining 的解决方案。
将证书设置为系统证书
当然也可以将证书直接设置为系统证书,只需要将抓包软件的证书设置为系统区域即可。但这个前提是手机必须要 ROOT,而且需要计算证书 Hash Code 并对证书进行重命名,具体可以参考 crifan.github.io/app_capture…
调试
在排查线上问题时,想把线上的资源替换成本地的代码,或者想增加对应的断点调试时,可以使用如下的方式
本地调试如果HTTPS接口失败的话,安装证书
并设置为信任
只想查看APP资源时,可以把本地的代理去掉
Charles 映射本地资源
设置映射本地资源
这样就会把测试或者线上的资源替换为本地的文件
Charles 接口调试
这里可以处理当前替换参数或者替换返回的内容等。
请求参数替换修改
右侧分为三个栏目,第一个是总的查看方式,contents查看当前的请求和返回,第二个是当前的请求,第三个是当前的返回
- 重新发送一次请求
- 修改参数进行发送请求
返回内容替换(参考:www.cnblogs.com/chenjing-am…
1、打开 charles,勾选 macOS Proxy,网页请求 movie.douban.com/
如果是 https 的请求,需要先配置 https 证书。
页面显示如下:
2、找到热门电影的接口,单击右键选中 “Breakpoints”
【备选项,点击“BreakPoints”后,要去查看工具栏-->Proxy-->SSL Proxying Settings... 】
3、再次请求该页面,该页面刷新后,热门电影区域显示空白,charles 首先弹出“请求”选择框,有 “Cancel”、“Abort”、“Execute” 三个选择,选择 “Execute”,让 charles 通过这次请求。
Cancel 表示取消,Abort 表示中止,Execute 表示执行
4、接下来会触发 “响应” 选择框,点击 “Edit Response”,修改返回值,点击 “Execute”。
显示效果: