0x01 前言:
app抓包是逆向協議的前提,也是一個爬蟲工程師的基本要求,最近發現這塊知識非常欠缺就抓緊補補了(我太菜了)
然后接下來是通過vpn將流量導出到抓包軟件的方式,而不是通過wifi設置代理,因為太容易被檢測了。
0x02 環境配置
vpn代理軟件就下載postern這個軟件,vpn是在網絡層這樣可以把傳輸層和應用層的流量都抓到,大概是這樣

當然這個配置規則的ip和端口其實是charles的socket代理的端口,和charles所在機器的ip,所以接下來繼續配置charles,打開最右上角的按鈕
修改proxy setting,把socket代理配置打開。

之后再返回到postern中,設置配置代理,然后設置配置規則,都在左邊的按鈕,點開就能看見

0x03 https的抓包
然后前面大體已經配好了,http的流量完全可以抓了,不過現在的app將重要功能的請求方式全改成https了,會涉及到一個證書的驗證
又因為在應用層抓包本質是一個中間人在攔截流量,導致客服端到服務器端的通信一分為二了,一部分是客戶端到抓包軟件,另一部分是
抓包軟件到服務器端,所以得分開來考慮,
一.第一部分的情況分為客戶端沒有校驗app證書和有校驗證書
1.如果沒有校驗證書,首先需要把charles的證書安裝到手機的根目錄下並安裝信任,
這里放個表哥的圖片2333

圖中的瀏覽器是手機的瀏覽器,也就是在手機去訪問。
2.然后如果客戶端有校驗證書的話,也就是客戶端並不默認信任系統根目錄安裝的證書,額外增加一手代碼驗證,也就是證書綁定機制,這里有好幾種處理方式
2.1 hook住checkServerTrusted的所有重載,把所有重載置空。貼個肉絲表哥的代碼
function hook_ssl() { Java.perform(function() { var ClassName = "com.android.org.conscrypt.Platform"; var Platform = Java.use(ClassName); var targetMethod = "checkServerTrusted"; var len = Platform[targetMethod].overloads.length; console.log(len); for(var i = 0; i < len; ++i) { Platform[targetMethod].overloads[i].implementation = function () { console.log("class:", ClassName, "target:", targetMethod, " i:", i, arguments); //printStack(ClassName + "." + targetMethod); } } });
2.2 objection直接把ssl ping給關了
android sslpinning disable
2.3 還沒研究,還在繼續學習中
二.服務器端有校驗證書,這波其實和第一部分類似,不過我們不能再通過hook服務器端的代碼來bypass了,我們得學會偽裝
比如charles這個中間人,穿上客戶端的衣服,給服務器端發請求不就好了,所以這里解決方式就是將手機app中的內置證書,裝入
charles中,這波操作,首先需要找到證書文件和證書密碼,
對apk解包后,直接搜索p12為后綴的文件,常見命令tree -NCfhl |grep -i p12,直接打印出p12的路徑,有些app狡猾的話,
會估計把p12文件的后綴改成別的格式,file文件可以查看一下文件格式,找到文件中,hook出密碼,這里貼一波表哥的代碼
function hook_KeyStore_load() { Java.perform(function () { var StringClass = Java.use("java.lang.String"); var KeyStore = Java.use("java.security.KeyStore"); KeyStore.load.overload('java.security.KeyStore$LoadStoreParameter').implementation = function (arg0) { printStack("KeyStore.load1"); console.log("KeyStore.load1:", arg0); this.load(arg0); }; KeyStore.load.overload('java.io.InputStream', '[C').implementation = function (arg0, arg1) { printStack("KeyStore.load2"); console.log("KeyStore.load2:", arg0, arg1 ? StringClass.$new(arg1) : null); this.load(arg0, arg1); }; console.log("hook_KeyStore_load..."); }); }
然后就打開charles添加證書,

