安卓手機微信7.0.4調試小程序抓包https請求失敗問題和解決

注意:閱讀本文須要一臺已經root的安卓手機!

說明

系統:MacOS 10.13.6
手機:小米6(已root)
抓包工具:Charles
微信版本:7.0.4

現象

安卓手機沒法經過Charles代理抓包https請求,我前天(2019年04月16日)用的7.0.3不知道爲何能抓到,昨天手殘更新到7.0.4就不行了。而iOS(iPhone5S 12.1.4)沒有問題。node

查找相關資料,都說微信升級到版本7以後就限制了用戶證書憑據。根據網上較多的推薦方案,建議把證書放在系統證書存放目錄下,那這就須要Root手機了,若是沒有,如下內容不適合閱讀。linux

接下來,我嘗試將Charles生成的證書放在手機的系統證書中,並無那麼順利,很失敗!我慢慢來說解一下。android

步驟

生成Charles證書

咱們要生成一個能夠存放在系統證書目錄下的可被識別的證書。

手機代理設置好了後,手機訪問:<chls.pro/ssl>下載下來證書,名稱是這樣的charles-proxy-ssl-proxying-certificate.pem(你把這個文件搞到電腦上,假設該證書存在電腦的路徑:~/charles-proxy-ssl-proxying-certificate.pem)。web

在你的電腦終端經過這個命令生成一個hash值:shell

openssl x509 -subject_hash_old -in ~/charles-proxy-ssl-proxying-certificate.pem

能夠看到輸出了相似以下安全

P750TM:webs whidy$ openssl x509 -subject_hash_old -in ~/certificate.pem 
07e87b3d
-----BEGIN CERTIFICATE-----
MIIFYjCCBEqgAwIBAgIGAWeQpfWHMA...
....
77JclxPc0UdJHi5rOf7w+LU8YZFPdMTLa/c2JjMlspt08UeQVDE=
-----END CERTIFICATE-----

將證書改名07e87b3d.0注意後綴!bash

接下來你能夠用任意手段將該文件拷貝至手機的/system/etc/security/cacerts/目錄,若是成功則再次嘗試抓包,若是失敗,請繼續看。微信

超級終端操做

若是不嫌麻煩的話,你徹底能夠在安卓手機上面的超級終端(自行下載的工具)進行如下操做,可是我沒有這樣,我在MacOSX中啓用adb鏈接操做手機,若是你正有此意,請按照個人方式操做。app

電腦終端執行如下命令(這裏不介紹brew,不理解的自行學習)tcp

brew cask install android-platform-tools

裝好後,數據線連上手機,測試一下

adb devices

沒報錯,且大概出現如下信息則正常:

List of devices attached
* daemon not running; starting now at tcp:5037
* daemon started successfully
fa8a05fd    device

而後獲取root權限,嘗試將文件07e87b3d.0拷貝到/system/etc/security/cacerts/

adb root

得到權限後,直接執行下面命令將證書放入系統目錄。

push ~/07e87b3d.0 /system/etc/security/cacerts/

若是成功了,請嘗試抓包。若是提示失敗,好比權限不足,只讀啥的,反正大概錯誤信息以下:

P750TM:/ whidy$ adb push ~/07e87b3d.0 /system/etc/security/cacerts/
adb: error: failed to copy '/Users/whidy/07e87b3d.0' to '/system/etc/security/cacerts/07e87b3d.0': remote couldn't create file: Read-only file system
/Users/whidy/07e87b3d.0: 0 files pushed. 0.0 MB/s (1947 bytes in 0.119s)

那就要繼續折騰了。網上抄到的chmod 777目前是無論用的。要經過mount的相關操做來解決這個問題。

裝載可寫的system目錄

查看當前system目錄掛載在哪裏mount,能夠獲得大體以下:

rootfs on / type rootfs (ro,seclabel,size=2828452k,nr_inodes=707113)
tmpfs on /dev type tmpfs (rw,seclabel,nosuid,relatime,size=2912600k,nr_inodes=728150,mode=755)
devpts on /dev/pts type devpts (rw,seclabel,relatime,mode=600)
proc on /proc type proc (rw,relatime,gid=3009,hidepid=2)
sysfs on /sys type sysfs (rw,seclabel,relatime)
selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)
/dev/block/dm-0 on /system type ext4 (ro,seclabel,relatime,discard,data=ordered)
debugfs on /sys/kernel/debug type debugfs (rw,seclabel,relatime)
none on /acct type cgroup (rw,relatime,cpuacct)
none on /dev/stune type cgroup (rw,relatime,schedtune)
tmpfs on /mnt type tmpfs (rw,seclabel,relatime,size=2912600k,nr_inodes=728150,mode=755,gid=1000)
none on /config type configfs (rw,relatime)
none on /dev/memcg type cgroup (rw,relatime,memory)

注意到/dev/block/dm-0 on /system type ext4 (ro,seclabel,relatime,discard,data=ordered)這一行,後面括號有個ro,表明readonly!

接下來嘗試修改成可寫(rw)狀態:

mount -o rw,remount /dev/block/dm-0 /system

若是成功了,就試試將文件拷貝進去,失敗了,例如提示:'/dev/block/dm-0' is read-only,請繼續閱讀。

這裏參考Android O, failed to mount /system, /dev/block/dm-0 is read only,一頓操做!我這邊是這樣的:

adb disable-verity
adb reboot

關閉驗證是要重啓設備的。執行重啓後,繼續:

adb root
adb remount
adb shell

再執行mount發現結果跟剛纔不同了,找到有system的那一行發現這樣的

/dev/block/sde43 on /system type ext4 (rw,seclabel,relatime,discard,data=ordered)

已經可寫了,我試試拷貝進去。執行adb push ~/07e87b3d.0 /system/etc/security/cacerts/,出現如下結果:

P750TM:/ whidy$ adb push ~/07e87b3d.0 /system/etc/security/cacerts/
/Users/whidy/07e87b3d.0: 1 file pushed. 0.1 MB/s (1947 bytes in 0.022s)

應該就完成了。再去個人小米6手機裏面的設置 > 更多設置 > 系統安全 > 加密與憑據 > 信任的憑據 > 系統裏面看看,滾到最低部,ok,證書導入成功了。再去抓包看看~

我這文章是邊寫邊記錄的,如今能夠看到https請求的抓包已經Ok啦~

最後

爲了手機安全,我建議最後還原一下以前操做過的disable-verity命令,執行(若是你再也不測試抓包了請執行)下面命令:

adb root
adb enable-verity
adb reboot
注意:我覺得證書是存好了,把這個從新打開,提升安全性,結構發現打開後,重啓,證書又沒了。。。因此可能,要想抓包,這個就不能從新開啓了

行了差很少就這些了。

寫文本有參考閱讀的相關文章:

相關文章
相關標籤/搜索