某程无忧WEB端逆向阿里系acw_sc__v2算法逆向详情解析(附源码)

部署运行你感兴趣的模型镜像

本文仅用于逆向研究交流,禁止非法用途,如遇侵权联系删除!!!

aHR0cHM6Ly93ZS41MWpvYi5jb20vcGMvc2VhcmNoP2pvYkFyZWE9MDEwMDAwJmtleXdvcmQ9JnNlYXJjaFR5cGU9MiZzb3J0VHlwZT0wJm1ldHJvPQ==

1接口分析

本次分析接口用的是搜索后的职位列表

经过多次增删发现

ck中acw_sc__v2 是必须带的,也是本次逆向的目标

2acw_sc__v2解析

首先控制台hook下ck

(function () {
  'use strict';
  var cookieTemp = '';
  Object.defineProperty(document, 'cookie', {
    set: function (val) {
      if (val.indexOf('acw_sc__v2') != -1) {
        debugger;
      }
      console.log('Hook捕获到cookie设置->', val);
      cookieTemp = val;
      return val;
    },
    get: function () {
      return cookieTemp;
    },
  });
})();

清空下ck和存储的信息点一下下一页

hook到了!我们跟下栈

可以在这里看到值得生成

我们详细得解析一下这个函数做了什么

生成函数

结构是混淆+两个循环

                                    !function(Vs, VD) {
                                        var tz = tD;
                                        for (var VP = JSON[tz(DD.Y9)](tz(DD.YY) + tz(DD.Yk) + tz(DD.Yl) + tz(DD.YV) + tz(DD.YX) + tz(DD.Yo) + tz(DD.Yt) + tz(DD.Ya) + tz(DD.YU) + tz(DD.YH) + tz(DD.Yg) + tz(DD.Yc) + tz(DD.Ys) + tz(DD.YD) + tz(DD.YP)), Vf = tz(DD.Yf) + tz(DD.YO) + tz(DD.Yh) + tz(DD.Yz), VO = [], Vh = '', Vz = '', VM = 0xe3 * -0x11 + 0x1 * 0x610 + 0x903; VM < Vs[tz(DD.YM)]; VM++)
                                            for (var Vq = Vs[VM], Vn = -0x23 * 0xdb + 0xd * 0x6e + 0x185b; Vn < VP[tz(DD.Yq)]; Vn++)
                                                lN[tz(DD.Yn)](VP[Vn], lN[tz(DD.YI)](VM, 0x1fc7 * -0x1 + 0x21d6 + -0x36b + PX)) && (VO[Vn] = Vq);
                                        for (Vh = VO[tz(DD.YA)](''),
                                        VM = 0x1ad0 + -0x50f * -0x1 + -0x1fdf; lN[tz(DD.YE)](VM, Vh[tz(DD.YM)]) && VM < 0x1a54 + 0xa1c + -0x2448; VM += 0x1a85 + 0x1b08 + -0x36e8 + PX) {
                                            var VI = (lN[tz(DD.Yu)](parseInt, Vh[tz(DD.YT)](VM, VM + (0x38 * 0x11 + -0x2 * -0x2fb + -0xb09 + PX)), -0x39e * 0x3 + -0x538 + 0x5 * 0x33a) ^ lN[tz(DD.Yu)](parseInt, Vf[tz(DD.YT)](VM, lN[tz(DD.Yr)](VM, 0x8b1 * -0x1 + -0x13e6 + -0x48a * -0x6 + PX)), -0xfe8 * -0x1 + -0x1 * 0x5ad + 0x89 * -0x13))[tz(DD.YS)](0x6e4 + -0x9f1 * -0x1 + -0x51 * 0x35);
                                            lN[tz(DD.Ym)](0x449 * 0x9 + 0x4f5 + 0x3 * -0xef6 + PX, VI[tz(DD.Yq)]) && (VI = lN[tz(DD.Yw)]('0', VI)),
                                            Vz += VI;
                                        }
                                        kR(VD, Vz);
                                    }(Vk, V2),

看下入参

VD很明显是url链接 

VS来自 无ck请求返回得值

把函数都扣下来还原下混淆

所有得属性都被加密了

都经过函数tz

tz(DD.YE)

可以手动也可以扣下来解密函数

属性都搞下来之后可以看到大概长这个样子

这里给下解混淆过得

!function (Vs, VD) {
    for (var VP = JSON["parse"]("[15, 35, 29, 24, 33, 16, 1, 38, 10, 9, 19, 31, 40, 27, 22, 23, 25, 13, 6, 11,39,18,20,8, 14, 21, 32, 26, 2, 30, 7, 4, 17, 5, 3, 28, 34, 37, 12, 36]"), Vf = '3000176000856006061501533003690027800375', VO = [], Vh = '', Vz = '', VM = 0; VM < Vs['length']; VM++)
        for (var Vq = Vs[VM], Vn = 0; Vn < VP['length']; Vn++)
            lN['TkOjj'](VP[Vn], lN['akNsR'](VM,-348 + PX)) && (VO[Vn] = Vq);
    for (Vh = VO['join'](''),
             VM = 0; lN['PktzN'](VM, Vh['length']) && VM < 40; VM += -347+ PX) {
        var VI = (lN['JrXJd'](parseInt, Vh['slice'](VM, VM + (-347 + PX)), 16) ^ lN['JrXJd'](parseInt, Vf['slice'](VM, lN['xrjKF'](VM, -347+ PX)), 16))['toString'](16);
        lN['kYITR'](-348 + PX, VI['length']) && (VI = lN['YFqAX']('0', VI)),
            Vz += VI;
    }
        console.log(Vz)

}(a1, a2)

接下来是花指令

这个花指令需要注意下,嵌套了两层花指令

初次为对象LN

LN得部分花指令函数又引用了Yt

都补上之后就可以拿到数据了

花指令可以补也可也还原回去,没什么检测

python测试一下没什么问题

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值