我是靠谱客的博主 霸气飞机,最近开发中收集的这篇文章主要介绍JS逆向:猿人学爬虫比赛第五题详细题解(下),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

上篇文章,我们已经找到了加密的地方,关键代码是这样的:

_$Ww = _$Tk["enc"]["Utf8"]["parse"](window['_$pr']["toString"]()), 
 _$Wu = _$Tk["AES"]["encrypt"](_$Ww, window["_$qF"], {
    'mode': _$Tk["mode"]["ECB"],
    'padding': _$Tk["pad"]["Pkcs7"]
}), 
window['_$ss'] = _$Wu["toString"]();

现在各个击破,抠出加密的函数。

这是一个很明显的AES加密,我们来看第一个参数 _$Ww 它的结果就是第一行代码,也很简单,找到 window['_$pr'] 赋值的地方即可。

全局搜索 _$pr,发现有七处地方,分别打上断点:

刷新页面,停到断点处:

这是它初始化的地方,继续执行,来到这里:

在控制台,分别输入实参和结果:

这里特别要注意,它前四次的加密在同一个地方,但是第五次换到了另外一处,因此要改变变量名及其调用。

这个时候来看加密参数和cookie值,会惊奇的发现:

1. 加密参数 m 的值,就是最后一次加密的时间戳

2.cookie字段m的值,就是最后一次函数调用的结果

现在第一个参数_$Ww 以加密的位置已经找到了,来看第二个参数 window["_$qF"],全局搜索 _$qF 定位到这里:

代码很简单,继续全局搜索 _$is,定位到了这里。

原来就是最后一个时间戳进行base64编码,取前16位作为AES的key值:

_$8K['_$qF'] = CryptoJS['enc']['Utf8'][_$UH[255]](_$8K['btoa'](_$8K['_$is']).slice(0, 16))

现在就剩 f 参数不知道在哪里,看起来也像个时间戳。

下面就来找找它在哪里生成的,如下图所示:

点击红色箭头处的 X,然后再点击Initiator这一列,数据接口的这一行:

有个 anonymous,跟进去看看:

注意标黄的这一行,点击 {} 进行格式化,往下翻,知道f赋值的地方:

原来是 window.$_zw[23],注意,是个全局变量,控制台输入,看看有值没:

这么一看,确实是一模一样,那 f 的值就是 window.$_zw[23]了,看看 $_zw 在哪些地方进行了赋值:

还真不少,那怎么知道第23个元素是哪个变量呢?控制台输入 $_zw 看看它的元素分别是啥:

 

以 "明说了,这个数组是指纹" 这句话,往后数相同的位移,得到了 

$_aiding.$_zw.push($_t1);

$_t1 就是第23个元素,来看看它赋值的地方:

只有这一句,至此,所有的加密参数都已全部知道出来,剩下的就是抠代码了。

代码怎么抠,我就不讲了。很简单的东西,不过这里有个天坑。我们在追 AES加密函数的第一个参数的时候,代码是这样的:

_$Wa = _$f$();
_$Is[_$Fe] = "m=" + b(_$Wa) + "; path=/";
_$8K['_$pr']['push'](b(_$Wa));
delete _$8K['_$Jy'];
delete _$8K['_$tT'];
_$8K['_$Jy'] = _$TT();
_$8K['_$tT'] = _$TT() - _$f$();

全局变量 _$Jy' 和 _$tT 的变化会引起b函数结果的变化,因此这里要特别注意。

还有一个坑就是 window['_$6_'] 也是变化的。具体怎么变,请读者自行发现,这里不做多的讲解。

下面是福利时间,这是本人的星球,主要讲解JavaScript代码的反混淆,趁着双11,也来搞个半折优惠。

最后

以上就是霸气飞机为你收集整理的JS逆向:猿人学爬虫比赛第五题详细题解(下)的全部内容,希望文章能够帮你解决JS逆向:猿人学爬虫比赛第五题详细题解(下)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部