Hier ist eine weitere manuell deobfuscierte Version, die alle Initialisierungen aus dem Ausdruck in eigene Anweisungen verschiebt:
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)
Folgendes passiert:
zist eine mehrzeilige Zeichenfolge, die den gesamten Code enthält. Es ist evaled.
- Am Ende des Codes
zwird an übergeben setTimeout. Es funktioniert wie requestAnimationFrameund evalzusammen und wertet es in einem Intervall mit der höchstmöglichen Rate aus.
- Der Code selbst wird initialisiert
p, der Zeichenfolgenpuffer, an den der HTML- Code angehängt wird, und nein Array von Base-36-codierten Zahlen (verbunden durch eine Zeichenfolge "4", wobei die Kommentare irrelevanter Müll sind, der von nicht berücksichtigt wird parseInt).
- Jede Zahl in
ncodiert eine Zeile ( n.length == 16). Es ist jetzt aufgezählt .
- Eine Reihe von Variablen wird initialisiert, einige als
eArray-Literal getarnt, aber sie werden dann bei Verwendung in Zahlen ( x) oder Boolesche Werte ( r) oder Zeichenfolgen ( t) umgewandelt.
- Jede Ziffer in der Zahl
twird aufgezählt, wobei der Boolesche Wert in rjeder Runde invertiert wird . Für verschiedene Winkel xund abhängig von der aktuellen Zeit new Date / 1000 (so dass eine Animation angezeigt ewird ) wird das Array mit einigen bitweisen Operatoren gefüllt - mit 1wann rist falsch und 2s wann rist zu diesem Zeitpunkt wahr.
- Dann iteriert eine Schleife die 61 Spalten des Bildes
x=0in doppelten Schritten von bis 122, wobei einzelne Zeichen an angehängt werden p.
BAls Backslash wird die Zeichenfolge Saus der Code-Zeichenfolge erstellt, zindem Backslashes und Apostrophe ausgeblendet werden, um eine genaue Darstellung des Erscheinungsbilds in der Quelle zu erhalten.
- Alle zwei aufeinander folgenden Nummern von
ewerden hinzugefügt und verwendet, um auf ein Zeichen von zuzugreifen " *#"und das animierte Bild aufzubauen. Wenn einer der Indizes nicht definiert ist, wird der NaNIndex in ein undefiniertes Zeichen aufgelöst und stattdessen wird das entsprechende Zeichen aus der SZeichenfolge übernommen (siehe Formel x/2+61*y-1). Wenn dieses Zeichen ein Wortzeichen sein soll , wird es mit der fontcolorString-Methode unterschiedlich gefärbt .
- Nach jeder Zeile werden die nachfolgende Rücktaste und ein Zeilenumbruch hinzugefügt
p, und die HTML-Zeichenfolge wird dem Dokumentkörper zugewiesen.
Wie könnte der gleiche Effekt für ein minimales Beispiel umgeschrieben werden?
Hier ist ein anderes Beispiel:
setInterval(z='s=("setInterval(z=\'"+\
z.replace(/[\\\\\']/g,"\\\\$&")+"\')"\
).match(/.{1,37}/g).join("\\\\\\n");d\
ocument.body.innerHTML=\"<\\pre>"+s.s\
lice(0, 175)+String( + new Date()).fo\
ntcolor("red")+s.slice(188)')
( Demo bei jsfiddle.net )
Es hat alle relevanten Dinge, die Sie für diese Art von Animation benötigen:
setIntervalund Datefür die Animation
Eine Rekonstruktion des eigenen Codes ( quine- like) hier:
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
Die Ausgabe über document.body.innerHTMLund ein <pre>Element
- Ersetzen einiger Teile des Codes durch die animierte Zeichenfolge