经过上回的ast还原之后 可以看到最终结构
可以看到经过还原,之后整个结构都非常的明显
接下来就一步步跟着函数内部看看具体到底是怎么生成的
第一个函数`a`
js执行后看看结果 第一个函数a 就是创建了一个空函数
由于平坦流的会有一些作用域的问题等等限制,大概率内部是不会操作别的变量
接着往下分析
第二个函数R
第二个函数R会生成56位数组,目前来说看不出来到底是怎么生成的
往里面看看 先把传入的参数记录下来 方便回头查看
接着看看内部函数的具体实现
上面还有一些就是函数的定义和变量的定义 先不关注 就看最尾部执行函数和return 的地方
可以看到最后也是放回了一些函数最终return H
第一个函数l放回的也是一个空数组
第二个函数p
就是把空数组当做参数传入p中 那r是什么
编辑
r是一个字符串,既然涉及到了字符串那么大概率是固定的,回头看看变量
确实如此, 不过这个值每天都会变,但是当天是不会变得
最后看一下执行结果
s=undefined 那么大概率就是操作传进去的v或者r了
执行r后结果还是不变
编辑
再去看看v
v是一个数组, 还原纯算一定要对一些基本的转换很敏感
更多的还是经验, 还是那句话就是多看多做多练
为什么说要敏感, 数组首位是4, 还记不记得r是什么 '1d17' 长度刚好是4
既然长度是r的长度,那么数组后面的值会不会也是和r有关,那么什么情况下字符串能转成数字
charcode
试一下
确实如此,这就是为什么要敏感,如果看到这个数组一点思路都没有,有关系嘛,没有关系!
但是会在花最起码10分钟左右继续跟里面的步骤
那么现在可以知道p函数就是把第二个参数的长度添加进去最后在把长度charCodeAt()一下
在来看看第三个也是p函数,看一下运行结果 是不是可以通用,那么就剩下大部分时间了
n=arg[1] 就是刚才记录的"g7c3mC+v0MuSMx+DxzAY46iTfU0nqcMVWQqFm49dMFo="
为什么是arg[1]等于这个呢,不应该是arg[0]嘛, 看这个函数内部
可以看到 apply调用一个函数,具体函数用处就不介绍了 null是函数内部this指向为空 concat是拼接两个数组返回一个新的数组
arg是一个类数组但是也可以使用arry的一些方法
也就是[11792,...arguments] ...
是展开运算符
/* 展开一个数组 */
let arr = [1,3,5,7,9];
console.log(...arr); // 1 3 5 7 9
后面为了省事我都会用...
来表示展开一个数组
那么这样数组的第0位就是11792
这样就搞明白了为什么是arg[1]
直接看传进去的v数组
红线处是上一个函数添加进去的数组
第一个是44
发现可以对的上,那就不用再往里面去看了
再来看看这个E=T[V]
getTimezoneOffset() 方法返回协调世界时(UTC)相对于当前时区的时间差值,单位为分钟。
执行一下看结果
-480
在看看c函数,注释的变量都是固定的值,为了省事我直接不写这段了
在ast中可以直接还原但是麻烦,有些地方还要考虑作用域的问题
还是很烦写ast代码,为了省事就是没搞了
c是node内置函数的函数
c = parseInt;
就是时间戳/1000后 取整数
在看看a函数干了什么
可以看到v数组的长度变成了55位
一般来说操作数字的一个都是 >>
<<
&
某个数字
这个没办法只能去内部看看具体都干了些什么
可以看到H等于push,_等于arg[1],有5次push,多出来5位可以对上
而多出来的5位 Ml等于240 这是一个固定值
后面有添加了四个值Xl, Kl, $l, ap
_p = e;//arguments[2];
x = l[h];//l = Math; h = "max";
w = l[g];//g = "min";
b = w["call"](l, _p, y);
//y = 4294967295;
k = x["call"](l, q, b);
//q = 0;
这一段就是拿出传进来的时间戳,然后通过Math.max min 取出最大和最小的值
这一段也算是花指令吧 传进来的时间戳怎么可以会比4294967295大
k最终也就是等于原来的时间戳的值在通过>>
和&
组合计算得到一个值最终在添加到数组中
拿出里面的值还原一下
确实可以对上
在看看e这个函数
Q = 0
, X=100
这种没有特殊入参的 可以多执行几次看看规律
可以看到每次执行都是会变的结果, 而且都没有超过X变量的值100 也没有低于Q的值就是负数
那就大胆一点直接按随机数 0-100
a
函数执行一下看看
很明显数组就是增加了一位 最后一位是7 其他没变 那就是吧上面生成的随机数push到v中
直接看看y
函数,还是老样子直接执行看看结果
发现位数没变 但是值有些被改变了有些没被改变
而且值看看规律[1]和上一个数组比大了2,[2]也是加了2,但是到了[3]就和上一个数组比加了6,但是[4],值增加了4,没有明显的规律
跟进函数内部看看
代码解构理清楚了在看看内部的具体实现
看完上图对大概具体逻辑有一个大致上的了解 最后在整理一下
一开始 取出c
的第零位 再加上ol, 开始的ol等于零
W = i + ol;//ol=0
pl = i + ll;//ll=0
不管走 if
分支还是else
分支 数组的第零位都是不会被改变的
也确实如此
但是还是要确定到底是走的什么分支因为看了大概执行顺序 知道了 ol ll的值是会被改变的
所以还要继续看15916节点的内部
一进来之后就立马先把W push 到新数组中
ol 就变成了 nl 而nl=1
也就是自增了1
ll变成了 d * ol 前面的图片中可以看到 d是等于2的 ol已经被改变了 ol=1
ll最终等于2
r在的值被改变了 就是判断的s这里是走不同分支的改变条件设置的地方
r=2而e还是等于0
所以当我们取出数组的[1]的时候 s
已经是false
了 ll = 2
就会进入3249的分支
这里和前面的一样 不同的是 push的变量是另外一个
pl 在前面的分析出就是arg[1][1]
+ 2
v[1]确实加上了2
最后 如果条件为真 下标加上当前下标的元素
如果为false
就是2*
当前下标
至此第一个56为数组就完成了
---------------------------------------------------------------------------------------------------------------------------------