并发已完成,通杀所有akm网站,需要请添加右侧微信。


目标网址:

aHR0cHM6Ly93d3cuaWhnLmNvbS5jbi9yZXdhcmRzY2x1Yi9jbi96aC9lbnJvbGxtZW50L2pvaW4=

跟栈进入请求同名js,先查看代码结构

执行流程没什么恶心人的步骤,进入执行的步骤细看一下,发现字符串存在混淆:

通过LL内部方法混淆:

传参不影响混淆输出值:

LL内部存在多个解密函数:

三种思路解字符串混淆:第一种,分析LL混淆原理,从代码块中抠出LL部分后调用。第二种,直接hook所有调用LL.XX函数得到的值并替换。第三种,在控制台输出LL.XX对应的字符串并替换。由于LL内部的属性是动态的,第一种方法直接扣会很麻烦,所以这里讲下第二、三种方法。

hook方法,就是利用js的语法糖,将 LL.XX(a, b, c ,d) 转化为 (string=LL.XX(a, b, c, d), save("LL.XX", string), string) 的序列表达式的形式,不改变LL.XX输出的情况下将输出保存下来。使用ast流程如下:

在原代码头部初始化一个map:

匹配LL.XX类型函数,将其结果存入刚才初始化的map中:

处理前后是这样的:

处理后:

将处理后的js替换原js,发现请求失败,一般来说是检测了某函数的toString防止hook,直接搜toString,打断点

可以看到,对这个大的自执行函数有做检测,调试过程中可以在处理后的js中直接把nL函数中的OL写死成185,然后重新替换运行,发现可以成功运行,打印最终map:

此方法只能还原js经过的LL部分,因此要确保流程正确。仔细观察后发现:

LL中还藏有对函数的检测,这里不再细跟。跟进去会发现拿到这两串字符串后还是会计算出两个数值并存在数组中,把相应数值写死后,重复以上流程,便可将执行部分反混淆。

控制台输出反混淆就比较简单,先把它断到LL执行的部分,越靠后越好。然后正则匹配所有LL.XX,在控制台输出LL.XX()对应结果后进行替换。

匹配所有LL.XX:

插入js出值位置:

或者断点后在devtools控制台执行:

得到最终映射:

后续就没什么好说的了,把一些一元运算符、二元运算符和一些基础指令(indexOf、charAt之类的)还原,自执行函数替换,逻辑就很清晰了。

在图中两个位置断点就可以看到X5L(即sensor_data)的关键生成过程,简单点说就是检测一堆浏览器、硬件环境,加上脚本各处运行时间,最后加个密。