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

jb發表於2019-01-11

前言

最近公司有個小程式要提測,因為之前反饋過使用Ip測試的時候,埠響應太慢了,因此這次改成了域名的方式 ;

研發提測,體驗,發現有個疑似bug的東西,想著抓包看下是不是介面資料的問題,結果問題出現了,按照以前的常規操作,開啟fiddler,設定ip代理(https證照已經安裝了),結果一看,fiddler居然這樣顯示:

image.png-46kB

再看看手機,居然沒資料?:

image.png-325.6kB

一臉疑問號,一開始以為是自己問題,折騰半天,不對,之前都是沒問題的話,同樣的環境,同樣的裝置,有毒?

image.png-25.9kB

等下,之前的沒問題,最近微信好像更新了7.0,那是不是這個導致的?

怎麼解決?

一開始遇到這問題,不知道怎麼處理,滿腦子想著就是安裝低版本微信,但是用過安卓系統的同學都知道,4.X以後系統不允許降級安裝,如果要安裝低版本微信,意味著要刪除微信再安裝,這樣會延伸出另外的問題,刪除微信後我的聊天記錄跟照片視訊怎麼辦?

問題本身就是如何完整備份微信資料,諮詢朋友圈,有不同大佬提供了方式:

  1. 微信-設定-聊天-聊天記錄裡面有資料遷移的功能

之前功能之前沒使用過,但是從描述上看,感覺只能遷移聊天記錄,那些圖片跟小視訊怎麼辦?

  1. 鈦備份資料

這個是另外的同學說的,之前沒了解過,上網查了下,這玩意號稱是目前為最強悍的程式和系統備份工具,需 ROOT 許可權執行;

這就尷尬啦,需要root,小米華為vivo這種不好搞root,怎麼辦?

那就看看這個鈦備份的原理是啥,其實鈦備份的原理很簡單,就是把整個目錄的內容都儲存下來,當然包括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

相關文章