akamai鼠标轨迹

发布于:2025-08-15 ⋅ 阅读:(17) ⋅ 点赞:(0)

各位肯定被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,完成~


网站公告

今日签到

点亮在社区的每一天
去签到