截至2025.07.19可用
定位加密位置
加密位置:
定位方式,XHR,跟栈

跟栈

QL打断点,重新断住


分析为,一个函数传入四个参数
var QL = QI[d9(Nv.mQ)](QJ, Qh, Qv, this[d9(Nv.m9)][0xa1a * 0x2 + -0xd2a + -0x35 * 0x22]);
QI[d9(Nv.mQ)]为函数
QJ,QH,QV, this[d9(Nv.m9)][0xa1a * 0x2 + -0xd2a + -0x35 * 0x22]为传入函数里的四个参数
进入函数


事实上这种传参方式特别常见,
基本就是函数传入几个参数,再传入一个函数 ,函数里面返回一个函数,函数的作用也是传入几个参数,一个函数,嵌套几层,最后的结果就是传入的函数,然后传入的参数给传入的函数传参。
有点乱
用python演示
python
def b(a,b):
return a(b)
def hhh(h,a):
return b(h,a)
def a(b):
print(b)
hhh(a,3)
hhh(a,3)经过很多次调用最后执行a(3),这种网页调试里面很常见的(留个心眼),所以要不断进入函数内部。
简单来说就是一个函数调用传参本来可以直接用,非要嵌套几层函数再调用
最后不断进入函数,一共进入了四层
进入到一个控制流里面

控制流也特别常见,每一个分支打上断点,加密位置也就找到了。
接下来扣代码
混淆代码解释
这是一个混淆的JS代码,首先得扣三个主要
大数组函数或大数组,自执行方法,解密函数
不懂这些作用得请先参考 JS逆向之JS混淆_js代码混淆-CSDN博客
大数组一般在js文件最上方

知道大数组叫 Q(),另外两个函数也容易找了
再解密函数里面必须调用大数组(不一定是传参,也可能是赋值)

所以很显然,a函数是解密函数
解密函数后面要经过多次被调用(留个心眼),非常重要
接下来是自执行方法

事实上有两个 自执行函数,看被大数组Q被那个调用。(不一定是传参,也可能是赋值)
第一个坑
先把这三个关键函数扣下来,然后先运行试试,发现不断运行,结束不了。

这种情况一般有两种
一种是在循环里异常捕获,导致跳不出去循环,一种是定时器,定时运行
但是没有报window未定义,所以不是定时器的问题。所以只剩下异常捕获
这是这个网站的第一个坑
直接搜索try


很显然,死循环,手动输出异常是什么,m8,记得要break,不然输出死循环

结果是E2未定义

E2可以写死,383
补好E2,程序可以运行

扣代码
混淆的代码主要扣对象,次要扣函数了
现在咱们可以肆无忌惮的扣代码了

G为定义,直接搜

直接扣

直接定位搜索

a函数进入后发现解密函数,这很正常 ,在混淆代码里,解密函数多次被调用

继续运行


直接扣下来。接下来基本都是缺对象了(呜呜呜)或者缺调用解密方法,缺什么补什么
但你补着补着,发现要补的对象还是很多的

仔细观察,你会把很多对象一把扣了。(这就是老辣的经验)

接下来分析


Qk解释
经分析,Qk就是这么长一坨
javascript
Qk = mO[Um(ik.m8)](mO[Um(ik.m9)](mO[Um(ik.mm)](mO[Um(ik.mO)](mO[Um(ik.mQ)](Qk, '|'), mO[Um(ik.ma)](mE)), '|'), new Date()[Um(ik.mZ)]()), '|1');
这就是对象嵌套对象调用对象属性,非常的绕,不过没事,咱们只扣对象

发现又是解密函数a

发现另一个Qk


接下来又是喜闻乐见的扣对象,调用解密函数a
传入参数是接口url未带加密参数的编码部分


最后差一个mE

第二个坑 (可有可无)
把mE补上,才发现,有第二个坑(事实上做第一次没有发现这个坑)


这两个Qv是不一样的,这个是0,补上出结果

完美收官


最后封装

对url进行编码
javascript
from urllib.parse import quote
encoded_url = quote(url, safe='')
直接出结果,最后是一串加密数据,非常简单的·DES解密。
这个网站详情有轨迹验证,请求多了有阿里滑块(我是菜鸡,解决不了一点)

总结
仅供学习!!!
扣混淆代码,先扣三个函数(大数组,自执行方法,解密函数)
自执行方法会调用大数组函数(不一定是传参,也可能是赋值)
解密函数也会调用大数组函数(不一定是传参,也可能是赋值)
仅供学习!!!
混淆代码跟栈经常会是喜闻乐见的函数嵌套函数传参函数,一步一步进去即可
仅供学习!!!
扣混淆代码以扣对象为主,次要扣函数。期间解密函数一直会被调用赋值
仅供学习!!!