gpt4 book ai didi

javascript - 这个混淆的 JavaScript 是如何工作的?

转载 作者:IT王子 更新时间:2023-10-29 02:43:56 25 4
gpt4 key购买 nike

下面的 JavaScript 是如何工作的?

我知道这是缩小代码。我试过对它进行一些去混淆处理,但我无法清楚地了解它是如何实现这种效果的。我可以看到它使用字符串进行某种迭代,使用 Date 对象,奇怪的字符串操作,数学函数,然后代码自行打印。

如何用最小的示例重写相同的效果?

eval(z='p="<"+"pre>"/* ,.oq#+     ,._, */;for(y in n="zw24l6k\
4e3t4jnt4qj24xh2 x/* =<,m#F^ A W###q. */42kty24wrt413n243n\
9h243pdxt41csb yz/* #K q##H######Am */43iyb6k43pk7243nm\
r24".split(4)){/* dP cpq#q##########b, */for(a in t=pars\
eInt(n[y],36)+/* p##@###YG=[#######y */(e=x=r=[]))for\
(r=!r,i=0;t[a/* d#qg `*PWo##q#######D */]>i;i+=.05)wi\
th(Math)x-= /* aem1k.com Q###KWR#### W[ */.05,0>cos(o=\
new Date/1e3/* .Q#########Md#.###OP A@ , */+x/PI)&&(e[~\
~(32*sin(o)*/* , (W#####Xx######.P^ T % */sin(.5+y/7))\
+60] =-~ r);/* #y `^TqW####P###BP */for(x=0;122>\
x;)p+=" *#"/* b. OQ####x#K */[e[x++]+e[x++\
]]||(S=("eval"/* l `X#####D , */+"(z=\'"+z.spl\
it(B = "\\\\")./* G####B" # */join(B+B).split\
(Q="\'").join(B+Q/* VQBP` */)+Q+")//m1k")[x/2\
+61*y-1]).fontcolor/* TP */(/\\w/.test(S)&&"#\
03B");document.body.innerHTML=p+=B+"\\n"}setTimeout(z)')//

JSFiddle

最佳答案

前言:我在http://jsfiddle.net/WZXYr/2/对代码进行了广泛的美化和注释。

考虑最外层:

eval(z = '...');

代码字符串存储在变量z 中。赋值运算符返回分配的值,因此代码字符串也作为参数传递给 eval

代码字符串 zeval 中运行。代码非常迟钝,即使清理后也是如此,但它似乎:

  1. 解析由字符 4 描述的 base-36 数字字符串。
  2. 填充值映射,使用全局变量 exy 来保存映射状态。 map 状态在某种程度上是挂钟当前秒数的函数(new Date/1e3)。
  3. 使用映射值,代码生成输出字符串,p
    • 代码使用p += "*#"[index]来决定是否使用空格、星号或井号,其中index实际上是e[x++] + e[x++](如上所说,ex负责 map 状态)
    • 如果索引大于 "*#" 的长度,则有回退代码用 z 中的字符填充输出 p >。内部字符由动画字符填充,而外部字符则从 z 中提取。

在代码的末尾,调用了setTimeout(z),它异步计算代码字符串z。重复调用 z 允许代码循环。

简单示例:

这是一个 super 简单的版本(http://jsfiddle.net/5QXn8/):

eval(z='p="<"+"pre>";for(i=0;i<172;++i)if(i > 62 && i < 67)p+="!---"[~~(new Date/1e2 + i)%4];else p += ("eval(z=\'" + z + "\')")[i];document.body.innerHTML = p;setTimeout(z)')
  1. for 循环将每个字符添加到输出字符串 p(该字符串的长度为 172 个字符):

    for(i=0;i<172;++i)
  2. 内部条件决定我们是否在位置 62 到 67 之间的 Angular 色上,这些 Angular 色是动画 Angular 色:

    if(i > 62 && i < 67)
  3. 如果是,则打印出 !---,根据第二个挂钟值的十分之一移动。这提供了动画效果。

    p+="!---"[~~(new Date/1e2 + i)%4]

    (所有围绕 new Date 的脏东西实际上只是为了将日期值转换为 0 到 3 之间的数字。)

  4. 否则,如果我们不在动画 Angular 色上,则打印由

    定义的字符串中的索引-i 字符
    "eval(z='" + z + "')"

    eval(' and ')包围的代码字符串z

  5. 最后,输出字符串并使用setTimeout排队另一个z的执行:

    document.body.innerHTML = p;setTimeout(z)

请注意,我的最终输出不是完全正确的——我没有考虑最后的反斜杠——但它仍然应该让你很好地了解该技术是如何工作的一般。

关于javascript - 这个混淆的 JavaScript 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18834309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com