本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议 》和 《 阿里云开发者社区知识产权保护指引 》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单 进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
  • https://assets.examplecode.cn/file/charles.jar
  • 打开Finder,在应用程序中选择Charles并右键选择显示包内容
  • 显示包内容后在Content/Java目录下将破解文件复制过来替换掉原文件即可
  • 如果打开Charles时提示:程序已损坏,打不开。您应该将它移到废纸篓。此时需要在终端中执行以下命令即可:sudo spctl --master-disable
  • 02.抓包代理设置

    charles代理设置

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

  • 添加安全配置文件。如下所示:
  • java.security.cert.CertPathValidatorException: Trust anchor for certification path not found 这个异常,解决方案如下所示:
  • <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <base-config cleartextTrafficPermitted="true">
            <trust-anchors>
                <certificates
                    overridePins="true"
                    src="system" />
                <certificates
                    overridePins="true"
                    src="user" />
            </trust-anchors>
        </base-config>
    </network-security-config>
    //清单文件配置
    <application
        android:networkSecurityConfig="@xml/network_security_config_debug">

    Android 7.0及以上为何不能轻易抓取到Https请求的明文数据?

    • 在Android 7.0(API 24 ) ,有一个名为“Network Security Configuration”的新安全功能。这个新功能的目标是允许开发人员在不修改应用程序代码的情况下自定义他们的网络安全设置。如果应用程序运行的系统版本高于或等于24,并且targetSdkVersion>=24,则只有系统(system)证书才会被信任。所以用户(user)导入的Charles根证书是不被信任的。

    抓https最后结果如下所示

  • 第一步,客户端向服务器发起HTTPS请求,charles截获客户端发送给服务器的HTTPS请求,charles伪装成客户端向服务器发送请求进行握手 。
  • 第二步,服务器发回相应,charles获取到服务器的CA证书,用根证书(这里的根证书是CA认证中心给自己颁发的证书)公钥进行解密,验证服务器数据签名,获取到服务器CA证书公钥。然后charles伪造自己的CA证书(这里的CA证书,也是根证书,只不过是charles伪造的根证书),冒充服务器证书传递给客户端浏览器。
  • 第三步,与普通过程中客户端的操作相同,客户端根据返回的数据进行证书校验、生成密码Pre_master、用charles伪造的证书公钥加密,并生成HTTPS通信用的对称密钥enc_key。
  • 第四步,客户端将重要信息传递给服务器,又被charles截获。charles将截获的密文用自己伪造证书的私钥解开,获得并计算得到HTTPS通信用的对称密钥enc_key。charles将对称密钥用服务器证书公钥加密传递给服务器。
  • 第五步,与普通过程中服务器端的操作相同,服务器用私钥解开后建立信任,然后再发送加密的握手消息给客户端。
  • 第六步,charles截获服务器发送的密文,用对称密钥解开,再用自己伪造证书的私钥加密传给客户端。
  • 第七步,客户端拿到加密信息后,用公钥解开,验证HASH。握手过程正式完成,客户端与服务器端就这样建立了”信任“。
  • 在之后的正常加密通信过程中,charles如何在服务器与客户端之间充当第三者呢?
  • 服务器—>客户端:charles接收到服务器发送的密文,用对称密钥解开,获得服务器发送的明文。再次加密, 发送给客户端。
  • 客户端—>服务端:客户端用对称密钥加密,被charles截获后,解密获得明文。再次加密,发送给服务器端。由于charles一直拥有通信用对称密钥enc_key,所以在整个HTTPS通信过程中信息对其透明。
  • 6.总结一下

    HTTPS抓包的原理还是挺简单的,简单来说,就是Charles作为“中间人代理”,拿到了服务器证书公钥和HTTPS连接的对称密钥,前提是客户端选择信任并安装Charles的CA证书,否则客户端就会“报警”并中止连接。这样看来,HTTPS还是很安全的

    05.抓包数据介绍

    HTTP请求包的结构

    请求报文结构格式:

    请求行: <method> <request-URL> <version>
    头部:   <headers>
    主体:   <entity-body>

    请求报文结构示意图:

    • 请求了就会收到响应包(如果对面存在HTTP服务器)
    POST /meme.php/home/user/login HTTP/1.1
    Host: 114.215.86.90
    Cache-Control: no-cache
    Postman-Token: bd243d6b-da03-902f-0a2c-8e9377f6f6ed
    Content-Type: application/x-www-form-urlencoded
    tel=13637829200&password=123456
    HTTP/1.1 200 OK
    Date: Sat, 02 Jan 2016 13:20:55 GMT
    Server: Apache/2.4.6 (CentOS) PHP/5.6.14
    X-Powered-By: PHP/5.6.14
    Content-Length: 78
    Keep-Alive: timeout=5, max=100    Connection: Keep-Alive
    Content-Type: application/json; charset=utf-8
    {"status":202,"info":"\u6b64\u7528\u6237\u4e0d\u5b58\u5728\uff01","data":null}
    | :---: | :---: | :---: | | 1XX | Informational(信息性状态码) | 接收的请求正在处理 | | 2XX | Success(成功状态码) | 请求正常处理完毕 | | 3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 | | 4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 | | 5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |

    1.配置好后无法打开APP

    • 在我们抓取时碰到个别APP在配置代理后无法打开,这个主要是因为该APP做了防止抓取处理,比如校验https的证书是否合法等,这种解决方法可以通过反编译APP,查看源码解决,难度较大。

    2.抓取到的内容为乱码

    • 有的APP为了防止抓取,在返回的内容上做了层加密,所以从Charles上看到的内容是乱码。这种情况下也只能反编译APP,研究其加密解密算法进行解密。

    07.Android拦截抓包

  • 网络拦截分析,主要是分析网络流量损耗,以及request,respond过程时间。打造网络分析工具……
  • 项目代码地址: https://github.com/yangchong211/YCAndroidTool
  • 如果你觉得这个拦截网络助手方便了测试,以及开发中查看网络数据,可以star一下……
  • 网络拦截库: https://github.com/yangchong211/YCAndroidTool 2 下载tcpdump android模拟器上linux里面有的会自带。 3 adb push c:\wherever_you_put\tcpdump /data/local/tcpdump 4 adb shell chmod... 程序员诗人