最近有朋友说akm3有些站已经正式上了,代码混淆跟以前差很多,简单看一下反混淆:

网站:

https://www.bestbuy.com/site/apple-macbook-air-13-inch-laptop-m3-chip-8gb-memory-256gb-ssd-midnight/6565837.p?skuId=6565837

akm js:

https://www.bestbuy.com/3lfAizpUjK1lwZYhWQ/b5auDtrSp5rhYa/ZHE1PQ/bVwZ/GWYkOy4

混淆分析

点进去看了一下,貌似和之前的混淆方法没差多少(akm2反混淆参考:https://1997.pro/archives/1712635397041

只是把之前的LL.xx()改成了LL()[XX(XX)]()的形式,混淆流程是变麻烦了,但是用之前文章的方法,实际上跟没变没什么区别。

这里反混淆搞了一半,突然发现js变了,大概十多分钟js变一次,当时愣了一下,以后算法变动态了,固定一份后替换后还是能跑通(试了下加购物车和付款正常,应该算是跑通了),先直接固定一份反混淆了。

提取运行的函数

固定后发现一共有三个解密字符串的函数:

分别是bD、s2、hN(动态js,每份都不一样)

先把符合s2()[XX(XX)]特征的都匹配出来:

获得代码块与原字符串映射

获得需要解混淆的部分后,先去浏览器控制台找原js中出sensor_data的地方,断下来:

为什么要断到这里呢?因为与传统的ob混淆不同,akm的字符串解密过程是动态的,中间用复杂的控制流控制着一些字符串的生成以及数组索引的值。如果在中间随便找个位置打断点,那断点位置之后的流程中的解密函数还没有生成出来,就无法调用拿到解混淆的字符串。

至于怎么找这个位置,调过akm2的应该很好找,这里分享一个我自己用的技巧,搜索 &= , 一般有两个位置,在这两个位置打上断点:

断到的位置一般就是最终加密的位置,进入它的上一个栈:

上一个栈就是传入参数的位置了,这里可以看到老版本的环境数组已经没了,新版本变成了json格式环境,直接断到最后位置:

然后控制台运行以下代码:

成功获取字符串映射:

AST替换字符串到原js

最后一步就是把这些字符串替换到原js中了,需要替换以下三种:

第一种,bD()[xx(xx)]()

第二种,bD()[xx(xx)].call(xx,xx,xx)

第三种,bD()[xx(xx)].apply(xx,xx,xx)

ast替换进去:

最终效果: