JB的測試之旅-據說安卓微信7.0不能抓https?

前言

最近公司有個小程序要提測,由於以前反饋過使用Ip測試的時候,端口響應太慢了,所以此次改爲了域名的方式 ;html

研發提測,體驗,發現有個疑似bug的東西,想着抓包看下是否是接口數據的問題,結果問題出現了,按照之前的常規操做,打開fiddler,設置ip代理(https證書已經安裝了),結果一看,fiddler竟然這樣顯示: node

image.png-46kB

再看看手機,竟然沒數據?: linux

image.png-325.6kB

一臉疑問號,一開始覺得是本身問題,折騰半天,不對,以前都是沒問題的話,一樣的環境,一樣的設備,有毒? android

image.png-25.9kB

等下,以前的沒問題,最近微信好像更新了7.0,那是否是這個致使的?git

怎麼解決?

一開始遇到這問題,不知道怎麼處理,滿腦子想着就是安裝低版本微信,可是用過安卓系統的同窗都知道,4.X之後系統不容許降級安裝,若是要安裝低版本微信,意味着要刪除微信再安裝,這樣會延伸出另外的問題,刪除微信後個人聊天記錄跟照片視頻怎麼辦?github

問題自己就是如何完整備份微信數據,諮詢朋友圈,有不一樣大佬提供了方式:算法

  1. 微信-設置-聊天-聊天記錄裏面有數據遷移的功能

以前功能以前沒使用過,可是從描述上看,感受只能遷移聊天記錄,那些圖片跟小視頻怎麼辦?shell

  1. 鈦備份數據

這個是另外的同窗說的,以前沒了解過,上網查了下,這玩意號稱是目前爲最強悍的程序和系統備份工具,需 ROOT 權限運行;小程序

這就尷尬啦,須要root,小米華爲vivo這種很差搞root,怎麼辦?windows

那就看看這個鈦備份的原理是啥,其實鈦備份的原理很簡單,就是把整個目錄的內容都保存下來,固然包括data裏面的數據,這就不難理解爲何要root權限了,固然裏面要用到的技術不少,自行網上查詢吧;

既然這條路,那就找臺測試機安裝舊版本試試吧;

安卓微信舊版本

試過好幾個網址,最後選擇的是wdj,那就挑了個6.7.3來試試了;

image.png-61.2kB

安裝,配置手機抓包環境,試了下;

image.png-63.9kB

你看吧,都說舊版本能夠的,大家不信,打臉了吧?

image.png-17kB

別人中毒了嗎?

這問題確定不止jb一我的遇到的,直接Google了,微信小程序沒法抓包,果不出其然,你們都中毒了;

image.png-41.8kB
image.png-45kB

很開心,緣由我不是一我的,認真看下該問題,咦,原來都是由於微信7.0致使的,跟我同樣啊啊啊;

那再用微信7.0沒法抓包https爲關鍵字,又發現新的東西了;

image.png-133.5kB
image.png-23.4kB

這兩張圖,認真看到,發現兩個有意思的點:

第一點:

  • 安卓系統 7.0 如下版本,無論微信任意版本,都會信任系統提供的證書
  • 安卓系統 7.0 以上版本,微信 7.0 如下版本,微信會信任系統提供的證書
  • 安卓系統 7.0 以上版本,微信 7.0 以上版本,微信只信任它本身配置的證書列表

第二點:

  • 蘋果機能夠用

看到這裏,莫名有點感動;

image.png-558.4kB

看到這裏,第二種解決方案也出現了,用蘋果就好了;

而後順延上面的思路,安卓7.0,讓jb想起之前的事;

以前我司的一個產品,在新版本也會出現沒法抓取http的狀況,出現的情形跟上面的一致,直接看當時提交的內容吧;

image.png-101kB

由此看到,的確只有安卓纔有問題,並且仍是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放入系統證書目錄,以後你就能夠正常抓包了。

image.png-271kB
image.png-371.2kB

注意事項

小米手機自帶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的數據,就會遇到這種狀況了;

image.png-1.9kB

package capture

直接貼ka的介紹,這是一款無root抓包的工具;

產品特色:

  • 抓包並記錄
  • 經過中間人技術抓取ssl
  • 不須要root
  • 易於使用
  • 直接顯示文本或顯示16進制

界面很簡單,以下圖,下面顯示的記錄,右上有1的表示只作一個應用,點擊會讓你選擇應用,右邊無1的就是所有都抓;

image.png-410kB

若是不是https的能立刻看到內容;

image.png-914.8kB

那試試除微信外的APP,這裏會延伸出另外的問題,就算別的APP不對證書作檢驗,給你抓到又如何?反正返回的數據是加密的

image.png-323.4kB

選擇微信,試試,發現仍是不行,依然沒有數據,就跟不信任證書同樣;

因此,這個不行;

whistle

whistle是基於Node實現的跨平臺抓包調試代理工具,可是仔細看了下原理,也是經過信任證書實現的,所以仍是沒法解決上面的問題;

image.png-101.8kB

AndroidHttpCapture

AndroidHttpCapture是在testerhome有人說起到的一款軟件,號稱是Android版的"Fiddler";

官網有demo,下載下來後,看了下,功能是挺全的,可是,怎麼感受有點山寨的感受?並且好像不能抓某個APP或者全部,對比上面的有點遜色的感受?棄坑~

image.png-1115.6kB
image.png-654.5kB

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的界面是這樣的:

image.png-407.5kB

這裏不詳細說明了,由於tcpdump+wireshark後面會單獨寫一篇文章;

反正,這兩個組合是個神器,理論上來講,這種狀況是能抓到數據的;

VirtualApp + HttpCanary

HttpCanary是一款強大的Android端抓包和注入工具,一樣不須要root,軟件自己支持安裝證書,若是隻是單獨使用,依然跟其餘APP同樣;

這裏還要介紹另外的一個產品,VirtualApp是一個開源的Android App虛擬化引擎,容許在其中建立虛擬空間,並在這個虛擬空間中運行其餘應用。

簡單的說,就是一個容器,能夠進行雙開處理,市面上不少雙開的軟件,原理就是這個;

image.png-136.5kB

點擊後,就是雙開了,而後再打開HttpCanary進行轉包,好比點擊微信的小程序,嘖嘖嘖,發現啥了?

image.png-322.5kB

若是服務端沒有加密的話,終於能夠了,有點心累啊;

image.png-20.2kB

最後,把兩個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類,小姐是私有方法或成員,由於掃黃的關係,如今的小姐都是私有的,可是呢,你仍是能夠經過媽咪來找到小姐,這裏面,經過媽咪的方式就是反射啦~
複製代碼

對於女生,買包包:

不少名牌店裏面有一條潛規則,有點瑕疵的產品,內部人員是能夠低價購買的,可是通常人是買不到的,那若是你有閨蜜在裏面工做或者有熟人的狀況下,你就能夠經過這個渠道來買到這些瑕疵產品,這這個能方式就是反射;
複製代碼

反正就是不能光明正大作的,而後有個代理,能夠這樣作,你經過代理去作,就行啦;

這懂了吧?

image.png-6.6kB

hook

hook是什麼?hook就是在應用運行過程當中,注入外部的代碼,從而改變原有的執行流程。

所以,應用中必須存在注入代碼的窗口。

例如,使用了熱修復技術的應用,就是在啓動時加載並應用外部的補丁代碼,這類應用即是自己自帶了注入代碼的窗口。

可是,對於逆向分析或安全研究而言,所面對的一般是一個黑盒App,咱們並不知道其是否存在注入代碼的窗口,或者存在但沒法被利用。

爲此,咱們必需要額外地爲應用添加註入代碼的窗口。

Xposed即是這樣作的:它修改了系統庫,對全部應用在啓動時添加了注入窗口。可是,這就須要具備root權限。

那麼,如何在不具備root權限的狀況下實現呢?這就須要用到VirtualApp了。

VirtualApp的工做原理,簡而言之,它經過代理經常使用系統服務的方式,在系統服務層與應用層之間添加了一層虛擬空間,從而容許在不安裝應用的狀況下運行應用。特別地,VirtualApp自己並不須要root權限。

VirtualApp之因此可以實現虛擬空間,是由於其對許多系統服務進行了代理和替換,而這部分是核心;

若是對原理感興趣的同窗,能夠點擊此處瞭解更多;

試試看

啓動VirtualApp後,界面是這樣的。

image.png-178.8kB

顯示的是已經經過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加密,也能夠某個部分加密;

那這種怎麼搞?

image.png-16.4kB

這裏說的無法搞,是指沒現成的工具直接處理,若是非要這麼搞,那就是反編譯,由於想破解別人加密的算法,必須知道用什麼方式加密,若是連加密方式都不知道,怎麼解密?

還有個例子:

image.png-8.1kB

這樣算加密嗎?確定算啦,可是這種加密是否是不能夠處理?

並非,直接網上找點代碼試試看,理論上是可破,通常來講,MD5和RSA是網絡傳輸中最經常使用的兩個算法,網上也有大量的網頁提供在線解密;

小結

至此,本文結束,本文的主要收穫是VirtualApp + HttpCanary能夠抓到https的數據,但同時的,若是是服務器返回亂碼,這種狀況暫時沒辦法解決;

本文說起到的抓包工具備如下幾款:

  • fiddler,通常用於windows;
  • charles,通常用於Mac;
  • package capture、VirtualApp + HttpCanary、AndroidHttpCapture,這幾款都是安卓的;
  • whistle,pc的,基於node;
  • tcpdump + Wireshark,Linux的,通常用於安卓;
  • Stream、Thor是用於iOS手機抓包;

但願你們都會上面場景的抓包工具都有所瞭解,留個印象,方式須要的時候再翻出來使用;

最後,謝謝你們~

image.png-29.3kB
相關文章
相關標籤/搜索