手把手教你 Charles 的使用「部分逆向的解决方法」

你好,我是悦创。

上次我们搞了 Mitmproxy 的 抓包利器:App 爬虫神器?Mitmproxy 快速带你入坑! ,不过我觉得还有点不够,这次我想把 Charles 也来搞一搞,把它的基本用法给弄清楚,这样我之后去抓包(抓 Web 、App)都会事半功倍,这里我们其实就是磨刀,只有把刀磨好了抓包爬虫才能精进一步,也向爬虫方向更进一步。

1. 简介

Charles 是一个网络抓包工具,我们可以用它来做 App 的抓包分析,得到 App 运行过程中发生的所有网络请求和响应内容,这就和 Web 端浏览器的开发者工具 Network 部分看到的结果一致。

Charles、Fiddler 等都是非常强大的 HTTP 抓包软件,功能基本类似,不过 Charles 的跨平台支持更好。所以我们选用 Charles 作为主要的移动端抓包工具,用于分析移动 App 的数据包,辅助完成 App 数据抓取工作。

这个我自己亲测,有些数据包,Fiddler 并没有抓取到或者说并没有成功抓取到其中内容,只有个错误数据,这为我们对数据抓取就造成了不小的困难,然后重启 Fiddler 或者不断地重试才可以成功,当然英语好一点还是有好处地,因为 url 告诉我们这就是我们要的数据,不然咱们漫无目的的重试也无济于事。所以这也是我来写这篇教程的原因之一啦。

本文我以豆果美食 App 为例,通过 Charles 抓取 App 运行过程中的网络数据包,然后查看具体的 Request 和 Response 内容,以此来了解 Charles 的用法。本文将不带大家编写抓取的 Python 爬虫代码,主要以 Charles 的使用为主题。

温馨提醒:有时候,你 Fiddler 抓包或者 Charles 抓包里面并没有数据,而你的 requests 确有数据,这是为什么呢?

答:有时候尝试清除手机 app 缓存后重新使用fiddler抓取。一般都为 app 缓存造成的,我们使用 requests 构造请求,发送请求后返回的是新数据,而手机请求一次后,第二次请求直接调用缓存。

3. 准备工作

在正式开始之前,我们需要做好如下配置:

  1. 请确保已经正确安装 Charles 并开启了代理服务,另外准备一部 Android 手机,系统版本最好是在 7.0 以下。(不过鉴于大部分人的实际情况不一定会有多余的 Android 手机,所以这里我们使用夜神模拟器)具体安装可以参考如下链接:
    • Charles 安装:https://www.aiyc.top/archives/509.html

    • Charles 破解:https://www.zzzmode.com/mytools/charles/

    • 夜神模拟器安装&介绍:https://www.aiyc.top/archives/494.html

    • 在夜神模拟器内部安装App:https://www.aiyc.top/archives/508.html

    • 对于夜神模拟器的代理设置可以点击如下连接观看:https://www.bilibili.com/video/BV16K411W7Gs/?p=12

    • 3.1.3.3 Chrome

      需要注意的是,Chrome 和 Firefox 浏览器默认并不使用系统的代理服务器设置,而 Charles 是通过将自己设置成代理服务器来完成封包截取的,所以在默认情况下无法截取 Chrome 和 Firefox 浏览器的网络通讯内容。如果你需要截取的话,在 Chrome 中设置成使用系统的代理服务器设置即可,或者直接将代理服务器设置成 127.0.0.1:8888 也可达到相同效果。具体设置可以参考该视频:https://www.bilibili.com/video/BV16K411W7Gs/?p=6

  2. 如果系统版本在 7.0 及以上,可能出现 SSL Pining 的问题,这里会给你提供些基本解决方法。

  3. 然后手机连接 Wi-Fi,和 PC 处于同一个局域网下,另外将 Charles 代理和 Charles CA 证书设置好,同时需要开启 SSL 监听。(如果是模拟器的话问题不大,开启模拟器的桥接功能即可)

  4. 最后手机上安装本节提供的 apk,进行接下来的 Charles 抓包操作:https://gitee.com/aiycgit/Study_Learning_DataBase/blob/master/douguo_App/com.douguo.recipe_6.9.62.2_538.apk(点击去下载即可,直接拖拽安装即可)

3.2 SSL Pining 概念与解决方法提供

SSL Pining,就是证书绑定,这个只针对 HTTPS 请求。

SSL Pining 发生在下面的一些情况:

  • 对于 Android 7.0 以上的手机,系统做了改动,HTTPS 请求只信任系统级别证书,这会导致系统安全性增加,但是由于抓包软件的证书并不是系统级别证书,就不受信任了,那就没法抓包了。
  • 一些 App 里面专门写了逻辑对 SSL Pining 做了处理,对 HTTPS 证书做了校验,如果发现是不在信任范围之内的,那就拒绝连接。

对于这些操作,我们通常有两种思路来解决:

  • 让系统信任我们的 HTTPS 证书;
  • 绕开 HTTPS 证书的校验过程。

对于这两种思路,有以下一些绕过 SSL Pining 的解决方案。

1. 修改 App 的配置
如果是 App 的开发者或者把 apk 逆向出来了,那么可以直接通过修改 AndroidManifest.xml 文件,在 apk 里面添加证书的信任规则即可,详情可以参考 https://www.aiyc.top/archives/512.html ,这种思路属于第一种信任证书的解决方案。

2. 将证书设置为系统证书
当然也可以将证书直接设置为系统证书,只需要将抓包软件的证书设置为系统区域即可。但这个前提是手机必须要 ROOT,而且需要计算证书 Hash Code 并对证书进行重命名,具体可以参考 https://www.aiyc.top/archives/512.html ,这种思路也是第一种信任证书的解决方案。

3. Xposed + JustTrustMe
Xposed 是一款 Android 端的 Hook 工具,利用它我们可以 Hook App 里面的关键方法的执行逻辑,绕过 HTTPS 的证书校验过程。JustTrustMe 是基于 Xposed 一个插件,它可以将 HTTPS 证书校验的部分进行 Hook,改写其中的证书校验逻辑,这种思路是属于第二种绕过 HTTPS 证书校验的解决方案。

当然基于 Xposed 的类似插件也有很多,如 SSLKiller、sslunpining 等等,可以自行搜索。

不过 Xposed 的安装必须要 ROOT,如果不想 ROOT 的话,可以使用后文介绍的 VirtualXposed。

4. Frida
Frida 也是一种类似 Xposed 的 Hook 软件,使用它我们也可以实现一些 HTTPS 证书校验逻辑的改写,这种思路也是属于第二种绕过 HTTPS 证书校验的方案。

具体可以参考 [https://codeshare.frida.re/@pcipolloni/universal-android-ssl-pinning-bypass-with-frida/]。

5. VirtualXposed
Xposed 的使用需要 ROOT,如果不想 ROOT 的话,可以直接使用一款基于 VirtualApp 开发的 VirtualXposed 工具,它提供了一个虚拟环境,内置了 Xposed。我们只需要将想要的软件安装到 VirtualXposed 里面就能使用 Xposed 的功能了,然后配合 JustTrustMe 插件也能解决 SSL Pining 的问题,这种思路是属于第二种绕过 HTTPS 证书校验的解决方案。

6. 特殊改写
对于第二种绕过 HTTPS 证书校验的解决方案,其实本质上是对一些关键的校验方法进行了 Hook 和改写,去除了一些校验逻辑。但是对于一些代码混淆后的 App 来说,其校验 HTTPS 证书的方法名直接变了,那么 JustTrustMe 这样的插件就无法 Hook 这些方法,因此也就无效了。

所以这种 App 可以直接去逆向,找到其中的一些校验逻辑,然后修改写 JustTrustMe 的源码就可以成功 Hook 住了,也就可以重新生效了。

7. 逆向秘钥
还有一种硬解的方法,可以直接逆向 App,反编译得到证书秘钥,使用秘钥来解决证书限制。

4. Charles 抓包原理

首先将 Charles 运行在自己的 PC 上,Charles 运行的时候会在 PC 的 8888 端口开启一个代理服务,这个服务实际上是一个 HTTP/HTTPS 的代理。确保手机和 PC 在同一个局域网内,我们可以使用手机模拟器通过虚拟网络连接,也可以使用手机真机和 PC 通过无线网络连接。

设置手机代理为 Charles 的代理地址,这样手机访问互联网的数据包就会流经 Charles,Charles 再转发这些数据包到真实的服务器,服务器返回的数据包再由 Charles 转发回手机,Charles 就起到中间人的作用,所有流量包都可以捕捉到,因此所有 HTTP 请求和响应都可以捕获到。同时 Charles 还有权力对请求和响应进行修改。

这其实就是之前所说的中间人工具,这里不清楚的小伙伴可以点击该连接阅读:

5. 实际操作

好,我们先打开 Charles,初始状态下 Charles 的运行界面如图所示。

Charles 会一直监听 PC 和手机发生的网络数据包,捕获到的数据包就会显示在左侧,随着时间的推移,捕获的数据包越来越多,左侧列表的内容也会越来越多。

可以看到,图中左侧显示了 Charles 抓取到的请求站点,我们点击任意一个条目便可以查看对应请求的详细信息,其中包括 Request、Response 等内容。

接下来清空 Charles 的抓取结果,点击左侧的扫帚按钮即可清空当前捕获到的所有请求。然后点击第二个监听按钮,确保监听按钮是打开的,这表示 Charles 正在监听 App 的网络数据流,如图所示。

image-20200521184218447

这时打开 App,注意一定要提前设置好 Charles 的代理并配置好 CA 证书,否则没有效果。打开 App 之后我们就可以看到类似如下的页面。

image-20200521194740910

这时候我们先清空原本的抓取数据,也就是点击那个“扫把”就可以清空。然后 APP 里面我们点击“菜谱”分类。就可以发现 Charles 里面已经抓取到了对应的数据包,出现了类似如下动图所示的结果。

我们在 App 里不断上拉,可以看到 Charles 捕获到这个过程中 App 内发生的所有网络请求,如下动图所示。

左侧列表中会出现一个 api.douguo.net 的链接,而且在 App 上拉过程它在不停闪动,这就是当前 App 发出的获取数据的请求被 Charles 捕获到了。

为了验证其正确性,我们点击查看其中一个条目的详情信息。切换到 Contents 选项卡,这时我们发现一些 JSON 数据。

我们可以发现编码显示不正常是个 Unicode 编码,这里我们使用 Json 格式化一下,操作如下,先访问该链接:https://c.runoob.com/front-end/53,界面如下:

接下来,把上面 Charles 抓包 的数据中的 Json 复制出来,如下动图:

核对一下结果,结果有 results 字段,每一个条目的 an 字段就是该菜谱作者的信息,这与 App 里面呈现的内容是完全一致的,如图所示。

这时可以确定,此请求对应的接口就是获取菜谱数据数据的接口。这样我们就成功捕获到了在上拉刷新的过程中发生的请求和响应内容。

6. 分析 Charles

现在分析一下这个请求和响应的详细信息。首先可以回到 Overview 选项卡,上方显示了请求的接口 URL,接着是响应状态 Status Code、请求方式 Method 等,如图所示。

这个结果和原本在 Web 端用浏览器开发者工具内捕获到的结果形式是类似的。像如下内容:

接下来点击 Contents 选项卡,查看该请求和响应的详情信息。

上半部分显示的是 Request 的信息,下半部分显示的是 Response 的信息。比如针对 Reqeust,我们切换到 Headers 选项卡即可看到该 Request 的 Headers 信息,针对 Response,我们切换到 JSON Text 选项卡即可看到该 Response 的 Body 信息,并且该内容已经被格式化,如图所示。

由于这个请求是 GET 请求,所以我们还需要关心的就是 GET 的参数信息,切换到 Query String 选项卡即可查看,这里为了方便我直接访问我的博客:https://www.aiyc.top/,然后查看,我们先使用手机客户端访问我的博客,如下图:

这样我们就成功抓取到了手机端的请求和响应,并且可以查看 Response 返回的数据。

但是细心的小伙伴会发现,抓取 HTTPS 的时候,出现乱码,该如何解决呢?

至于其他 App,我们同样可以使用这样的方式来分析。如果我们可以直接分析得到请求的 URL 和参数的规律,直接用程序模拟即可批量抓取。

7. 解决 Charles HTTPS 乱码问题

Proxy –> SSL Proxying Setting –> Enable SSL Proxying 点击 Add,编辑 Location,输入 Host: * , Port: 443,点击 OK。(当然,你也可以指定 HTTPS 主机)

这样就解决了 Charles 抓取 HTTPS 出现乱码的问题。

8. 重发

Charles 还有一个强大功能,它可以将捕获到的请求加以修改并发送修改后的请求。点击上方的修改按钮,左侧列表就多了一个以编辑图标为开头的链接,这就代表此链接对应的请求正在被我们修改,如图所示。

我们可以修改原本的请求链接,修改成访问百度,然后携带的参数添加:wd、Hello 然后点击下方的 Execute 按钮即可执行修改后的请求,如图所示。

可以发现左侧列表再次出现了接口的请求结果,如下动图所示。

有了这个功能,我们就可以方便地使用 Charles 来做调试,可以通过修改参数、接口等来测试不同请求的响应状态,就可以知道哪些参数是必要的哪些是不必要的,以及参数分别有什么规律,最后得到一个最简单的接口和参数形式以供程序模拟调用使用。

10. 总结

以上内容便是通过 Charles 抓包分析 App 请求的过程。通过 Charles,我们成功抓取 App 中流经的网络数据包,捕获原始的数据,还可以修改原始请求和重新发起修改后的请求进行接口测试。

这样知道了请求和响应的具体信息,如果我们可以分析得到请求的 URL 和参数的规律,直接用程序模拟即可批量抓取,这当然最好不过了。但是随着技术的发展,App 接口往往会带有密钥或者无法抓包,后面我们会继续讲解此类情形的处理操作。

AI悦创·创造不同!
AI悦创 » 手把手教你 Charles 的使用「部分逆向的解决方法」

Leave a Reply