最近公司有個小程序要提測,由於以前反饋過使用Ip測試的時候,端口響應太慢了,所以此次改爲了域名的方式 ;html
研發提測,體驗,發現有個疑似bug的東西,想着抓包看下是否是接口數據的問題,結果問題出現了,按照之前的常規操做,打開fiddler,設置ip代理(https證書已經安裝了),結果一看,fiddler竟然這樣顯示: node
再看看手機,竟然沒數據?: linux
一臉疑問號,一開始覺得是本身問題,折騰半天,不對,以前都是沒問題的話,一樣的環境,一樣的設備,有毒? android
等下,以前的沒問題,最近微信好像更新了7.0,那是否是這個致使的?git
一開始遇到這問題,不知道怎麼處理,滿腦子想着就是安裝低版本微信,可是用過安卓系統的同窗都知道,4.X之後系統不容許降級安裝,若是要安裝低版本微信,意味着要刪除微信再安裝,這樣會延伸出另外的問題,刪除微信後個人聊天記錄跟照片視頻怎麼辦?github
問題自己就是如何完整備份微信數據,諮詢朋友圈,有不一樣大佬提供了方式:算法
以前功能以前沒使用過,可是從描述上看,感受只能遷移聊天記錄,那些圖片跟小視頻怎麼辦?shell
這個是另外的同窗說的,以前沒了解過,上網查了下,這玩意號稱是目前爲最強悍的程序和系統備份工具,需 ROOT 權限運行;小程序
這就尷尬啦,須要root,小米華爲vivo這種很差搞root,怎麼辦?windows
那就看看這個鈦備份的原理是啥,其實鈦備份的原理很簡單,就是把整個目錄的內容都保存下來,固然包括data裏面的數據,這就不難理解爲何要root權限了,固然裏面要用到的技術不少,自行網上查詢吧;
既然這條路,那就找臺測試機安裝舊版本試試吧;
試過好幾個網址,最後選擇的是wdj,那就挑了個6.7.3來試試了;
安裝,配置手機抓包環境,試了下;
你看吧,都說舊版本能夠的,大家不信,打臉了吧?
這問題確定不止jb一我的遇到的,直接Google了,微信小程序沒法抓包,果不出其然,你們都中毒了;
很開心,緣由我不是一我的,認真看下該問題,咦,原來都是由於微信7.0致使的,跟我同樣啊啊啊;
那再用微信7.0沒法抓包https爲關鍵字,又發現新的東西了;
這兩張圖,認真看到,發現兩個有意思的點:
第一點:
第二點:
看到這裏,莫名有點感動;
看到這裏,第二種解決方案也出現了,用蘋果就好了;
而後順延上面的思路,安卓7.0,讓jb想起之前的事;
以前我司的一個產品,在新版本也會出現沒法抓取http的狀況,出現的情形跟上面的一致,直接看當時提交的內容吧;
由此看到,的確只有安卓纔有問題,並且仍是7.0開始引入的;
那一塊兒來看看,這問題根源是什麼吧;
Google一下,不少相似的帖子,問題的根源是:
在Android7.0及以上的系統中,每一個應用能夠定義本身的可信CA集集。
默認狀況下,應用只會信任系統預裝的CA證書,而不會信任用戶安裝的CA證書。
而回想咱們抓包的過程,不管是fiddler仍是Charles,想抓https,都必須手機安裝對應的證書,經過fiddler/Charles安裝的證書偏偏正屬於用戶安裝的CA證書,所以會被視做不安全的證書。
如上代碼提交的那樣,直接修改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>
複製代碼
而後從新打包抓包就能夠了;
若是沒有源碼權限,怎麼辦?那就把證書安裝到系統證書裏面,可是這個操做須要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的數據,就會遇到這種狀況了;
直接貼ka的介紹,這是一款無root抓包的工具;
產品特色:
界面很簡單,以下圖,下面顯示的記錄,右上有1的表示只作一個應用,點擊會讓你選擇應用,右邊無1的就是所有都抓;
若是不是https的能立刻看到內容;
那試試除微信外的APP,這裏會延伸出另外的問題,就算別的APP不對證書作檢驗,給你抓到又如何?反正返回的數據是加密的;
選擇微信,試試,發現仍是不行,依然沒有數據,就跟不信任證書同樣;
因此,這個不行;
whistle是基於Node實現的跨平臺抓包調試代理工具,可是仔細看了下原理,也是經過信任證書實現的,所以仍是沒法解決上面的問題;
AndroidHttpCapture是在testerhome有人說起到的一款軟件,號稱是Android版的"Fiddler";
官網有demo,下載下來後,看了下,功能是挺全的,可是,怎麼感受有點山寨的感受?並且好像不能抓某個APP或者全部,對比上面的有點遜色的感受?棄坑~
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後面會單獨寫一篇文章;
反正,這兩個組合是個神器,理論上來講,這種狀況是能抓到數據的;
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 + HttpCanary是能夠抓到https的包,那這玩意究竟是什麼啊?爲何就能作到?
要介紹VirtualApp,要先介紹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就是在應用運行過程當中,注入外部的代碼,從而改變原有的執行流程。
所以,應用中必須存在注入代碼的窗口。
例如,使用了熱修復技術的應用,就是在啓動時加載並應用外部的補丁代碼,這類應用即是自己自帶了注入代碼的窗口。
可是,對於逆向分析或安全研究而言,所面對的一般是一個黑盒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在運行時,包含如下三部分:
io.virtualapp
,主要負責VirtualApp用戶界面及應用管理;io.virtualapp:x
,主要負責系統服務的代理,是經過Content Provider啓動的;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加密以後,即便第三方抓取到了咱們的數據,也沒法解密,保證了咱們的數據安全;
從開發的角度,須要注意幾點:
那這種怎麼搞?
這裏說的無法搞,是指沒現成的工具直接處理,若是非要這麼搞,那就是反編譯,由於想破解別人加密的算法,必須知道用什麼方式加密,若是連加密方式都不知道,怎麼解密?
還有個例子:
這樣算加密嗎?確定算啦,可是這種加密是否是不能夠處理?
並非,直接網上找點代碼試試看,理論上是可破,通常來講,MD5和RSA是網絡傳輸中最經常使用的兩個算法,網上也有大量的網頁提供在線解密;
至此,本文結束,本文的主要收穫是VirtualApp + HttpCanary能夠抓到https的數據,但同時的,若是是服務器返回亂碼,這種狀況暫時沒辦法解決;
本文說起到的抓包工具備如下幾款:
但願你們都會上面場景的抓包工具都有所瞭解,留個印象,方式須要的時候再翻出來使用;
最後,謝謝你們~