Voici un autre manuellement deobfuscated version, le déplacement de l'initialisation de l'expression dans les propres déclarations:
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)
Voici ce qui arrive:
-
z
est une multiligne chaîne de caractères contenant tout le code. C'est - eval
ed.
- À la fin du code,
z
est passé de setTimeout
. Il fonctionne comme requestAnimationFrame
et eval
ensemble, de les évaluer dans un intervalle au plus haut taux possible.
- Le code lui-même initialise
p
, le tampon de chaîne sur laquelle le code HTML sera ajouté, et n
, un tableau de base-36-codé en chiffres (et les relier en une chaîne de caractères en "4"
, les commentaires étant sans pertinence des ordures qui n'est pas considéré par parseInt
).
- chaque nombre en
n
ne coder une seule ligne (n.length == 16
). Il est maintenant énumérés.
- Un tas de variables est initialisé, certains déguisés en
e
littéral de tableau mais ils sont ensuite exprimés par des chiffres (x
) ou des valeurs booléennes (r
) ou de chaînes de caractères (t
).
- Chaque chiffre dans le nombre
t
est énuméré, l'inversion de la boolean r
à chaque tour. Pour des angles différents, x
, et en fonction de l' heure actuelle new Date / 1000
(de sorte qu'il donne une animation), la matrice e
est remplie à l'aide de certains opérateurs au niveau du bit - avec 1
lorsque r
est faux et 2
s en r
qui est vrai à l'époque.
- Puis une boucle ne itérer l'61 colonnes de l'image, à partir d'
x=0
à 122 en double étapes, avec l'ajout de caractères unique pour p
.
-
B
étant la barre oblique inverse, la chaîne S
est construit à partir de la chaîne de code z
par la fuite des barres obliques inverses et les apostrophes, pour obtenir une représentation précise de ce qu'il a regardé dans la source.
- Tous les deux nombres consécutifs de
e
sont ajoutés et utilisés pour accéder à un personnage de l' " *#"
, pour construire l'image animée. Si l'un des indices n'est pas défini, l' NaN
de l'indice correspond à un caractère indéfini et, au lieu des caractères correspondants de l' S
chaîne de caractères est pris (découvrez la formule x/2+61*y-1
). Si le personnage doit être un caractère de mot, c'est coloré différemment à l'aide de l' fontcolor
Chaîne de méthode.
- Après chaque ligne, l'arrière de la touche retour arrière et un saut de ligne sont ajoutés
p
, et la chaîne HTML est affectée dans le corps du document.
Comment le même effet peut être réécrite pour un exemple minimal?
Voici un autre exemple:
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)')
(démonstration à l'jsfiddle.net)
Il dispose de toutes les choses pertinentes dont vous avez besoin pour ce type d'animation:
-
setInterval
et Date
pour l'animation
-
Une reconstruction de son propre code (quine), ici:
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
La sortie via document.body.innerHTML
et <pre>
élément
- Le remplacement de certaines parties du code, à l'animation de la chaîne