美文网首页
Android抓包(Charles)

Android抓包(Charles)

作者: 24k纯帅哥 | 来源:发表于2021-03-24 12:17 被阅读0次

    Charles抓包(Androidhttp/https请求)

    目录介绍

    • 01.下载安装
    • 02.抓包代理设置
    • 03.抓包Https操作
    • 04.解决Android7.0+无法抓包https
    • 05.解决Android7.0+webview抓包失败
    • 06.设置只在调试模式下允许抓包

    01.下载安装

    下载地址(下载对应的平台软件安装即可,也可以去官网下载最新的安装包)

    Charles 激活码(任选一个生成器生成注册码)

    02.抓包代理设置

    • charles代理设置

    • 可以设置抓包数据类型,包括http与socket数据。可以根据需要在proxies栏下勾选。这里简单操作进行设置,Proxy ---> Proxy Settings默认端口是8888,根据实际情况可修改。


      image.png

    Android手机代理设置

    • 首先获取电脑ip地址

    • 第一种方式:查看本机IP地址:Help ---> Local IP Addresses


      image.png

    第二种方式:命令行方式,Mac输入ifconfig,win输入ipconfig即可


    image.png

    第三种方式:系统偏好设置-网络


    image.png

    然后打开手机设置代理

    • 注意:手机需要和电脑使用同一个Wi-Fi网络,这是前提!!!
    • 操作步骤:打开WiFi列表 ---> 长按连接的WiFi修改网络设置代理 --- > 设置代理信息


      image.png

    最后抓包如下

    • http包数据如下所示
      image.png

    03.抓包Https操作

    • 需要做哪些操作

    • 1.电脑上需要安装证书

    • 2.手机上需要安装证书

    • 1.电脑上需要安装证书

    • 第一步安装证书:help ---> SSl Proxying ---> install charles root certificate ---> 安装证书

    • 第二步设置SSL属性:Proxy ---> SSL Proxy Settings ---> 然后add操作(设置port为443,443为抓取https接口)。如下所示


      image.png
    • 2.手机上需要安装证书

    • 第一步下载证书

    • 打开浏览器,输入:chls.pro/ssl,就会自己下载到手机上,这里需要记住下载完成保存到本地的路径。

    • 第二步安装证书

    • 设置 ---> 更多设置 ---> 系统安全 ---> 加密与凭据 ---> 从SD卡安装,选择之前保存证书的路径。

    • 注意,有的手机是直接点击下载的文件即可安装,有的无法安装,无法安装可以把证书后缀.pem修改为.cer或.crt尝试一下

    • 安装操作如下图所示


      image.png

    抓https最后结果如下所示


    image.png
    image.png

    发现Android7.0手机之前可以抓https包,但是Android7.0之后是无法抓https包的

    • 报错信息:客户端SSL握手失败:处理证书时出现未知问题(certificate_unknown)


      image.png

    04. Android7.0之后无法抓包https信息,往下看。
    解决方法如下:
    现象:android7.0以上的手机https抓包失败(安装了https证书也不行)
    原因:android7.0+的版本新增了证书验证(系统证书),具体如下:
    1、Android 6.0(API 23)及更低版本应用的默认网络安全性配置如下:

    <!-- 默认允许所有明文通信 -->
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <!-- 信任系统预装 CA 证书 -->
            <certificates src="system" />
            <!-- 信任用户添加的 CA 证书,Charles 和 Fiddler 抓包工具安装的证书属于此类 -->
            <certificates src="user" />
        </trust-anchors>
    </base-config>
    

    2、而在 Android 7.0(API 24)到 Android 8.1(API 27)的默认网络安全性配置如下:

    <!-- 默认允许所有明文通信 -->
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <!-- 信任系统预装 CA 证书 -->
            <certificates src="system" />
        </trust-anchors>
    </base-config>
    

    3、而在 Android 9.0(API 28)及更高版本的默认网络安全性配置如下:

    <!-- 默认禁止所有明文通信 -->
    <base-config cleartextTrafficPermitted="false">
        <trust-anchors>
            <!-- 信任系统预装 CA 证书 -->
            <certificates src="system" />
        </trust-anchors>
    </base-config>
    

    对比很容易发现,在 Android 7.0(API 24)到 Android 8.1(API 27),默认不再信任用户添加的 CA 证书,所以也就不再信任 Charles 和 Fiddler 抓包工具的证书,所以抓取 HTTPS 包时才会失败。而且在 Android 9.0(API 28)及更高版本上,不仅默认只系统预装的 CA 证书,还默认禁止所有明文通信(不允许 http 请求)。

    解决办法:
    前提:在手机端和电脑端都必须安装https的安全证书
    配置:打测试包时,项目设置默认信任所有证书(系统+用户,Charles 和 Fiddler)

    1. 在工程res-xml目录中创建一个名为 network_security_config.xml的文件,文件内容如下:
    <network-security-config>
        <base-config cleartextTrafficPermitted="true">
            <trust-anchors>
                <certificates src="system" overridePins="true" />
                <certificates src="user" overridePins="true" />
            </trust-anchors>
        </base-config>
    </network-security-config>
    

    2.在AndroidManifest里的标签中,添加如下代码,在清单文件中指向该文件:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config"
    ... >
            ...
    </application>
    </manifest>
    

    重新打包项目,然后抓包,即可成功。

    05. webview抓包失败

    上面可以解决android原生抓包问题,但在android7.0以上的手机,开着网络代理访问不了webview,若要抓包webview,
    需要在webview的WebViewClient中,将一行代码给注释掉:

    super.onReceivedSslError(view, handler, error)
    

    这样是为了忽略掉SSL证书错误,因为开启代理后网络会变得不安全,证书会报错误,webview检测到证书错误之后就不请求任何数据。注释是为了忽略掉父类的处理,默认执行下去。

    警告

    这样的配置操作是敏感且危险的,只能用于测试环境方便抓包,线上包一定注意要恢复配置,不然APP会面临被他人抓包的风险。

    06.如何只在调试模式下允许抓包呢?

    使用<debug-overrides>即可实现只在android:debuggable为true时才生效的配置:

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <!-- 支持 Android 7.0 以上调试时,信任 Charles 和 Fiddler 等用户信任的证书 -->
        <debug-overrides>
            <trust-anchors>
                <certificates src="system" />
                <certificates src="user" />
            </trust-anchors>
        </debug-overrides>
    </network-security-config>
    

    相关文章

      网友评论

          本文标题:Android抓包(Charles)

          本文链接:https://www.haomeiwen.com/subject/vxachltx.html