这是另一个手动反混淆版本,将所有初始化从表达式移到自己的语句中:
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)';
p = "<" + "pre>";
n = ["zw2", "l6k", "e3t", "jnt", "qj2", "xh2 x/* =<,m#F^ A W###q. */", "2kty2", "wrt", "13n2", "3n9h2", "3pdxt", "1csb yz/* #K q##H######Am */", "3iyb6k", "3pk72", "3nmr2", ""]
for (y in n) {
e = [];
x = 0;
r = true;
t = parseInt(n[y], 36) + "";
for (a in t) {
r = !r
for (i = 0; i < t[a]; i += 0.05) {
x -= 0.05;
o = new Date / 1e3 + x / Math.PI
if (Math.cos(o) < 0)
e[~~(32 * Math.sin(o) * Math.sin(0.5 + y / 7)) + 60] = -~r;
}
for (x = 0; x < 122;) {
S = "eval" + "(z='" + z.split(B = "\\").join(B + B).split(Q = "'").join(B + Q) + Q + ")//m1k"
p += " *#"[e[x++] + e[x++]] || S[x/2+61*y-1]).fontcolor(/\w/.test(S[x/2+61*y-1]) && "#03B");
}
p += B + "\n";
document.body.innerHTML = p;
}
setTimeout(z)
这是发生的事情:
z
是一个包含所有代码的多行字符串。它是eval
编的。
- 在代码的末尾,
z
传递给setTimeout
. 它像一起工作requestAnimationFrame
,eval
以尽可能高的速率在间隔内评估它。
- 代码本身初始化
p
,将附加 HTML 的字符串缓冲区,以及n
一个 base-36 编码的数字数组(通过 连接到字符串中"4"
,注释是不相关的垃圾,不被 考虑parseInt
)。
- 中的每个数字都会
n
编码一行 ( n.length == 16
)。现在列举了。
- 初始化了一堆变量,其中一些伪装成
e
数组字面量,但在使用时它们会被转换为数字 ( x
) 或布尔值 ( r
) 或字符串 ( t
)。
- 枚举数字中的每个数字,每转
t
反转布尔值r
。对于不同的角度x
,并根据当前时间 new Date / 1000
(以便它给出动画),使用一些按位运算符e
填充数组-那时 when为假,s when为真。1
r
2
r
- 然后一个循环确实迭代图像的 61 列,从
x=0
到 122 双步,将单个字符附加到p
.
B
作为反斜杠,该字符串S
是通过转义反斜杠和撇号从代码字符串构建的z
,以获得它在源代码中的准确表示。
- 每两个连续的数字从
e
被添加并用于访问一个字符" *#"
,以构建动画图像。如果未定义其中一个索引,则NaN
索引解析为未定义的字符,取而代之的是字符串中的相应字符S
(查看公式x/2+61*y-1
)。如果该字符应该是单词字符,则使用fontcolor
String 方法将其着色不同。
- 在每一行之后,将尾随的退格和换行符添加到
p
,并将 HTML 字符串分配给文档正文。
对于一个最小的例子,如何重写相同的效果?
这是另一个例子:
setInterval(z='s=("setInterval(z=\'"+\
z.replace(/[\\\\\']/g,"\\\\$&")+"\')"\
).match(/.{1,37}/g).join("\\\\\\n");d\
ocument.body.innerHTML="<\\pre>"+s.sl\
ice(0, 175)+String( + new Date()).fon\
tcolor("red")+s.slice(188)')
它具有这种动画所需的所有相关内容:
setInterval
和Date
动画
重建自己的代码(类似quine),在这里:
s = ( "setInterval(z='" // the outer invokation
+ z.replace(/[\\\']/g,"\\$&") // the escaped version
+ "\')" ) // the end of the assignment
.match(/.{1,37}/g).join("\\\n"); // chunked into lines
输出通过document.body.innerHTML
和一个<pre>
元素
用动画字符串替换部分代码