前端H5在APP上抓包整理

2,026 阅读6分钟

使用场景

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 的爬取和逆向分析也变得越来越难。

抓包

抓包的工具有很多,常见的如 CharlesFiddlermitmproxy 等。下面使用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 等。

以上应用链接来源于 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接口失败的话,安装证书

image.png 并设置为信任 image.png

只想查看APP资源时,可以把本地的代理去掉

image.png

Charles 映射本地资源

设置映射本地资源

image.png

这样就会把测试或者线上的资源替换为本地的文件

image.png

Charles 接口调试

这里可以处理当前替换参数或者替换返回的内容等。

请求参数替换修改

右侧分为三个栏目,第一个是总的查看方式,contents查看当前的请求和返回,第二个是当前的请求,第三个是当前的返回 image.png

  • 重新发送一次请求

在这里插入图片描述
在这里插入图片描述

  • 修改参数进行发送请求

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

返回内容替换(参考: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”。

显示效果: