JB的测试之旅-听说安卓微信7.0不能抓https?

栏目: 服务器 · 发布时间: 5年前

内容简介:最近公司有个小程序要提测,因为之前反馈过使用Ip测试的时候,端口响应太慢了,因此这次改成了域名的方式 ;研发提测,体验,发现有个疑似bug的东西,想着抓包看下是不是接口数据的问题,结果问题出现了,按照以前的常规操作,打开fiddler,设置ip代理(https证书已经安装了),结果一看,fiddler居然这样显示:再看看手机,居然没数据?:

最近公司有个小程序要提测,因为之前反馈过使用Ip测试的时候,端口响应太慢了,因此这次改成了域名的方式 ;

研发提测,体验,发现有个疑似bug的东西,想着抓包看下是不是接口数据的问题,结果问题出现了,按照以前的常规操作,打开fiddler,设置ip代理(https证书已经安装了),结果一看,fiddler居然这样显示:

JB的测试之旅-听说安卓微信7.0不能抓https?

再看看手机,居然没数据?:

JB的测试之旅-听说安卓微信7.0不能抓https?

一脸疑问号,一开始以为是自己问题,折腾半天,不对,之前都是没问题的话,同样的环境,同样的设备,有毒?

JB的测试之旅-听说安卓微信7.0不能抓https?

等下,之前的没问题,最近 微信好像更新了7.0 ,那是不是这个导致的?

怎么解决?

一开始遇到这问题,不知道怎么处理,满脑子想着就是 安装低版本微信 ,但是用过安卓系统的同学都知道,4.X以后系统不允许降级安装,如果要安装低版本微信,意味着要删除微信再安装,这样会延伸出另外的问题,删除微信后我的聊天记录跟照片视频怎么办?

问题本身就是如何完整备份微信数据,咨询朋友圈,有不同大佬提供了方式:

  1. 微信-设置-聊天-聊天记录里面有数据迁移的功能

之前功能之前没使用过,但是从描述上看,感觉只能迁移聊天记录,那些图片跟小视频怎么办?

  1. 钛备份数据

这个是另外的同学说的,之前没了解过,上网查了下,这玩意号称是目前为最强悍的程序和系统备份工具,需 ROOT 权限运行;

这就尴尬啦,需要root,小米华为vivo这种不好搞root,怎么办?

那就看看这个钛备份的原理是啥,其实钛备份的原理很简单,就是把整个目录的内容都保存下来,当然包括data里面的数据,这就不难理解为什么要root权限了,当然里面要用到的技术很多,自行网上查询吧;

既然这条路,那就找台测试机安装旧版本试试吧;

安卓微信旧版本

试过好几个网址,最后选择的是wdj,那就挑了个6.7.3来试试了;

JB的测试之旅-听说安卓微信7.0不能抓https?

安装,配置手机抓包环境,试了下;

JB的测试之旅-听说安卓微信7.0不能抓https?

你看吧,都说旧版本可以的,你们不信,打脸了吧?

JB的测试之旅-听说安卓微信7.0不能抓https?

别人中毒了吗?

这问题肯定不止jb一个人遇到的,直接Google了, 微信小程序无法抓包 ,果不出其然,大家都中毒了;

JB的测试之旅-听说安卓微信7.0不能抓https?
JB的测试之旅-听说安卓微信7.0不能抓https?

很开心,原因我不是一个人,认真看下该问题,咦,原来都是因为 微信7.0导致 的,跟我一样啊啊啊;

那再用 微信7.0无法抓包https 为关键字,又发现新的东西了;

JB的测试之旅-听说安卓微信7.0不能抓https?
JB的测试之旅-听说安卓微信7.0不能抓https?

这两张图,认真看到,发现两个有意思的点:

第一点:

  • 安卓系统 7.0 以下版本,不管微信任意版本,都会信任系统提供的证书
  • 安卓系统 7.0 以上版本,微信 7.0 以下版本,微信会信任系统提供的证书
  • 安卓系统 7.0 以上版本,微信 7.0 以上版本,微信只信任它自己配置的证书列表

第二点:

  • 苹果机可以用

看到这里,莫名有点感动;

JB的测试之旅-听说安卓微信7.0不能抓https?

看到这里,第二种解决方案也出现了,用 苹果 就行了;

然后顺延上面的思路,安卓7.0,让jb想起以前的事;

之前我司的一个产品,在新版本也会出现无法抓取http的情况,出现的情形跟上面的一致,直接看当时提交的内容吧;

JB的测试之旅-听说安卓微信7.0不能抓https?

由此看到,的确只有安卓才有问题,而且还是7.0开始引入的;

那一起来看看,这问题根源是什么吧;

问题根源

Google一下,很多类似的帖子,问题的根源是:

在Android7.0及以上的系统中,每个应用可以定义自己的可信CA集集。

默认情况下, 应用只会信任系统预装的CA证书,而不会信任用户安装的CA证书

而回想我们抓包的过程,无论是fiddler还是Charles,想抓https,都必须手机安装对应的证书,通过fiddler/Charles安装的证书恰恰正属于用户安装的CA证书,因此会被视作不安全的证书。

解决方案1:修改APP配置文件

如上代码提交的那样,直接修改APP 的android:networkSecurityConfig 属性,前提是可以获取到APP的源码。

在AndroidManifest.xml中

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

配置文件: 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:将证书安装到系统证书中(需要root)

如果没有源码权限,怎么办?那就把证书安装到系统证书里面,但是这个操作 需要root权限

系统证书的目录是: /system/etc/security/cacerts/

每个证书的命名规则为: <Certificate_Hash>.<Number>

Certificate_Hash 表示证书文件的hash值, Number 是为了防止证书文件的hash值一致而增加的后缀;

证书的hash值可以由命令计算出来,在终端输入 openssl x509 -subject_hash_old -in <Certificate_File> ,其中 Certificate_File 为证书路径,将证书重命名为 hash.0 放入系统证书目录,之后你就可以正常抓包了。

JB的测试之旅-听说安卓微信7.0不能抓https?
JB的测试之旅-听说安卓微信7.0不能抓https?

注意事项

小米手机自带root为不完整root,需要进行完整root(即解锁system)。

方法如下:

安装adb工具

brew install Caskroom/cask/android-platform-tools             
#没有安装homebrew的先安装homebrew
复制代码

root

adb devices # 测试adb是否安装成功,成功了会出现设备的hash值
adb root
adb disable-verity # 禁用系统验证
复制代码

注明,本方法jb未尝试过,因为手机没有root权限,方法来源于网上 ;

还有吗?

当然,假如你的手机没有root,而且也不是自己的APP,那怎么办?

别笑,这种情况很多,比如你想爬别人APP的数据,就会遇到这种情况了;

JB的测试之旅-听说安卓微信7.0不能抓https?

package capture

直接贴ka的介绍,这是一款无root抓包的工具;

产品特点:

  • 抓包并记录
  • 通过中间人技术抓取ssl
  • 不需要root
  • 易于使用
  • 直接显示文本或显示16进制

界面很简单,如下图,下面显示的记录,右上有1的表示只做一个应用,点击会让你选择应用,右边无1的就是全部都抓;

JB的测试之旅-听说安卓微信7.0不能抓https?

如果不是https的能马上看到内容;

JB的测试之旅-听说安卓微信7.0不能抓https?

那试试除微信外的APP,这里会延伸出另外的问题,就算别的APP不对证书做检验,给你抓到又如何? 反正返回的数据是加密的

JB的测试之旅-听说安卓微信7.0不能抓https?

选择微信,试试,发现还是不行,依然没有数据,就跟不信任证书一样;

所以,这个不行;

whistle

whistle 是基于Node实现的跨平台抓包调试代理工具,但是仔细看了下原理,也是通过信任证书实现的,因此还是无法解决上面的问题;

JB的测试之旅-听说安卓微信7.0不能抓https?

AndroidHttpCapture

AndroidHttpCapture 是在testerhome有人提及到的一款软件,号称是Android版的"Fiddler";

官网有demo,下载下来后,看了下,功能是挺全的,但是,怎么感觉有点山寨的感觉?而且好像不能抓某个APP或者所有,对比上面的有点逊色的感觉?弃坑~

JB的测试之旅-听说安卓微信7.0不能抓https?
JB的测试之旅-听说安卓微信7.0不能抓https?

tcpdump + Wireshark

tcpdump 是一款强大的网络抓包工具,运行在 linux 平台上。

熟悉 tcpdump 的使用能够帮助你分析、调试网络数据。

如果想在android上使用tcpdump,就需要root权限,但是jb手机没root权限,这块就跳过,理论上是可行的;

tcpdump是有个文件的,把手机连接到电脑(要有adb环境哈)

adb root
adb remount  
adb push  /wherever/you/put/tcpdump  /system/xbin/tcpdump  
adb shell chmod  6755 /system/xbin/tcpdump
复制代码

然后再执行 adb shell tcpdump -p -vv -s 0 -w /sdcard/capture.pcap ,在手机上进行操作,操作完毕后, Ctrl+C 退出即可;

然后把生成的 capture.pcap 用Wireshark打开;

wireshark的界面是这样的:

JB的测试之旅-听说安卓微信7.0不能抓https?

这里不详细说明了,因为tcpdump+wireshark后面会单独写一篇文章;

反正,这两个组合是个神器,理论上来说,这种情况是能抓到数据的;

VirtualApp + HttpCanary

HttpCanary是一款强大的Android端抓包和注入工具,同样不需要root,软件本身支持安装证书,如果只是单独使用,依然跟其他APP一样;

这里还要介绍另外的一个产品, VirtualApp 是一个开源的Android App虚拟化引擎,允许在其中创建虚拟空间,并在这个虚拟空间中运行其他应用。

简单的说,就是一个容器,可以进行双开处理,市面上很多双开的软件,原理就是这个;

JB的测试之旅-听说安卓微信7.0不能抓https?

点击后,就是双开了,然后再打开HttpCanary进行转包,比如点击微信的小程序,啧啧啧,发现啥了?

JB的测试之旅-听说安卓微信7.0不能抓https?

如果服务端没有加密的话,终于可以了,有点心累啊;

JB的测试之旅-听说安卓微信7.0不能抓https?

最后,把两个apk的下载方式都贴一下:

HttpCanary:
链接:https://pan.baidu.com/s/1ViRJBZrUecdNU8DuegCphQ 
提取码:9jzs 


VirtualApp:
链接:https://pan.baidu.com/s/1k7i87xlY61z8is_foVPmQw 
提取码:kh1y 
复制代码

VirtualApp到底是什么

上面的例子证实VirtualApp + HttpCanary是可以抓到https的包,那这玩意到底是什么啊?为什么就能做到?

要介绍VirtualApp,要先介绍 Java的反射机制

Java的反射机制

举个例子,通过反射修改 private 的成员变量值,调用 private 方法;

public class Person {
    private String mName = "Hello";
    
    private void sayHi() {
        // dont care
    }
}
复制代码

如上的类,有一个私有成员变量 mName ,和一个私有方法 sayHi() 。讲道理,在代码中是无法访问到他们的。但反射能做到。

Person person = new Person();
// person.mName = "world!"; // impossible
// person.sayHi(); // no way

Field fieldName = Person.class.getDeclaredField("mName");
fieldName.setAccessible(true);
fieldName.set(person, "world!");

Method methodSayHi = Person.class.getDeclaredMethod("getDeclaredMethod");
methodSayHi.setAccessible(true);
methodSayHi.invoke(person);
复制代码

简单来说,反射就是可以做到调用私有变量、方法的效果,还是不懂?

在来个通俗的例子:

对于男生,去嫖娼:

妈咪是class类,小姐是私有方法或成员,因为扫黄的关系,现在的小姐都是私有的,但是呢,你还是可以通过妈咪来找到小姐,这里面,通过妈咪的方式就是反射啦~
复制代码

对于女生,买包包:

很多名牌店里面有一条潜规则,有点瑕疵的产品,内部人员是可以低价购买的,但是一般人是买不到的,那如果你有闺蜜在里面工作或者有熟人的情况下,你就可以通过这个渠道来买到这些瑕疵产品,这这个能方式就是反射;
复制代码

反正就是不能光明正大做的,然后有个代理,可以这样做,你通过代理去做,就行啦;

这懂了吧?

JB的测试之旅-听说安卓微信7.0不能抓https?

hook

hook是什么?hook就是在应用运行过程中,注入外部的代码,从而改变原有的执行流程。

因此,应用中必须存在注入代码的窗口。

例如,使用了热修复技术的应用,就是在启动时加载并应用外部的补丁代码,这类应用便是本身自带了注入代码的窗口。

但是,对于逆向分析或安全研究而言,所面对的通常是一个黑盒App,我们并不知道其是否存在注入代码的窗口,或者存在但无法被利用。

为此,我们必须要额外地为应用添加注入代码的窗口。

Xposed便是这样做的: 它修改了系统库,对所有应用在启动时添加了注入窗口。但是,这就需要具有root权限。

那么,如何在不具有root权限的情况下实现呢?这就需要用到VirtualApp了。

VirtualApp的工作原理,简而言之, 它通过代理常用系统服务的方式,在系统服务层与应用层之间添加了一层虚拟空间,从而允许在不安装应用的情况下运行应用。特别地,VirtualApp本身并不需要root权限。

VirtualApp之所以能够实现虚拟空间,是因为其对许多系统服务进行了代理和替换,而这部分是核心;

如果对原理感兴趣的同学,可以点击此处了解更多;

试试看

启动VirtualApp后,界面是这样的。

JB的测试之旅-听说安卓微信7.0不能抓https?

显示的是已经通过VirtualApp安装的APK,可以直接从SD卡或者系统中已有的APK中选择安装。安装后直接点开图标,就能跟安装在外部的应用一样打开APP。

简单尝试了一下,知乎和微博都能正常工作,并且运行速度跟外部安装的差异不大。而且还可以安装多个相同的应用,实现多开的效果。

看下数据

首先,来看一下它在开启APP后的进程信息:

u0_a200   22932 494   1034396 84008 SyS_epoll_ 0000000000 S io.virtualapp
u0_a200   22955 494   1064388 70408 SyS_epoll_ 0000000000 S io.virtualapp:x
u0_a200   22983 494   1530416 266948            0000000000 R com.zhihu.android
u0_a200   23320 494   1410736 214680 SyS_epoll_ 0000000000 S com.sina.weibo
u0_a200   23387 494   1174928 76848 SyS_epoll_ 0000000000 S com.sina.weibo.image
u0_a200   23415 494   1186076 81648 SyS_epoll_ 0000000000 S com.sina.weibo:remote
u0_a200   23455 494   1173888 76572 SyS_epoll_ 0000000000 S com.sina.weibo.imageservant
u0_a200   24028 494   1182780 74408 SyS_epoll_ 0000000000 S com.sina.weibo.servant
u0_a200   24425 494   1027636 66116 SyS_epoll_ 0000000000 S com.taobao.sophix_android
u0_a200   24492 494   1334412 174708 SyS_epoll_ 0000000000 S com.zhihu.android
复制代码

可以看到,所有被ViralApp打开的应用,都和VirtalApp属于同一个uid: u0_a200

其中,VirtualApp本身有两个进程: io.virtualappio.virtualapp:x

io.virtualapp 就是可见的交互界面,同时也负责APK包的管理和安装; io.virtualapp:x 作为一个单独的服务进程,虚拟了一些系统服务;

因此,VirtualApp在运行时,包含以下三部分:

  • Main Process,进程名 io.virtualapp ,主要负责VirtualApp用户界面及应用管理;
  • Server Process,进程名 io.virtualapp:x ,主要负责系统服务的代理,是通过Content Provider启动的;
  • VApp Process,进程名 io.virtualapp:p[0-…] ,作为将来运行client应用的进程, 当client应用启动后,其进程名会更新为client应用的包名

client应用是通过VirtualApp安装的应用; host应用是VirtualApp;

以这里安装的微博为例,查看一下它的进程的内存空间,可以看到相关路径全都被映射到了/data/data/io.virtualapp/virtual下面,

... ...
b6d0f000-b7017000 r--p 00000000 fd:00 410335 /data/data/io.virtualapp/virtual/data/user/0/com.sina.weibo/Plugin/com.weibo.app.movie/dalvik-cache/base-1.dex
b7017000-b71d4000 r-xp 00308000 fd:00 410335 /data/data/io.virtualapp/virtual/data/user/0/com.sina.weibo/Plugin/com.weibo.app.movie/dalvik-cache/base-1.dex
... ...
bb745000-bb831000 r--p 00000000 fd:00 410247 /data/data/io.virtualapp/virtual/data/user/0/com.sina.weibo/code_cache/secondary-dexes/composer1312fd1cbada0e5074c9f9961b16aefb.dex
bb831000-bb8f0000 r-xp 000ec000 fd:00 410247 /data/data/io.virtualapp/virtual/data/user/0/com.sina.weibo/code_cache/secondary-dexes/composer1312fd1cbada0e5074c9f9961b16aefb.dex
... ...
bf448000-bf978000 r-xp 00000000 fd:00 410129 /data/data/io.virtualapp/virtual/data/app/com.sina.weibo/lib/libweiboffmpeg.so
bf978000-bf979000 ---p 00000000 00:00 0
bf979000-bf9ab000 r--p 00530000 fd:00 410129 /data/data/io.virtualapp/virtual/data/app/com.sina.weibo/lib/libweiboffmpeg.so
bf9ab000-bf9af000 rw-p 00562000 fd:00 410129 /data/data/io.virtualapp/virtual/data/app/com.sina.weibo/lib/libweiboffmpeg.so
... ...
c335a000-c33a9000 r-xp 00000000 fd:00 410127 /data/data/io.virtualapp/virtual/data/app/com.sina.weibo/lib/libweiboplayer.so
c33aa000-c33ad000 r--p 0004f000 fd:00 410127 /data/data/io.virtualapp/virtual/data/app/com.sina.weibo/lib/libweiboplayer.so
c33ad000-c33ae000 rw-p 00052000 fd:00 410127 /data/data/io.virtualapp/virtual/data/app/com.sina.weibo/lib/libweiboplayer.so
... ...
复制代码

可见,这里面对路径做过了重新映射;

这块就到此为止吧,主要是想简单介绍下VirtualApp,知道是怎么一回事;

服务器响应加密

上面的例子,就可以看到,现在越来越多的APP会对返回的结果进行加密处理,那这个是怎样的一个流程?

  • 客户端正常发起请求
  • 服务端进行业务处理,对response加密
  • 客户端对response解密

这样做的好处是什么?

对Response加密之后,即使第三方抓取到了我们的数据,也无法解密,保证了我们的数据安全;

从开发的角度,需要注意几点:

  • 加密算法要可逆算法,因为需要加解密,如AES、RSA;
  • 秘钥需要安全;
  • 可以整个response加密,也可以某个部分加密;

那这种怎么搞?

JB的测试之旅-听说安卓微信7.0不能抓https?

这里说的没法搞,是指没现成的 工具 直接处理,如果非要这么搞,那就是 反编译 ,因为想破解别人加密的算法,必须知道用什么方式加密,如果连加密方式都不知道,怎么解密?

还有个例子:

JB的测试之旅-听说安卓微信7.0不能抓https?

这样算加密吗?肯定算啦,但是这种加密是不是不可以处理?

并不是,直接网上找点代码试试看,理论上是可破,一般来说,MD5和RSA是网络传输中最常用的两个算法,网上也有大量的网页提供在线解密;

小结

至此,本文结束,本文的主要收获是 VirtualApp + HttpCanary可以抓到https的数据 ,但同时的,如果是服务器返回乱码,这种情况暂时没办法解决;

本文提及到的抓包工具有以下几款:

  • fiddler,一般用于windows;
  • charles,一般用于Mac;
  • package capture、VirtualApp + HttpCanary、AndroidHttpCapture,这几款都是安卓的;
  • whistle,pc的,基于node;
  • tcpdump + Wireshark,Linux的,一般用于安卓;
  • Stream、Thor是用于iOS手机抓包;

希望大家都会上面场景的抓包工具都有所了解,留个印象,方式需要的时候再翻出来使用;

最后,谢谢大家~

JB的测试之旅-听说安卓微信7.0不能抓https?

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Head First jQuery

Head First jQuery

Ryan Benedetti , Ronan Cranley / O'Reilly Media / 2011-9 / USD 39.99

Want to add more interactivity and polish to your websites? Discover how jQuery can help you build complex scripting functionality in just a few lines of code. With Head First jQuery, you'll quickly g......一起来看看 《Head First jQuery》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器