akamai鼠标轨迹

各位肯定被akamai鼠标轨迹、点击事件、键盘事件,网页交互困扰

那么我们就研究一下鼠标轨迹、点击事件

AST解混淆, 拿到解混淆后的代码,

如下,sensor_data就是我们要搞的参数

如何解混淆这里就不赘述了,需要的可以看我上一篇文章!

开始之前,先讲一下分析思路

第一:首先有了全局的obj,那完全可以把obj作为一个日志功能,通过obj看函数的执行流程,就是要逆向的主流程

第二:akm有大量的数值计算,只扣部分数值,会影响其他数值的计算不成功,所以我计划扣整个流程,一比一还原执行流程

那么正片开始

1、前期步骤:相关代码,全部拿下来,缺什么补什么

找到目标参数: sensor_data, 把整个函数拿下来

如下:可以看到:Yun就是我要的参数, 而Yun又来自tEn

javascript 复制代码
// 生成值 函数
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是在下方这个函数生成的,

可以看到该函数有很多值,直接全扣下来(重点)

javascript 复制代码
// 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:点击事件

javascript 复制代码
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坐标

需要注意:参与计算了环境数组很多值!

javascript 复制代码
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帮我们生成轨迹函数

javascript 复制代码
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,完成~

相关推荐
草莓橙子碗13 小时前
Claude 使用指南
开发语言·python
工具分享13 小时前
陪跑跟品爆单AI选品助手,高效跟品会赔本吗?
人工智能·python
COOLMO研究AI14 小时前
Python 如何实现 AI API 的提示词(Prompt)版本管理与热更新
人工智能·python·prompt
老郑聊AI业财智造14 小时前
Transformer 技术架构与源码分析
人工智能·python·深度学习·语言模型·架构·transformer·软件工程
程序员三藏14 小时前
自动化测试用例编写详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
230万光年的思念14 小时前
分子动力学模拟参考文献
python
HongXu_CaiYi15 小时前
0103-python相关-函数、文件
python
vortex516 小时前
从Conda到UV:Python项目依赖管理的现代演进
python·conda·uv
何以解忧,唯有..16 小时前
Python time 模块详解:时间处理与日期操作指南
开发语言·python
梅雅达编程笔记16 小时前
Day 18 · 综合实战 B:AI 客服 Agent(专栏收官)
python·智能客服·ai agent·意图识别·ai客服·大模型应用·ai办公自动化