Android上的网络抓包原来是这样工作的


/   今日科技快讯   /

近日,据CNET报道,电信行业解决方案联盟(ATIS)本周宣布,苹果已经加入了其Next G Alliance,该行业组织致力于“在未来十年内推动北美移动技术在6G及以后领域的领先地位,同时构建5G的长期进化。” 苹果是该组织11个新成员之一,其他成员包括Charter、思科、谷歌、惠普、英特尔、Keysight  Technologies、LG、Mavenir、MITRE和VMware。

/   作者简介   /

大家周一好,新的一周要继续努力哦~

本篇文章来自杨充的投稿,和大家如何在Android中使用Charles进行数据抓包,相信会对大家有所帮助!同时也感谢作者贡献的精彩文章!

杨充的博客地址:

https://juejin.im/user/1978776659695784

/   正文   /

下载安装

下载地址(下载对应的平台软件即可):

www.charlesproxy.com/download/

  • 下载破解文件

  • 打开Finder,在应用程序中选择Charles并右键选择显示包内容

  • 显示包内容后在Content/Java目录下将破解文件复制过来替换掉原文件即可

  • 如果打开Charles时提示:程序已损坏,打不开。您应该将它移到废纸篓。此时需要在终端中执行以下命令即可:sudo spctl --master-disable

抓包代理设置

charles代理设置

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

Android手机代理设置

首先获取电脑ip地址。

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

第二种方式:命令行方式,输入ifconfig即可。

然后打开手机设置代理。

注意:手机需要和电脑使用同一个Wi-Fi网络,这是前提!!!

操作步骤:打开WiFi列表 ---> 长按连接的WiFi修改网络设置代理 --- > 设置代理信息。

最后抓包,如下抓包数据如下所示:

抓包Https操作

需要做哪些操作

  1. 电脑上需要安装证书

  2. 手机上需要安装证书

  3. Android项目代码设置兼容

电脑上需要安装证书

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

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

然后抓包试一下,会发现Android7.0手机之前可以抓包,但是Android7.0之后是无法抓包的。报错信息:客户端SSL握手失败:处理证书时出现未知问题(certificate_unknown)

如何解决在Android7.0之后也可以抓包https信息,接着往下看。

手机上需要安装证书

第一步下载证书

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

第二步安装证书

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

注意,有的手机是直接点击下载的文件即可安装……

安装操作如下图所示:

Android项目代码设置兼容

添加安全配置文件。如下所示:

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的 app 都能抓的到吗?

7.0以下是可以的,只要手机里安装对应CA证书,比如用charles抓包,手机要安装charles提供的证书就行。

Android 7.0 之后,Google 推出更加严格的安全机制,应用默认不信任用户证书(手机里自己安装证书),自己的app可以通过配置解决,但是抓其它app的https请求就行不通。

如何避免抓包

1.基于抓包原理的基础上,直接使用okhtttp禁止代理,就可以了builder.proxy(Proxy.NO_PROXY);经过测试,可以避免抓包

2.直接使用加密协议,全是字段乱码,把域名换装IP。这样基本别人很难抓到,像混淆一样

charles抓包原理图

大概步骤流程

第一步,客户端向服务器发起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通信过程中信息对其透明。

总结一下

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

抓包数据介绍

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

常见的是那些

  • User-Agent:产生请求的浏览器类型。

  • Accept:客户端可识别的响应内容类型列表; 

  • Accept-Language:客户端可接受的自然语言; 

  • Accept-Encoding:客户端可接受的编码压缩格式; 

  • Host:请求的主机名,允许多个域名同处一个IP 地址,即虚拟主机; 

  • Connection:连接方式(close 或 keep-alive); 

  • Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie; 

HTTP响应包结构

响应报文

响应报文结构格式:

状态行:  <version> <status> <reason-phrase>
响应头部:    <headers>
响应主体:    <entity-body>

响应报文结构示意图:

例子:

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}

常见的响应头部参数

  • Allow服务器支持哪些请求方法(如GET、POST等)。

  • Content-Encoding文档的编码(Encode)方法。

  • Content-Length表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。

  • Content-Type表示后面的文档属于什么MIME类型。

  • Server服务器名字。

  • Set-Cookie设置和页面关联的Cookie。

  • ETag:被请求变量的实体值。ETag是一个可以与Web资源关联的记号(MD5值)。

  • Cache-Control:这个字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令。

响应报文状态码

包含了状态码以及原因短语,用来告知客户端请求的结果。 

状态码

类别

原因短语

1XX

Informational(信息性状态码)

接收的请求正在处理

2XX

Success(成功状态码)

请求正常处理完毕

3XX

Redirection(重定向状态码)

需要进行附加操作以完成请求

4XX

Client Error(客户端错误状态码)

服务器无法处理请求

5XX

Server Error(服务器错误状态码)

服务器处理请求出错

常见问题总结

配置好后无法打开APP

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

抓取到的内容为乱码

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

Android拦截抓包

项目代码地址:

https://github.com/yangchong211/YCAndroidTool

如果你觉得这个拦截网络助手方便了测试,以及开发中查看网络数据,可以star一下……

推荐阅读:

核心线程,非核心线程的区别你还记得吗?

我的新书,《第一行代码 第3版》已出版!

排障困难?给你的应用嵌入一个Logcat吧

欢迎关注我的公众号

学习技术或投稿

长按上图,识别图中二维码即可关注

相关推荐
<p> 欢迎参加英特尔® OpenVINO™工具套件初级课程 !本课程面向零基础学员,将从AI的基本概念开始,介绍人工智能与视觉应用的相关知识,并且帮助您快速理解英特尔® OpenVINO™工具套件的基本概念以及应用场景。整个课程包含了视频的处理,深度学习的相关知识,人工智能应用的推理加速,以及英特尔® OpenVINO™工具套件的Demo演示。通过本课程的学习,将帮助您快速上手计算机视觉的基本知识和英特尔® OpenVINO™ 工具套件的相关概念。 </p> <p> 为保证您顺利收听课程参与测试获取证书,还请您于<strong>电脑端</strong>进行课程收听学习! </p> <p> 为了便于您更好的学习本次课程,推荐您免费<strong>下载英特尔® OpenVINO™工具套件</strong>,下载地址:https://t.csdnimg.cn/yOf5 </p> <p> 收听课程并完成章节测试,可获得本课程<strong>专属定制证书</strong>,还可参与<strong>福利抽奖</strong>,活动详情:https://bss.csdn.net/m/topic/intel_openvino </p> <p> 8月1日-9月30日,学习完成【初级课程】的小伙伴,可以<span style="color:#FF0000;"><strong>免费学习【中级课程】</strong></span>,中级课程免费学习优惠券将在学完初级课程后的7个工作日内发送至您的账户,您可以在:<a href="https://i.csdn.net/#/wallet/coupon">https://i.csdn.net/#/wallet/coupon</a>查询优惠券情况,请大家报名初级课程后尽快学习哦~ </p> <p> <span style="font-size:12px;">请注意:点击报名即表示您确认您已年满18周岁,并且同意CSDN基于商务需求收集并使用您的个人信息,用于注册OpenVINO™工具套件及其课程。CSDN和英特尔会为您定制最新的科学技术和行业信息,将通过邮件或者短信的形式推送给您,您也可以随时取消订阅不再从CSDN或Intel接收此类信息。 查看更多详细信息请点击CSDN“<a href="https://passport.csdn.net/service">用户服务协议</a>”,英特尔“<a href="https://www.intel.cn/content/www/cn/zh/privacy/intel-privacy-notice.html?_ga=2.83783126.1562103805.1560759984-1414337906.1552367839&elq_cid=1761146&erpm_id=7141654/privacy/us/en/">隐私声明</a>”和“<a href="https://www.intel.cn/content/www/cn/zh/legal/terms-of-use.html?_ga=2.84823001.1188745750.1560759986-1414337906.1552367839&elq_cid=1761146&erpm_id=7141654/privacy/us/en/">使用条款</a>”。</span> </p> <p> <br /> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页