某店登陸參數(shù) UA 加密邏輯分析

來源 | 咸魚學(xué)Python
今日網(wǎng)站
aHR0cHM6Ly9kLndlaWRpYW4uY29tL3dlaWRpYW4tcGMvbG9naW4vIy8=
有兩周沒有更新,趕緊更新一波,希望不要像上次的視頻一樣瀏覽量翻車。
加密定位
輸入賬號密碼,點擊登陸,可以看到下面的請求

我們需要分析的參數(shù)是ua這個參數(shù)
直接通過Initiator第一個的位置先打上斷點

重新提交一下,這個時候就會斷住了

紅框里的e里面已經(jīng)包含了生成好的ua了
所以繼續(xù)往上一層堆棧查找,直到下面這個位置


可以看到i是由window.getUa()生成的

所以這個時候就只要把window.getUa()的邏輯搞出來就可以了
加密分析

跟進(jìn)去看到的是 ob 混淆


這個 ob 比較簡單,不用還原也可以分析這個加密,簡單反混淆一下去掉類似_0x4651('0x440')這樣的代碼
通過上面的截圖可以看到window.getUa()的邏輯是下面這一串
window["getUa"] = function () {
var _0x7dfc34 = new Date()["getTime"]();
if (_0x4a9622) {
_0x2644f4();
}
_0x55b608();
var _0x261229 = _0x1722c3(_0x2e98dd) + "|" + _0x1722c3(_0x420004) + "|" + _0x7dfc34["toString"](16);
_0x261229 = btoa(_0x570bef["gzip"](_0x261229, {
"to": "string"
}));
return _0x261229;
};
返回的值是_0x261229,所以只要這個值相關(guān)的邏輯就可以了
window["getUa"] = function () {
var _0x7dfc34 = new Date()["getTime"]();
var _0x261229 = _0x1722c3(_0x2e98dd) + "|" + _0x1722c3(_0x420004) + "|" + _0x7dfc34["toString"](16);
_0x261229 = btoa(_0x570bef["gzip"](_0x261229, {
"to": "string"
}));
return _0x261229;
};
由上面的代碼可以得出以下結(jié)論
_0x7dfc34是當(dāng)前的時間戳
_0x261229是由_0x1722c3(_0x2e98dd) + "|" + _0x1722c3(_0x420004) + "|" +時間戳拼接組成,最后返回的結(jié)果由前面的結(jié)果先壓縮再經(jīng)由btoa組成
這樣分析我們發(fā)現(xiàn)目前未知的參數(shù)就只有 3 個,分別為_0x1722c3、_0x2e98dd、_0x420004
接下來回到網(wǎng)頁上分析看看這三個參數(shù)的值
首先是_0x1722c3,這個是一個加密邏輯,不用管里面是什么,后面直接扣邏輯就行
然后是_0x2e98dd

這里面的參數(shù)是當(dāng)前的環(huán)境參數(shù),這里面包含了的系統(tǒng)字體,屏幕參數(shù),電池狀態(tài),header、Navigtor等一系列的參數(shù)

其次是_0x420004

這里記錄了鼠標(biāo)數(shù)據(jù),以及點擊的數(shù)據(jù)


現(xiàn)在需要將上面的邏輯移到 node 中,這個比較簡單
先扣_0x1722c3,這個函數(shù)非常簡單,因為這個方法的代碼就是一個個小方法體組成的直接一塊塊粘貼下來就行了
然后就是_0x2e98dd和_0x420004這兩個參數(shù),第一個環(huán)境信息可以直接復(fù)制寫死就行了,因為很多他并沒有強(qiáng)校驗這個參數(shù)的邏輯,很多獲取的都是一些共有的屬性。
第二個_0x420004這個參數(shù)是獲取的鼠標(biāo)軌跡信息,我是直接Math.random隨機(jī)數(shù)向下取整,然后格式和他傳參的格式相同,測了幾次發(fā)現(xiàn)對于這個軌跡并沒有強(qiáng)校驗,灑灑水就過去了
這樣的代碼就可以得到下面的一串字符串了

然后我們在看接下來的一段
btoa(_0x570bef["gzip"](_0x261229, {"to": "string"}));
前面的btoa之前已經(jīng)分享過代碼了,直接去知乎那篇文章抄一個就可以了
那_0x570bef["gzip"]又應(yīng)該怎么獲取呢?
其實_0x570bef["gzip"]也是扣就可以了,但是有可以直接偷懶的方法
先說我遇到的問題,這個問題知道的大佬麻煩給我說說
“我直接扣取的代碼在
_0x570bef["gzip"]的結(jié)果是個空串,但是我研究了一下應(yīng)該不是我環(huán)境被檢測了,直接在瀏覽器上也是沒有辦法獲取到結(jié)果
花了半個小時研究了下問題,沒整出來,我就直接偷懶了,因為是gzip壓縮算法,所以我直接套庫計算了。
這個壓縮算法 js 文件和簡單還原的 js獲取鏈接:https://pan.baidu.com/s/19w3bnXaxad_Ex6NdF9k6zQ 提取碼:s73l
然后我寫了一個zip方法直接得到下面的加密字符串
function zip(str) {
var pako = require("./pako")
const binaryString = pako.gzip(encodeURIComponent(str), {to: 'string'})
return btoa(binaryString);
}

為了驗證我們計算是否正確,直接帶入腳本請求

完事~,以上就是今天的全部內(nèi)容了,咱們下次再會~
