各位肯定被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 会自增 1
var 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 w8n
set_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到5
var 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)); // 假设屏幕宽度为1920
y = 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,完成~