前言
最近公司有個小程式要提測,因為之前反饋過使用Ip測試的時候,埠響應太慢了,因此這次改成了域名的方式 ;
研發提測,體驗,發現有個疑似bug的東西,想著抓包看下是不是介面資料的問題,結果問題出現了,按照以前的常規操作,開啟fiddler,設定ip代理(https證照已經安裝了),結果一看,fiddler居然這樣顯示:
再看看手機,居然沒資料?:
一臉疑問號,一開始以為是自己問題,折騰半天,不對,之前都是沒問題的話,同樣的環境,同樣的裝置,有毒?
等下,之前的沒問題,最近微信好像更新了7.0,那是不是這個導致的?
怎麼解決?
一開始遇到這問題,不知道怎麼處理,滿腦子想著就是安裝低版本微信,但是用過安卓系統的同學都知道,4.X以後系統不允許降級安裝,如果要安裝低版本微信,意味著要刪除微信再安裝,這樣會延伸出另外的問題,刪除微信後我的聊天記錄跟照片視訊怎麼辦?
問題本身就是如何完整備份微信資料,諮詢朋友圈,有不同大佬提供了方式:
- 微信-設定-聊天-聊天記錄裡面有資料遷移的功能
之前功能之前沒使用過,但是從描述上看,感覺只能遷移聊天記錄,那些圖片跟小視訊怎麼辦?
- 鈦備份資料
這個是另外的同學說的,之前沒了解過,上網查了下,這玩意號稱是目前為最強悍的程式和系統備份工具,需 ROOT 許可權執行;
這就尷尬啦,需要root,小米華為vivo這種不好搞root,怎麼辦?
那就看看這個鈦備份的原理是啥,其實鈦備份的原理很簡單,就是把整個目錄的內容都儲存下來,當然包括data裡面的資料,這就不難理解為什麼要root許可權了,當然裡面要用到的技術很多,自行網上查詢吧;
既然這條路,那就找臺測試機安裝舊版本試試吧;
安卓微信舊版本
試過好幾個網址,最後選擇的是wdj,那就挑了個6.7.3來試試了;
安裝,配置手機抓包環境,試了下;
你看吧,都說舊版本可以的,你們不信,打臉了吧?
別人中毒了嗎?
這問題肯定不止jb一個人遇到的,直接Google了,微信小程式無法抓包,果不出其然,大家都中毒了;
很開心,原因我不是一個人,認真看下該問題,咦,原來都是因為微信7.0導致的,跟我一樣啊啊啊;
那再用微信7.0無法抓包https為關鍵字,又發現新的東西了;
這兩張圖,認真看到,發現兩個有意思的點:
第一點:
- 安卓系統 7.0 以下版本,不管微信任意版本,都會信任系統提供的證照
- 安卓系統 7.0 以上版本,微信 7.0 以下版本,微信會信任系統提供的證照
- 安卓系統 7.0 以上版本,微信 7.0 以上版本,微信只信任它自己配置的證照列表
第二點:
- 蘋果機可以用
看到這裡,莫名有點感動;
看到這裡,第二種解決方案也出現了,用蘋果就行了;
然後順延上面的思路,安卓7.0,讓jb想起以前的事;
之前我司的一個產品,在新版本也會出現無法抓取http的情況,出現的情形跟上面的一致,直接看當時提交的內容吧;
由此看到,的確只有安卓才有問題,而且還是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
放入系統證照目錄,之後你就可以正常抓包了。
注意事項
小米手機自帶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的資料,就會遇到這種情況了;
package capture
直接貼ka的介紹,這是一款無root抓包的工具;
產品特點:
- 抓包並記錄
- 通過中間人技術抓取ssl
- 不需要root
- 易於使用
- 直接顯示文字或顯示16進位制
介面很簡單,如下圖,下面顯示的記錄,右上有1的表示只做一個應用,點選會讓你選擇應用,右邊無1的就是全部都抓;
如果不是https的能馬上看到內容;
那試試除微信外的APP,這裡會延伸出另外的問題,就算別的APP不對證照做檢驗,給你抓到又如何?反正返回的資料是加密的;
選擇微信,試試,發現還是不行,依然沒有資料,就跟不信任證照一樣;
所以,這個不行;
whistle
whistle是基於Node實現的跨平臺抓包除錯代理工具,但是仔細看了下原理,也是通過信任證照實現的,因此還是無法解決上面的問題;
AndroidHttpCapture
AndroidHttpCapture是在testerhome有人提及到的一款軟體,號稱是Android版的"Fiddler";
官網有demo,下載下來後,看了下,功能是挺全的,但是,怎麼感覺有點山寨的感覺?而且好像不能抓某個APP或者所有,對比上面的有點遜色的感覺?棄坑~
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的介面是這樣的:
這裡不詳細說明了,因為tcpdump+wireshark後面會單獨寫一篇文章;
反正,這兩個組合是個神器,理論上來說,這種情況是能抓到資料的;
VirtualApp + HttpCanary
HttpCanary是一款強大的Android端抓包和注入工具,同樣不需要root,軟體本身支援安裝證照,如果只是單獨使用,依然跟其他APP一樣;
這裡還要介紹另外的一個產品,VirtualApp是一個開源的Android App虛擬化引擎,允許在其中建立虛擬空間,並在這個虛擬空間中執行其他應用。
簡單的說,就是一個容器,可以進行雙開處理,市面上很多雙開的軟體,原理就是這個;
點選後,就是雙開了,然後再開啟HttpCanary進行轉包,比如點選微信的小程式,嘖嘖嘖,發現啥了?
如果服務端沒有加密的話,終於可以了,有點心累啊;
最後,把兩個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類,小姐是私有方法或成員,因為掃黃的關係,現在的小姐都是私有的,但是呢,你還是可以通過媽咪來找到小姐,這裡面,通過媽咪的方式就是反射啦~
複製程式碼
對於女生,買包包:
很多名牌店裡面有一條潛規則,有點瑕疵的產品,內部人員是可以低價購買的,但是一般人是買不到的,那如果你有閨蜜在裡面工作或者有熟人的情況下,你就可以通過這個渠道來買到這些瑕疵產品,這這個能方式就是反射;
複製程式碼
反正就是不能光明正大做的,然後有個代理,可以這樣做,你通過代理去做,就行啦;
這懂了吧?
hook
hook是什麼?hook就是在應用執行過程中,注入外部的程式碼,從而改變原有的執行流程。
因此,應用中必須存在注入程式碼的視窗。
例如,使用了熱修復技術的應用,就是在啟動時載入並應用外部的補丁程式碼,這類應用便是本身自帶了注入程式碼的視窗。
但是,對於逆向分析或安全研究而言,所面對的通常是一個黑盒App,我們並不知道其是否存在注入程式碼的視窗,或者存在但無法被利用。
為此,我們必須要額外地為應用新增註入程式碼的視窗。
Xposed便是這樣做的:它修改了系統庫,對所有應用在啟動時新增了注入視窗。但是,這就需要具有root許可權。
那麼,如何在不具有root許可權的情況下實現呢?這就需要用到VirtualApp了。
VirtualApp的工作原理,簡而言之,它通過代理常用系統服務的方式,在系統服務層與應用層之間新增了一層虛擬空間,從而允許在不安裝應用的情況下執行應用。特別地,VirtualApp本身並不需要root許可權。
VirtualApp之所以能夠實現虛擬空間,是因為其對許多系統服務進行了代理和替換,而這部分是核心;
如果對原理感興趣的同學,可以點選此處瞭解更多;
試試看
啟動VirtualApp後,介面是這樣的。
顯示的是已經通過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.virtualapp
和 io.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加密,也可以某個部分加密;
那這種怎麼搞?
這裡說的沒法搞,是指沒現成的工具直接處理,如果非要這麼搞,那就是反編譯,因為想破解別人加密的演算法,必須知道用什麼方式加密,如果連加密方式都不知道,怎麼解密?
還有個例子:
這樣算加密嗎?肯定算啦,但是這種加密是不是不可以處理?
並不是,直接網上找點程式碼試試看,理論上是可破,一般來說,MD5和RSA是網路傳輸中最常用的兩個演算法,網上也有大量的網頁提供線上解密;
小結
至此,本文結束,本文的主要收穫是VirtualApp + HttpCanary可以抓到https的資料,但同時的,如果是伺服器返回亂碼,這種情況暫時沒辦法解決;
本文提及到的抓包工具有以下幾款:
- fiddler,一般用於windows;
- charles,一般用於Mac;
- package capture、VirtualApp + HttpCanary、AndroidHttpCapture,這幾款都是安卓的;
- whistle,pc的,基於node;
- tcpdump + Wireshark,Linux的,一般用於安卓;
- Stream、Thor是用於iOS手機抓包;
希望大家都會上面場景的抓包工具都有所瞭解,留個印象,方式需要的時候再翻出來使用;
最後,謝謝大家~