精华内容
下载资源
问答
  • Android 7.0+ 抓包https方案,突破ssl-pinning 使用方法:https://blog.csdn.net/u014644574/article/details/104930877
  • 由于Android系统对SSL重协商是有限支持,所以部分系统版本抓包会失败,表现为网络异常。在Android 8.1以下,SslSocket是完全支持SSL重协商的,但是SSLEngine却是不支持SSL重协商的,而HttpCanary解析SSL/TLS使用的是...

    HTTP协议发展至今已经有二十多年的历史,整个发展的趋势主要是两个方向:效率和安全。效率方面,从HTTP1.0的一次请求一个连接,到HTTP1.1的连接复用,到SPDY/HTTP2的多路复用,到QUIC/HTTP3的基于UDP传输,在效率方面越来越高效。安全方面,从HTTP的明文,到HTTP2强制使用TLSv1.2,到QUIC/HTTP3强制使用TLSv1.3,越来越注重数据传输的安全性。总而言之,HTTP协议的发展对用户是友好的,但是对开发者而言却不那么友善。

    抓包是每个程序员的必修技能之一,尤其是在接口调试和程序逆向方面具有广阔的用途。但是,随着越来越多的通信协议使用加密的HTTPS,而且系统层面也开始强制规定使用HTTPS,抓包似乎是显得越来越难了。

    本篇博客,主要详解Android平台下,HTTPS抓包的常见问题以及解决办法。工欲善其事必先利其器,博客中以HttpCanary作为抓包工具进行讲解。更多HttpCanary的资料,请见:github.com/MegatronKin…

    1. 抓包原理

    几乎所有网络数据的抓包都是采用中间人的方式(MITM),包括大家常用的Fiddler、Charles等知名抓包工具,HttpCanary同样是使用中间人的方式进行抓包。

    从上面这个原理图,可以看出抓包的核心问题主要是两个:

    • MITM Server如何伪装成真正的Server;
    • MITM Client如何伪装成真正的Client。

    第一个问题,MITM Server要成为真正的Server,必须能够给指定域名签发公钥证书,且公钥证书能够通过系统的安全校验。比如Client发送了一条https://www.baidu.com/的网络请求,MITM Server要伪装成百度的Server,必须持有www.baidu.com域名的公钥证书并发给Client,同时还要有与公钥相匹配的私钥。

    MITM Server的处理方式是从第一个SSL/TLS握手包Client Hello中提取出域名www.baidu.com,利用应用内置的CA证书创建www.baidu.com域名的公钥证书和私钥。创建的公钥证书在SSL/TLS握手的过程中发给Client,Client收到公钥证书后会由系统会对此证书进行校验,判断是否是百度公司持有的证书,但很明显这个证书是抓包工具伪造的。为了能够让系统校验公钥证书时认为证书是真实有效的,我们需要将抓包应用内置的CA证书手动安装到系统中,作为真正的证书发行商(CA),即洗白。这就是为什么,HTTPS抓包一定要先安装CA证书。

    第二个问题,MITM Client伪装成Client。由于服务器并不会校验Client(绝大部分情况),所以这个问题一般不会存在。比如Server一般不会关心Client到底是Chrome浏览器还是IE浏览器,是Android App还是iOS App。当然,Server也是可以校验Client的,这个后面分析。

    2. 安装CA证书

    抓包应用内置的CA证书要洗白,必须安装到系统中。而Android系统将CA证书又分为两种:用户CA证书和系统CA证书。顾明思议,用户CA证书是由用户自行安装的,系统CA证书是由系统内置的,很明显后者更加真实有效。

    系统CA证书存放在/etc/security/cacerts/目录下,名称是CA证书subjectDN的Md5值前四位移位取或,后缀名是.0,比如00673b5b.0。考虑到安全原因,系统CA证书需要有Root权限才能进行添加和删除。

    对于非Root的Android设备,用户只能安装用户CA证书。

    无论是系统CA证书还是用户CA证书,都可以在设置->系统安全->加密与凭据->信任的凭据中查看:

    3. Android 7.0的用户CA证书限制

    Android从7.0开始系统不再信任用户CA证书(应用targetSdkVersion >= 24时生效,如果targetSdkVersion < 24即使系统是7.0+依然会信任)。也就是说即使安装了用户CA证书,在Android 7.0+的机器上,targetSdkVersion >= 24的应用的HTTPS包就抓不到了。

    比如上面的例子,抓包工具用内置的CA证书,创建了www.baidu.com域名的公钥证书发给Client,系统校验此证书时发现是用户CA证书签发的,sorry。。。

    那么,我们如果绕过这种限制呢?已知有以下四种方式(低于7.0的系统请忽略):

    3.1 AndroidManifest中配置networkSecurityConfig

    如果我们想抓自己的App,只需要在AndroidManifest中配置networkSecurityConfig即可:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest ... >
        <application android:networkSecurityConfig="@xml/network_security_config"
                        ... >
            ...
        </application>
    </manifest>
    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <base-config cleartextTrafficPermitted="true">
            <trust-anchors>
                <certificates src="system" />
                <certificates src="user" />
            </trust-anchors>
        </base-config>
    </network-security-config>
    复制代码

    这样即表示,App信任用户CA证书,让系统对用户CA证书的校验给予通过。更多相关信息,详见Network security configuration

    3.2 调低targetSdkVersion < 24

    如果想抓一个App的包,可以找个历史版本,只需要其targetSdkVersion < 24即可。然而,随着GooglePlay开始限制targetSdkVersion,现在要求其必须>=26,2019年8月1日后必须>=28,国内应用市场也开始逐步响应这种限制。绝大多数App的targetSdkVersion都将大于24了,也就意味着抓HTTPS的包越来越难操作了。

    3.3 平行空间抓包

    如果我们希望抓targetSdkVersion >= 24的应用的包,那又该怎么办呢?我们可以使用平行空间或者VirtualApp来曲线救国。平行空间和VirtualApp这种多开应用可以作为宿主系统来运行其它应用,如果平行空间和VirtualApp的targetSdkVersion < 24,那么问题也就解决了。

    在此,我推荐使用平行空间,相比部分开源的VirtualApp,平行空间运行得更加稳定。但必须注意平行空间的版本4.0.8625以下才是targetSdkVersion < 24,别安装错了。当然,HttpCanary的设置中是可以直接安装平行空间的。

    3.4 安装到系统CA证书目录

    对于Root的机器,这是最完美最佳的解决方案。如果把CA证书安装到系统CA证书目录中,那这个假CA证书就是真正洗白了,不是真的也是真的了。由于系统CA证书格式都是特殊的.0格式,我们必须将抓包工具内置的CA证书以这种格式导出,HttpCanary直接提供了这种导出选项。

    操作路径:设置 -> SSL证书设置 -> 导出HttpCanary根证书 -> System Trusted(.0)

    PS. 很不幸的HttpCanary v2.8.0前导出的证书名称可能不正确,建议升级到v2.8.0以上版本操作。

    导出.0格式的证书后,可以使用MT管理器将.0文件复制到/etc/security/cacerts/目录下,或者通过adb remount然后push也可(这里稍微提一下,别在sdcard里找这个目录)。

    4. Firefox证书安装

    火狐浏览器Firefox自行搞了一套CA证书管理,无论是系统CA证书还是用户CA证书,Firefox通通都不认可。这种情况,我们需要将CA证书通过特殊方式导入到Firefox中,否则Firefox浏览网页就无法工作了。

    HttpCanary v2.8.0版本提供了Firefox证书导入选项。在设置 -> SSL证书设置 -> 添加HttpCanary根证书至Firefox 中:

    点击右上角复制按钮将url复制到粘贴板,然后保持此页面不动,打开Firefox粘贴输入复制的url。

    出现下载证书弹框后,一定要手动勾上:信任用来标志网站和信任用来标志电子邮件用户。然后确定即可。

    5. 公钥证书固定

    证书固定(Certificate Pinning)是指Client端内置Server端真正的公钥证书。在HTTPS请求时,Server端发给客户端的公钥证书必须与Client端内置的公钥证书一致,请求才会成功。

    在这种情况下,由于MITM Server创建的公钥证书和Client端内置的公钥证书不一致,MITM Server就无法伪装成真正的Server了。这时,抓包就表现为App网络错误。已知的知名应用,比如饿了么,就采用了证书固定。

    另外,有些服务器采用的自签证书(证书不是由真正CA发行商签发的),这种情况App请求时必须使用证书固定。

    证书固定的一般做法是,将公钥证书(.crt或者.cer等格式)内置到App中,然后创建TrustManager时将公钥证书加进去。很多应用还会将内置的公钥证书伪装起来或者加密,防止逆向提取,比如饿了么就伪装成了png,当然对公钥证书伪装或者加密没什么太大必要,纯粹自欺欺人罢了。

    证书固定对抓包是个非常麻烦的阻碍,不过我们总是有办法绕过的,就是麻烦了点。

    5.1 JustTrustMe破解证书固定

    Xposed和Magisk都有相应的模块,用来破解证书固定,实现正常抓包。

    例如:github.com/Fuzion24/Ju…

    破解的原理大致是,Hook创建SSLContext等涉及TrustManager相关的方法,将固定的证书移除。

    5.2 基于VirtualApp的Hook机制破解证书固定

    Xposed和Magisk需要刷机等特殊处理,但是如果不想刷机折腾,我们还可以在VirtualApp中加入Hook代码,然后利用VirtualApp打开目标应用进行抓包。当然,有开发者已经实现了相关的功能。详见:

    不过,这里CertUnpinning插件的代码有点问题,要改改。

    5.3 导入真正的公钥证书和私钥

    如果Client固定了公钥证书,那么MITM Server必须持有真正的公钥证书和匹配的私钥。如果开发者具有真正服务端的公钥证书和私钥,(比如百度的公钥证书和私钥百度的后端开发肯定有),如果真有的话,可以将其导入HttpCanary中,也可以完成正常抓包。

    在设置 -> SSL证书设置 -> 管理SSL导入证书 中,切换到服务端,然后导入公钥证书+私钥,支持.p12和.bks格式文件。

    6. 双向认证

    SSL/TLS协议提供了双向认证的功能,即除了Client需要校验Server的真实性,Server也需要校验Client的真实性。这种情况,一般比较少,但是还是有部分应用是开启了双向认证的。比如匿名社交应用Soul部分接口就使用了双向认证。使用了双向认证的HTTPS请求,同样无法直接抓包。

    关于双向认证的原理。

    首先,双向认证需要Server支持,Client必须内置一套公钥证书 + 私钥。在SSL/TLS握手过程中,Server端会向Client端请求证书,Client端必须将内置的公钥证书发给Server,Server验证公钥证书的真实性。

    注意,这里的内置的公钥证书有区别于前面第5点的公钥证书固定,双向认证内置的公钥证书+私钥是额外的一套,不同于证书固定内置的公钥证书。

    如果一个Client既使用证书固定,又使用双向认证,那么Client端应该内置一套公钥证书 + 一套公钥证书和私钥。第一套与Server端的公钥证书相同,用于Client端系统校验与Server发来的证书是否相同,即证书固定;第二套SSL/TLS握手时公钥证书发给Server端,Server端进行签名校验,即双向认证。

    用于双向认证的公钥证书和私钥代表了Client端身份,所以其是隐秘的,一般都是用.p12或者.bks文件+密钥进行存放。由于是内置在Client中,存储的密钥一般也是写死在Client代码中,有些App为了防反编译会将密钥写到so库中,比如S匿名社交App,但是只要存在于Client端中都是有办法提取出来的。

    6.1 双向认证抓包

    这里以S匿名社交App为例,讲解下如何抓取使用了双向认证的App的HTTPS包。

    如果服务器使用了Nginx且开启了双向认证,抓包时会出现400 Bad Request的错误,如下:

    有些服务器可能不会返回404,直接请求失败。

    接下来看,如何使用HttpCanary配置双向认证抓包。

    首先,解压APK,提取出.p12或者.bks文件,二进制的文件一般存放都在raw或者assets目录。

    将client.p12文件导入手机,然后在HttpCanary的设置 -> SSL证书设置 -> 管理SSL导入证书中,切换到客户端(因为需要配给MITM Client),然后导入.p12文件。

    由于双向认证的公钥证书和私钥是受密钥保护的,所以需要输入密码:

    一般通过逆向可以从APK中提取出密钥,具体操作这里略过。输入密钥后,需要输入映射域名,这里使用通配符*映射所有相关域名:

    导入完成后如下:

    可以点进证书详情查看细节,这个client.p12文件包含公钥证书和私钥,是用于双向认证的。

    配置完成后,重新进行抓包,看看效果。

    可以看到,之前400 Bad Request的两个要求双向认证的请求成功了!

    7. SSL重协商

    有些服务器可能会开启SSL重协商,即SSL/TLS握手成功后发送请求时服务器会要求重新握手。这种情况一般比较少,但是也不排除,已知的应用比如 10000社区 就使用了SSL重协商。

    由于Android系统对SSL重协商是有限支持,所以部分系统版本抓包会失败,表现为网络异常。在Android 8.1以下,SslSocket是完全支持SSL重协商的,但是SSLEngine却是不支持SSL重协商的,而HttpCanary解析SSL/TLS使用的是SSLEngine。在Android 8.1及以上,SSLEngine和SslSocket统一了实现,故是支持SSL重协商的。

    所以,如果确认服务器使用了SSL重协商,请使用8.1及以上版本系统进行抓包。

    8. 非HTTP协议抓包

    如果确认了以上几点,HttpCanary仍然抓包失败,那么极有可能使用的并非是HTTP协议。比如像微信聊天,视频直播等,使用的就不是HTTP协议,这种情况需要使用其它的抓包工具,比如Packet Capture这种直接解析TCP/UDP协议的,但是往往非HTTP协议的数据包即使抓到了也无法解析出来,因为大概率都是二进制而非文本格式的。

    9. 结语

    抓包是个技术活儿,需要对网络协议有大致的了解,对抓包感兴趣的同学可以多查阅TCP、UDP、SSL/TLS、HTTP等相关资料。

    HttpCanary是专业的HTTP协议抓包工具,专注HTTP协议三十年(吹过头了),不过目前还不支持QUIC/HTTP3这种新协议,等QUIC/HTTP3正式应用起来再说吧。

    转载于:https://juejin.im/post/5cc313755188252d6f11b463

    展开全文
  • 1、下载安装逍遥模拟器 2、模拟器允许root 3、安装charles,下载证书 4、使用...本机ip:8888 (走charles抓包) 9、用浏览器打开https网站抓包,看是否报证书错误,如果没有报错且能在charles中看到请求,配置成功!

    1、下载安装逍遥模拟器

    2、模拟器允许root

    3、安装charles,下载证书,保存为charles.pem
    在这里插入图片描述

    4、用md5方式显示pem证书的hash值

    查看openssl版本

    openssl version
    

    openssl版本在1.0以上的版本的执行这一句

    openssl x509 -inform PEM -subject_hash_old -in charles.pem
    

    openssl版本在1.0以下的版本的执行这一句

    openssl x509 -inform PEM -subject_hash -in charles.pem
    

    生成hash值,如:17933634, 将charles.pem文件改名为 17933634.0
    在这里插入图片描述

    5、 将刚刚改名的pem文件17933634.0 拷贝到安卓模拟器/system/etc/security/cacerts/目录。
    以adb方式为例:

    adb root
    adb remount
    adb push 17933634.0 /sdcard/
    adb shell
    mv /sdcard/17933634.0 /system/etc/security/cacerts/
    chmod 644 /system/etc/security/cacerts/17933634.0
    

    7、重启手机

    8、配置手机ip代理,本机ip:8888 (走charles抓包)

    9、用浏览器打开https网站抓包,看是否报证书错误,如果没有报错且能在charles中看到请求,配置成功!

    展开全文
  • 前阵子有同学反馈Flutter中的http请求无法通过fiddler抓包,作者喜欢使用Charles抓包工具,于是抽时间写了个小demo测试了一下,结论是在手机上设置代理,Charles确实抓不到请求数据包。于是对该问题进行了分析: ...
  • Android/iOS下进行抓包,往往考虑提权使用tcpdump、fiddle等工具走wifi代理或者开热点在热点上进行抓包…这些方案执行起来搭建环境或者成本都较高。 推荐一款APP支持Android/iOS抓包,APP本身除了抓包,是提供网络...

    在Android/iOS下进行抓包,往往考虑提权使用tcpdump、fiddle等工具走wifi代理或者开热点在热点上进行抓包…这些方案执行起来搭建环境或者成本都较高。

    推荐一款APP支持Android/iOS抓包,APP本身除了抓包,是提供网络模拟的功能,用于测试。

    下载地址:
    Android:https://android.myapp.com/myapp/detail.htm?apkName=com.tencent.qnet&info=F6E0352A73E160B0F936C1C51390A19A
    iOS:https://apps.apple.com/cn/app/id1541108317

    展开全文
  • Android手机上对https请求进行抓包

    万次阅读 多人点赞 2021-05-23 12:01:42
    前段时间跟QQ群里的群友聊天时无意聊到了抓包的话题。抓包可以说是程序员日常开发调试问题的一个重要手段,可以帮助我们理清客户端与服务器之间的数据传输问题,以便于甩锅。 在过去,网络请求基本都是靠的http协议...

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每个工作日都有文章更新。

    前段时间跟QQ群里的群友聊天时无意聊到了抓包的话题。抓包可以说是程序员日常开发调试问题的一个重要手段,可以帮助我们理清客户端与服务器之间的数据传输问题,以便于甩锅。

    在过去,网络请求基本都是靠的http协议,那个时候的抓包是一件非常简单的事情。然而这几年,http协议在逐渐被淘汰,几乎所有的网络请求都变成了https协议,这就使事情变得复杂了。

    群里一位朋友说,https是不可能被抓包的,不然怎么保证https传输的安全性,毕竟那么多大公司都在用这个协议来传输重要的数据。

    这其实是一个比较有意思的话题,https确实是非常安全的。但同时,https也确实是可以抓包的,它们两者之间并不冲突。

    考虑到仍然有许多朋友在这方面还有些不太了解,我准备写两篇文章来讲讲https抓包的相关知识。本篇文章先讲实践,教大家如何在Android手机上对https请求进行抓包。下一篇文章会讲原理,我们一起解析一下,为什么如此安全的https协议却仍然可以被抓包呢?

    那么先从实践看起吧。

    抓包工具的使用

    要对网络请求进行抓包,首先肯定要选择一个抓包工具才行。

    专业的抓包工具有很多,根据我的观察,国内的大多数开发者都比较喜欢用Charles这个工具来进行抓包。不过我个人更喜欢用Fiddler这个工具,而且我们平时工作时如果要进行抓包也都是用的Fiddler。因为Fiddler和微软内部的日志分析工具是相互兼容的,并且Fiddler的作者也在微软工作。

    那么本篇文章我都会以Fiddler这个工具来进行举例讲解,当然如果你习惯用Charles也完全没有问题,只是在工具的操作上可能会有所区别,原理是完全相同的。

    首先需要在你的电脑上安装Fiddler,这个工具是完全免费的,下载地址是:

    https://www.telerik.com/fiddler/fiddler-everywhere

    安装完成之后登录一下就可以使用了,它会自动抓取你当前这台电脑上的所有网络请求包。

    但是如果我们想要抓取手机上的网络请求,那么还需要做点额外的配置才行。

    首先从Fiddler顶部工具栏依次点击View -> Preferences -> Connections,将会看到如下所示界面:


    这里有两点需要注意,一个是端口号,默认值是8866,如果没有什么特殊需求的话可以不用修改。

    第二个是Allow remote computers to connect这个选项是一定要勾上的,不然手机上的网络请求将无法抓到。

    勾上第二个选项,点击SAVE,这样电脑端的配置就完成了。

    接下来我们还需要在手机端进行一些简单的配置。

    要确保的是,你的手机和用于抓包的这台电脑必须在同一个局域网下。

    然后修改手机当前连接Wifi的高级选项,将代理类型改为手动,将代理主机名改成电脑的ip地址,将代理端口改成8866,如下图所示:

    点击保存即可。

    完成以上配置之后,其实我们就可以使用Fiddler来对手机上的网络请求进行抓包了。不信你可以试一试在手机的浏览器上访问以下地址:

    http://guolin.tech/api/china/

    应该会看到如下界面:

    然后再到Fiddler中查看一下,你就能发现刚才手机上的网络请求包已经成功被Fiddler抓到了(有时Fiddler中显示的包信息过多,不方便查看,可以使用Ctrl+X清空信息):

    可以看到,这条网络请求的所有细节在Fiddler中一览无余,包括请求的头信息,响应的头信息,响应的body内容等等。

    抓包工具将网络通讯的背后细节全部搬到了台面上,这样当客户端和服务器遇到联调问题时,到底是客户端的锅还是服务器的锅,看一看抓出来的包就全部清楚了。

    以上就是抓包工具最传统的用法,然而这种用法现在已经不那么好使了,因为还在使用http协议的网络请求已经越来越少,绝大部分的网络请求都变成了https协议。

    对https请求进行抓包

    https协议是一种加密传输的网络协议,所传输的数据不再是以明文的方式来传输,而都是加密过后再进行传输的。

    这种协议保障了用户的数据安全,但对于抓包而言却是一件苦恼的事情。因为数据都加密了呀,我们抓到的包也都是一些密文信息,所以根本就无法用于定位问题。

    比如我们可以尝试在手机浏览器中访问一下必应,然后观看Fiddler中抓到的包信息,如下图所示:

    可以看到,Fiddler虽然能够捕获到访问必应的网络请求,但是却无法解密出具体的传输内容,这种包对于我们分析问题并没有任何帮助。

    那么对于https请求的网络包我们到底要怎么抓呢?别担心,Fiddler是支持这个功能的,下面跟着我一步步操作就行。

    首先需要在Fiddler中开启https抓包功能,从Fiddler顶部工具栏依次点击View -> Preferences -> HTTPS。

    在HTTPS设置页面中,先点击Trust root certificate来安装证书,然后勾选Capture HTTPS traffic选项,如下图所示:

    点击SAVE保存,这样你就可以抓到电脑上https请求的包了。

    但是手机上https请求的包我们还是抓不到的,你可以试试再次在手机上访问必应,将会看到如下界面:

    出现这种错误基本都是证书的原因导致的,在下篇文章中我会详细分析这个错误出现的原因,本篇文章中我们先将它解决就好了。

    在你的手机浏览器中访问如下地址:

    http://ipv4.fiddler:8866/

    将会看到一个由Fiddler内置的网页:

    点击FiddlerRoot certificate这个链接,下载并安装由Fiddler提供的手机证书。

    安装完成之后再次访问必应,你就会发现不会再报错了,而是可以正常显示出网页的内容:

    然后观察Fiddler,可以看到,请求必应首页的网络包也被成功抓到了,而且这次不再是密文,而是解密后的数据:

    对https请求的抓包问题,就这样解决了!

    对Android应用进行抓包

    如此看来,https抓包貌似也并不是一件难事。

    没错,但还有一个细节需要大家注意。上述方案只适用于对浏览器中的网络请求进行抓包,如果你是想要对其他应用程序的网络请求抓包的话,仍然还是抓不到的。

    为了证实这一点,我们就来新建一个应用程序,并编写一段最简单的网络请求代码,看看到底能不能抓到它发出的网络请求。

    整个程序非常简单,我们在MainActivity中加入一个按钮,当点击按钮时就发起一个网络请求,代码如下所示:

    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            val button: Button = findViewById(R.id.button)
            button.setOnClickListener {
            	sendRequest()
            }
        }
    
        private fun sendRequest() {
            thread {
                var connection: HttpURLConnection? = null
                try {
                    val response = StringBuilder()
                    val url = URL("https://www.bing.com")
                    connection = url.openConnection() as HttpURLConnection
                    val input = connection.inputStream
                    val reader = BufferedReader(InputStreamReader(input))
                    reader.use {
                        reader.forEachLine {
                            response.append(it)
                        }
                    }
                    Log.d("TAG", response.toString())
                } catch (e: Exception) {
                    e.printStackTrace()
                } finally {
                    connection?.disconnect()
                }
            }
        }
    
    }
    

    没错,总共就这么多代码。但是不要忘记我们还得在AndroidManifest.xml中声明网络权限:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.capturetest">
    
        <uses-permission android:name="android.permission.INTERNET" />
        ...
    
    </manifest>
    

    好了,现在来运行一下程序看一看效果吧。点击界面上的按钮,会向必应主页发起一条网络请求,然后观察Fiddler中的数据包:

    可以看到,我们是无法像之前在浏览器中那样,成功抓到并解析出https请求的包信息的。

    为什么会这样呢?这是因为Android在7.0系统中进行了一项安全升级。从Android 7.0系统开始,只是在手机上安装了抓包工具的证书,仍然是无法对https请求进行抓包的,还必须要在应用程序的代码中加入一段网络安全配置才行。

    这项升级使得每个应用程序都变得更加安全,因为对https抓包确实是一个比较危险的行为,所有加密传输的数据都以明文的形式展示出来了。当然,如果是为了调试程序而抓包,这算是一个正当理由,但是你也理应只能对自己的程序进行抓包调试而已。如果只要在手机上安装了证书就可以对所有App的https请求进行抓包,那么无疑大大降低了这些App的安全性。

    因此,Android 7.0系统中才做了这项安全升级。默认情况下,我们无法对各个App的https请求进行抓包,如果你是想要对自己App的https请求抓包的话,那么可以这样做。

    在res/xml目录下创建一个network_security_config.xml文件,然后加入如下配置:

    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <base-config cleartextTrafficPermitted="true">
            <trust-anchors>
                <certificates src="user"/>
                <certificates src="system"/>
            </trust-anchors>
        </base-config>
    </network-security-config>
    

    接下来还需要在AndroidManifest.xml中配置android:networkSecurityConfig属性来让上述配置生效:

    <application
        ...
        android:networkSecurityConfig="@xml/network_security_config">
        ...
    </application>
    

    这样我们就可以对当前的应用程序发出的https网络请求进行抓包了。

    重新运行一下程序,让我们再来试试吧,结果如下图所示:

    结果正如我们预期的那样工作了。

    最后一个小疑惑

    那么本篇文章的内容到这里就差不多该结束了。

    但是不知道大家有没有产生一个小疑惑,既然是从Android 7.0开始必须要在自己的应用程序中加入网络安全配置才能对https请求抓包,为什么我们一开始在浏览器中什么都没配,却也成功抓到了https请求的网络包呢?

    这个问题其实让我困惑了很久,直到现在加入了微软Edge项目组才终于解开了这个疑惑。

    Edge是一款基于Chromium内核的浏览器,Chrome也是,许多主流的浏览器都是。其实答案一直都在Chromium的源码中,只是我之前从来没有勇气去看过。

    我们来查看一下Chromium源码中的AndroidManifest.xml文件,部分代码如下图所示:

    可以看到,Chromium的源码中也加入了一段android:networkSecurityConfig配置,那么我们继续跟进去看看里面到底配置了什么:

    这不是和我们刚才在Demo中配置的内容一模一样吗?

    自此真相大白了,原来之所以浏览器不需要做额外的配置也能对https请求进行抓包,是因为Chromium源码中已经对此做好了配置,而所有基于Chromium内核的浏览器也就都自动拥有了这个功能。

    如果你想要在线查看Chromium的源码,可以访问这个地址:

    https://source.chromium.org/

    好了,本篇文章的内容就到这里。相信看完这篇文章,会对大家平时的网络开发与调试工作产生一定的帮助。

    解决了怎么用的问题,接下来就要去了解原理了。下篇文章中我们来一起探讨一下为什么传说中如此安全的https协议却仍然可以被抓包呢?点击这里继续阅读下篇文章

    另外,如果想要学习Kotlin和最新的Android知识,可以参考我的新书 《第一行代码 第3版》点击此处查看详情

    关注我的技术公众号,每个工作日都有优质技术文章推送。

    微信扫一扫下方二维码即可关注:

    展开全文
  • 问题: ...以上这篇解决Charles抓包https时,无法查看CONNECT请求的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文章:安卓APP测试之
  • 安卓APP抓包之双向认证突破 安卓应用层抓包通杀脚本
  • Android平台HTTPS抓包方案

    千次阅读 2020-05-27 09:32:29
    本篇文章转自MegatronKing的博客,分享了Android中https抓包相关的解决方案,希望对大家有所帮助! 原文地址: https://juejin.im/post/5cc313755188252d6f11b463 / 前言 / HTTP协议发展至今已经有二十多年的历史...
  • application android:networkSecurityConfig="@xml/network_security_config" ... > ... </application> <?xml version="1.0" encoding="utf-8"?> <network-securi.
  • 安卓手机抓包方法归纳总结

    万次阅读 2019-07-17 16:25:44
    安卓手机抓包方法归纳总结 最近需要对安卓应用发出的网络数据进行抓包分析,除了常见的HTTP还包括MQTT协议。 本文总结归纳了。手机端抓包的各种方法和思路 0x01 wireshark方案 在PC端抓过包的人一定不会对Wireshark...
  • 抓包的重要性 网络抓包,是Android应用逆向分析的重中之重,很多时候我们拿到一个APP,不知道从何入手分析,往往是从抓包开始,先弄...
  • 原文链接 干货|Android App无法抓包的解决方案总结 如果对文章感兴趣,可以扫一扫微信二维码关注作者的微信公众号,后续会推送更多干货文章,感谢您的支持。
  • Android抓包总结

    2020-02-03 23:36:27
    Android抓包总结 转载自:Android抓包总结 - 先知社区 https://xz.aliyun.com/t/6551 Se8s0n/2019-10-19 10:22:01/ 前言 这篇文章算是总结一下我之前抓包遇到的一些问题, 个人属性里带bug, 所以遇到的问题会...
  • 当升级targetSdkVersion 到 28 后发现在 Android 7.0 以上机型不能抓包了。上网搜了一下有很多解决方案,但都有弊端,最后参考墙外的一篇文章找到了一个最优解决方案 方案一: 1.添加res/xml/network_security_...
  • 如果想一个App的,可以找个历史版本,只需要其targetSdkVersion < 24即可。然而,随着GooglePlay开始限制targetSdkVersion,现在要求其必须>=26,2019年8月1日后必须>=28,国内应用市场也开始逐步响
  • 不能抓包的原因Android7.0 之后默认不信任用户添加到系统的CA证书:To provide a more consistent and more secure experience across the Android ecosystem, beginning with Android Nougat, compatible devices ...
  • 最近在开发项目的时候,出现了一些问题,就想到通过Fiddler来抓个包分析一下定位一下错误,折腾到半夜终于搞定了,这里记录一下,看了几个博客坑太多这里... 简单的说它是一个强大抓包工具你也可以理解为它是一个we...
  • Android抓包指南①: 使用Fiddler抓HTTP/HTTPS包

    万次阅读 多人点赞 2019-05-24 02:28:35
    网络抓包,是Android应用逆向分析的重中之重,很多时候我们拿到一个APP,不知道从何入手分析,往往是从抓包开始,先弄清楚他与服务器通信的内容,如果一目了然,我们完全可以照搬,自行写一个程序来模拟,如果有一些...
  • Android高版本HTTPS抓包解决方案及问题分析.docx
  • 微信团队了安全,安卓的微信7.0版本值信任自己内置的ssl证书,不信任用户自己安装的证书,导致抓包工具抓取https页面时,访问空白。 既然玩机,就要学会root啦! 2.解决原理: 把SSL证书安装到系统。 三、开始 第一...
  • Android7 https 抓包

    2021-06-05 06:02:35
    因此,即便我们安装证书后也无法愉快地抓包了:confused:但是这一限制仅对 targetSdkVersion>=24 的应用生效。下面提供几种方案绕过这一限制。添加证书信任本方案需要修改 AndroidManifest,推荐用于自己的应用,...
  • 安卓抓包,为何总是 Tunnel to?

    千次阅读 2019-05-04 14:08:00
    爬取安卓 APP 的内容第一步总离不开抓包,自己以前对 APP 抓过包,原本以为这一关很容易,结果让我弄了好几天,期间还差点怀疑自己是不是选错了方向,还好有大佬帮忙,在此感谢几位大佬对我的帮助,自己终于迈出了第...
  • / 今日科技快讯 /近日,据CNET报道,电信行业解决方案联盟(ATIS)本周宣布,苹果已经加入了其Next G Alliance,该行业组织致力于“在未来十年内推动北美移动技术...
  • 修改Android源码,解放HTTPS抓包

    千次阅读 2019-09-23 17:24:22
    文章目录为什么HTTPS不能抓包了?如何解决这一问题?基本的几个思路寻求一个适合自己的办法如何改Android源码准备工作分析源码修改相关源码刷机验证 为什么HTTPS不能抓包了? Google在Android 7.0以后的版本中,添加...
  • 安卓环境抓包实现方法方案实现 方案 solution A: 基于Fiddler的代理抓包方法 solution B: 基于安卓环境和PacketCapture的抓包方法 solution C: 基于MuMu模拟器和Bandicam的截屏方式 实现 基于Fiddler的代理抓包...
  • 安卓7.0+高版本 fiddler抓包失败的解决方案安卓模拟器(手机)高版本 fiddler抓包的解决方案资料查阅准备一个有root权限的手机或者模拟器删除旧版证书(如果没有就跳过)重新导出FD证书安装git(如果有就可以跳过了)安装 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,240
精华内容 3,296
关键字:

安卓抓包方案