猿人學(xué)2023第三題:加密痕跡明顯的vmp
過一關(guān),斬六將(本文方法適用于1~6題)。但大家最好不要依賴于這種討巧的方法,否則會失去“體會不同混淆方式”的機(jī)會。
一、困境
????????這道題的代碼經(jīng)過混淆后,調(diào)試起來非常困難,就像加了很多無效的花指令。很多事件都會走同一段代碼,其中的變量在不同事件回調(diào)中擔(dān)任不同的角色,所以,即便定位到發(fā)起請求的地方,也很難順藤摸瓜找到前后的邏輯代碼。
????????不僅不容易找出token的生成方式,同時,接口響應(yīng)后的回調(diào)函數(shù)也很難找到。

二、思路
????????經(jīng)過一番思考,感覺從混淆后的代碼上面很難有所突破。所以,最終考慮:當(dāng)服務(wù)器返回響應(yīng)數(shù)據(jù)時,想辦法將數(shù)據(jù)攔截下來進(jìn)行使用。
????????具體的操作:
????????1)首先修改 XMLHttpRequest 原型鏈上的 open 方法,當(dāng)方法被調(diào)用時,在open中可以通過 this 獲取到當(dāng)前的 XMLHttpRequest 對象;
????????2)在 XMLHttpRequest 對象上綁定 onreadystatechange 事件,我們知道,在一個請求中,readyState 有五個狀態(tài)值,即0、1、2、3、4,當(dāng) readyState 值為4時,代表已經(jīng)拿到全部的響應(yīng)數(shù)據(jù)。所以,我們在 onreadystatechange 的回調(diào)函數(shù)中進(jìn)行判斷,當(dāng)事件對象中的 readyState 值為4,我們就將 responseText 屬性中的數(shù)據(jù)梳理出來,以便后面求和。

三、破局
????????按照上述思路完成的代碼如下:
????????值得一提的是,這里有個小坑,因為頁碼應(yīng)該會被用來和時間戳做拼接,然后參與計算token值,所以這里的頁碼(即call函數(shù)的傳參)必須是字符串,否則,會導(dǎo)致token計算錯誤。
