Python 爬蟲進階必備 | 關(guān)于某數(shù) 4 代 XHR 參數(shù) MmEwMD 的分析
點擊上方“咸魚學(xué)Python”,選擇“加為星標(biāo)”
第一時間關(guān)注Python技術(shù)干貨!

圖源:極簡壁紙
今日網(wǎng)站
現(xiàn)在 web js 逆向分析真的好卷啊
關(guān)于某數(shù) 4 代的 cookie 分析文章網(wǎng)上已經(jīng)好多了,很多大佬已經(jīng)開始轉(zhuǎn)戰(zhàn) app 逆向,所以趁著最后蹭一蹭熱度發(fā)一下關(guān)于 XHR 參數(shù) MmEwMD ?的分析文章
aHR0cDovL3d3dy5zaHRkc2MuY29t
抓包分析
因為是 xhr 參數(shù),所以主要關(guān)注的界面還是xhr過濾器,打開網(wǎng)站可以過濾出下面這樣的請求

我們就拿這個請求為例,分析這個例子,先要把 debugger 先過了

像這樣的 debugger 反調(diào)試大家應(yīng)該都會吧,這里通過never pause here就能繞過了
跳過之后,就是下一個 debugger 了,使用同樣的方法就行

至于其他繞過的方法也是可以的,能繞過不影響調(diào)試就過。
這里就是簡單提一嘴大家注意一下
定位加密
多點幾下網(wǎng)頁,應(yīng)該可以注意到所有的請求鏈接都有帶上MmEwMD 這個參數(shù)
之前教給大家的搜索大法在這里當(dāng)然就失效了,畢竟是曾經(jīng)的天花板,這點小防護還是有的

那么我們應(yīng)該如何定位這個參數(shù)的加密呢?
這里用 hook 大法,定位一波就完事了
把 hook 插件拖到瀏覽器擴展程序里面,文末有獲取代碼的方式

然后直接刷新頁面,可以看到斷點停在下面的位置

然后向上一個堆棧就能看到加密的入口了

這里的_$lT就是MmEwMD加密的入口函數(shù)了
那么現(xiàn)在知道了這個MmEwMD入口之后,我們之后可以直接搜索進到這個位置分析嗎?
答案當(dāng)然是不行的,因為某數(shù)的 js 是動態(tài)生成的,每次的變量名都不一樣,所以我們想要每次都能很方便定位還是要繼續(xù)分析
既然這里定位的位置是動態(tài)的,那我們找一個不會變的位置作為標(biāo)記點不就好了
所以繼續(xù)向前找堆棧,你可以看到下面這個代碼

這個代碼的位置是在jquery_xx.js里面,這個 js 庫是不會變得,所以我們把斷點下在這個位置
然后關(guān)掉上面的 hook 插件,重新刷新頁面

斷點會斷在我們截圖的位置,這個時候只要簡單的幾次F11就能運行到加密入口的地方

這不就到了嗎,解決完定位加密位置的部分,我們來分析一下他都檢測了什么
分析加密

剛剛我們點位到了入口,現(xiàn)在進入_$Yr看看他都做了什么

這里傳入的是接口鏈接的一部分,可以理解為path+params的組合
然后第一步進行了_$Bi類型的判斷

然后進入了_$Xt的邏輯

這里的_$hA只是對_$Bi去空格,然后就進入了_$eC的邏輯
這一步返回了_$sS,這里的_$sS返回的是一個對象,這個對象在_$Yr的邏輯中參與了很多邏輯

所以這里的_$sS是比較關(guān)鍵的參數(shù)
現(xiàn)在看看_$sS都是怎么賦值的?
進入_$eC的邏輯,這里_$eC在開頭就先給了_$sS賦了一個空對象,并且定義了一系列的key,并賦了初始值

接下來就是一系列的判斷和try catch檢測
ps:這里有一個調(diào)試小技巧,接下來會有很多if..return邏輯

這樣的判斷一般都是 false,畢竟這里 return 了后面的邏輯不就沒檢查了嘛
反之,在我們補環(huán)境的時候,這里if中判斷條件也是我們需要注意的點,如果我們自己的環(huán)境走到這個位置是true就涼涼了。
我們繼續(xù)分析,看了一下大概的邏輯,在創(chuàng)建了_$sS后,第一個try catch先完成了Location的檢測,并且通過location.port完成了_$yk的賦值

完成這步之后,接下來很多的邏輯都用到了_$oM這個對象
這個_$oM是在邏輯中創(chuàng)建的a標(biāo)簽對象

這里的_$yT[_$xe[92]]就是document.createElement

在上面的邏輯創(chuàng)建了a標(biāo)簽
完成了a的創(chuàng)建之后,接下來就是完成對a的屬性的賦值
_$oM[_$aY]?=?_$Bi;
_$oM[_$aY]?=?_$oM[_$aY];
_$oM[_$aY],通過_$Bi完成了_$oM[_$aY]的賦值,_$Bi是剛剛開始傳入的path + params,然后再將_$oM[_$aY]賦值回來
這一步?jīng)]有注意的朋友可能會感覺這是廢話
但是這里賦值后_$oM[_$aY]的結(jié)果并不是_$Bi,而是location.origin + path + params
需要注意的是到這里,a標(biāo)簽現(xiàn)在所有的屬性值就初始化完了,這里在我們自己的環(huán)境補a的環(huán)境的時候需要注意的
這一步如果很生硬的給一個{}那么接下來就不好過了
接下來就是對_$oM的屬性取值然后再判斷,判斷之后再對_$sS不同的key進行賦值,再對_$sS的key進行判斷【就是這么啰嗦】

所以只要你a標(biāo)簽創(chuàng)建的好,這個還是很好過的,因為接下來都是水磨功夫,如果你一下記不住,可以像我一樣做個筆記

這里很簡單就完成_$sS對象的構(gòu)造,然后我們就可以回到主邏輯_$Yr部分

如果上一步_$sS補的好的話接下來的邏輯你就很輕松了
接下來需要注意的是_$R6、_$W7、_$v5這三個邏輯
這里的_$R6是對你傳入的path + parmas進行計算,會生成一個長度 16 的數(shù)組
然后_$W7繼續(xù)進入控制流計算

這一步會生成MmEwMD的前部分的值

然后在開頭拼接上?進入_$v5的邏輯

這里是最后生成MmEwMD后一部分的邏輯,然后再拼接會剛剛生成的MmEwMD上

完成這一步的邏輯之后,就生成最后的MmEwMD了
其實MmEwMD還是很簡單的,難點就是調(diào)試麻煩
開頭的 ?hook 的 demo 代碼是百度 cv 的如果有使用上的 bug 大家見諒,插件大家可以在公眾號后臺回復(fù)【hook】獲取
完事~
好了,以上就是今天的全部內(nèi)容了。
我是沒有更新就在摸魚的咸魚
收到請回復(fù)~
我們下次再見。
對了,看完記得一鍵四連,這個對我真的很重要。
