首先 到目前为止,我对某数的了解还是不够的,一些环境检测啥的我也没完全弄明白,以下分析的只是我的个人思路,可能分析得不够准确,见谅啦
参考文章:
https://mp.weixin.qq.com/s/r3FXjvT5Mm9Ikg_bDEadcw
https://mp.weixin.qq.com/s/IZUY2VHAKsFb_DXmvpSbrg
https://mp.weixin.qq.com/s/UYPnanAHnVYBh2t6f-UkPA
https://mp.weixin.qq.com/s/YaChHGaIxA13xE03KYD-Sg
一、判断一个站是某数
当一个站首页源码有这个
并且他的cookie长这个样
那基本就可以确定这是某数了(判断是几代某数的,可以看他cookie的首位数字)
二、找到进入第二层入口
无痕模式,打上script,然后就是跳过,来到这里
这个js会被加载进html,且给window.$_ts赋值
继续跳过,进到这里
因为这是新五代没办法搜call,这时候可以hook cookie或者eval找到第二层的入口,也可以搜 “]](_”,有16个,找到跟这个_$nX = _$NJ[_$yP[30]](_$JG, _$rr);
结构相似的就是入口了,然后就是单步进去
注:这里widnow.$_ts的值第二层会用到
三、第二层分析
接下来要扣代码,因为网站是动态的,得静态调试才行,可以用fiddler进行本地替换,把html和那个js文件替换掉。
第二层其实用ast解混淆会好分析很多,奈何我ast基本功比较拉,不管了,大力出奇迹
接着分析…
首先是初始化
第二张图箭头处var _$fM = _$_A(889);
是生成一个16位数组,然后取后四位,这四位数组后面会用到
接着进入主流程…
搜(938, 1
单步进来,然后就是硬刚混淆代码了,一直一直一直一直一直一直一直单步,会走到这里
这里的_$Di
和_$Df
后面会用到,并且_$Df的值会给他换一个变量存起来,一定要注意这里的时间戳
然后又是一直一直一直单步,中间会有很多环境检测(如selenium,navigator这些),我这里跳过
直接来到128位数组开始的地方
首先第一个push的是20位数组(前16位是对window.$_ts[21]
进行加密的,后四位是重中之重,是经过多次映射关系匹配的,一定注意这四个数字的顺序,不然过不了的
接着是对上面提到的_$Df进行一些操作后加密,生成8位数组
接着是两个固定数字和两个固定数组
接着是初始化的时候提到的四位数组
_$Yq[number++] = _$fM; //初始化的时候生成16位数组的后四位
接着是固定数组和固定的数字
接着会先占位,等到最后生成14位数组的时候,这里会再添加四位数组
_$Yq[number++] =undefined;
接着会生成三个20位数组(或者四个20位数组),这是根据LocalStorage加密生成,但这些数组偶尔会出不来,这个问题请教了nanda老哥,这是他的解答,太顶了,nanda yyds
还有LocalStorage里面的参数一般可以写死除非某些站检测严格,也可以不写,虽然最后生成的cookie短了些,但也能获取200页面
接着就是有些固定的值和14位数组了
接着就是concat操作,到此128数组就结束了
写到这已经没啥力气…下面是生成32位数组的,就直接放笔记出来了…
接着…终于开始生成cookie了
这里拿到window.$_ts[22]
然后之前生成的128数组和这个数字进行拼接,再加密,最终生成一个数字
接着会对上一步生成的数字进行加密生成四位数组,最后再拼接
然后对之前生成的时间戳进行检测,最后会生成一个16位数组
然后最终的cookie就生成了
var cookie=_$Xz[643] + _$7e + _$e_(_$7K(all_arr, new_32_arr));
啊,终于结束了
总结一下:单步,单步,单步,刚开始跟的时候会一脸懵逼毫无思路的,这时候一定要耐心单步哈哈哈,和那些变量、函数混个脸熟,大概知道这个变量代表什么,这个函数大概做了什么操作。
整个流程还有很多细节,没法一一说全,只能靠自己去踩坑啦
接下来的话有时间打算用python还原整个算法,如果最后做不出来就是我太菜了哈哈,还得努力呀
最后最后,谢谢nadna和smartpang的解答