各位肯定被akamai鼠標軌跡、點擊事件、鍵盤事件,網頁交互困擾
那么我們就研究一下鼠標軌跡、點擊事件
AST解混淆, 拿到解混淆后的代碼,
如下,sensor_data就是我們要搞的參數
如何解混淆這里就不贅述了,需要的可以看我上一篇文章!
開始之前,先講一下分析思路
第一:首先有了全局的obj,那完全可以把obj作為一個日志功能,通過obj看函數的執行流程,就是要逆向的主流程
第二:akm有大量的數值計算,只扣部分數值,會影響其他數值的計算不成功,所以我計劃扣整個流程,一比一還原執行流程
那么正片開始
1、前期步驟:相關代碼,全部拿下來,缺什么補什么
找到目標參數: sensor_data, 把整個函數拿下來
如下:可以看到:Yun就是我要的參數, 而Yun又來自tEn
// 生成值 函數
var Qvn = function () {var w7n = false;var b7n = pV(lm(z8n["ajTypeBitmask"], E7n), 0) || pV(lm(z8n["ajTypeBitmask"], K7n), 0);var AFn = pV(lm(z8n["ajTypeBitmask"], cJn), 0);if (sQ(z8n["aprApInFlight"], false) && AFn) {z8n["aprApInFlight"] = true;w7n = true;}z8n["ajTypeBitmask"] = 0;// var xJn = fD();// xJn["open"]("POST", VFn, true);// xJn["onloadend"] = function () {// qvn && qvn(xJn, w7n, b7n);// };var YUn = Fx["JSON"]["stringify"](tEn);var EZ = "{\"sensor_data\":"["concat"](YUn, "}");// console.log(EZ)sensor_data.push(EZ);Qxn = 0;
};
往前找堆棧,tEn是在下方這個函數生成的,
可以看到該函數有很多值,直接全扣下來(重點)
// tEn生成函數
var pln = function (Xvn, Dln, input_list) {// tEn生成函數var vcn = 0;var B7n = {};var QJn = false;vcn = q3();var qgn = c1(q3(), Fx["window"].bmak["startTs"]);var hZ = "do_en";var VNn = "dm_en";var JEn = "t_en";var gNn = ""["concat"](hZ, ",")["concat"](VNn, ",")["concat"](JEn);// ffs 生成函數var Gbn = '0,-1,0,0,-1,-1,0;' + phn(input_list) + '0,-1,0,0,2108,2108,0;';var EEn = Fx["document"]["URL"]["replace"](new Fx["RegExp"]("\\\\|\"", "g"), "");// ajt 生成地方,bcn 在軌跡處會進行賦值, Cxn是定時任務, 1000ms 會自增 1var Tvn = ""["concat"](bcn, ",")["concat"](Cxn);if (QM(bxn["fpValCalculated"]) && (sQ(dnn, false) || EG(Cxn, 0))) {bxn = Fx["Object"]["assign"](bxn, PB(), {"fpValCalculated": true});}var Bbn = Rz(),F7n = Sbn(Bbn, 4),Cbn = F7n[0],tJn = F7n[1],MUn = F7n[2],VEn = F7n[3];var wNn = md(),JZ = Sbn(wNn, 4),PNn = JZ[0],Egn = JZ[1],chn = JZ[2],bUn = JZ[3];var LCn = RY(),CCn = Sbn(LCn, 6),bZ = CCn[0],wln = CCn[1],RJn = CCn[2],Znn = CCn[3],Kbn = CCn[4],G8n = CCn[5];var qZ = Fk(Fk(Fk(Fk(Fk(Cbn, tJn), nEn), fCn), MUn), VEn);。。。
扣這個函數的時候,會有很多值,在之前也能找到聲明,拿下來就行
剩下的流程就是,一點一點扣環境數組的生成邏輯
當出現完整的數組環境,那就前期就ok了
下邊就需要注意 tEn函數的執行流程 他如何被觸發?
get請求一次,獲取js文件
post兩次,兩次位置分別在哪里
重點:默認只有兩次發包,操作鼠標點擊才會發第三次post包,設置cookie為~0~
我們把斷點放在tEn函數調用的地方
操作鼠標,滑動 — > 然后點擊
就能斷到事件類型的發包,可以看到Cgn函數
可以看到,傳入了兩個參數 : Axn, Cvn
Axn: 存放我們的軌跡信息,有x y軸坐標信息
Cvn:事件類型: 1:是正常收集軌跡, 3:點擊事件
var Cgn = function (Axn, Cvn, input_list) {var dNn = Mz(Axn, Cvn, Fx["window"].bmak["startTs"]);nhn += dNn["ts"];if (dnn && dNn["eventLimitBiometricAutopost"]) {bcn = 4;// Fcn(QM(1), dNn[Vj()[gk(bm)](TO, QM({}), Ek, f8)]);} else if (dnn && sQ(Cvn, 3)) {bcn = 1;d8n = true;set_w8n()Fcn(false, input_list);}if (dnn && QM(d8n) && sQ(dNn["mmeCnt"], 20)) {bcn = 11;// set w8nset_w8n()Fcn(false, input_list);}
};
函數內部: Mz函數
拼接軌跡次數、標識、軌跡時間間隔、x坐標、y坐標
需要注意:參與計算了環境數組很多值!
var Mz = function (vL, Us, rD) {var qd = 0;var h9 = false;if (sQ(1, 1) && C2(1, 100) || CR(Us, 1) && C2(0, 75)) {var QK = vL;var mY = -1;var sI = -1;if (QK && QK["pageX"] && QK["pageY"]) {mY = Fx["Math"]["floor"](QK["pageX"]);sI = Fx["Math"]["floor"](QK["pageY"]);}var Ep = QK["toElement"];// if (Td(Ep, null)) Ep = QK["target"];var XW = Hq(Ep);qd = c1(q3(), rD);var R3 = ""["concat"](ZD, ",")["concat"](Us, ",")["concat"](qd, ",")["concat"](mY, ",")["concat"](sI);// if (UK(typeof QK["isTrusted"], "undefined") && sQ(QK["isTrusted"], QM({})))// R3 = ""[Sk()[mQ(UP)].call(null, IX, sC, zs)](R3, GQ()[O6(St)](IY, ZF));R3 = ""["concat"](R3, ";");Ap = Fk(Fk(Fk(Fk(Fk(Ap, ZD), Us), qd), mY), sI);g3 = Fk(g3, R3);}if (sQ(Us, 1)) WY++; else mL++;ZD++;var K4;return K4 = {"ts": qd, "eventLimitBiometricAutopost": h9, "mmeCnt": WY}, K4;
};
收集軌跡
這個時候可以用全局的obj
記錄收集軌跡信息
喂給AI
讓AI幫我們生成軌跡函數
function generateMouseList() {var mousList = [];var x = D2_21([700, 800]);var y = D2_21([300, 500]);var numPoints = D2_21([100, 200]);// 隨機生成鼠標軌跡for (var i = 0; i < numPoints; i++) {// 隨機坐標變化,假設變化范圍為-5到5var dx = Math.floor(Math.random() * 11) - 5; // x坐標變化范圍 [-5, 5]var dy = Math.floor(Math.random() * 11) - 5; // y坐標變化范圍 [-5, 5]// 更新坐標x += dx;y += dy;// 防止坐標超出范圍 (例如屏幕尺寸或界面限制)x = Math.max(0, Math.min(1920, x)); // 假設屏幕寬度為1920y = Math.max(0, Math.min(1080, y)); // 假設屏幕高度為1080// 隨機生成時間戳,保證時間流逝var timestamp = Math.floor(Math.random() * 1000) + 10000;// 假設每個點的類型 1 表示常規點,最后一個點為 3 表示結束var type = (i === numPoints - 1) ? 3 : 1;// 保存軌跡// mousList.push([x, y, timestamp, type]);mousList.push([x, y]);}return mousList;
}
最后拼接完整的流程 :
1、get請求 頁面
2、post —>第一次 發包
3、post —>第二次 發包
4、計算軌跡信息
5、post —>第三次 發包
網站測試
某adidas
ok,完成~