Nasıl bu karıştırılmış JavaScript çalışır?
Nasıl aşağıdaki JavaScript çalışır?
Minified kod olduğunu anlıyorum, ama de-kafamı allak bullak biraz denedim, ama bu efekti nasıl elde ettiğini açık bir kavram bulamıyorum. Bir çeşit, Tarih nesnesinin kullanımı, garip dize işleme, Matematik fonksiyonlar yineleme için Dizeleri kullanıyor görebiliyorum, o kodu kendisi yazdırır.
Nasıl aynı etkiyi minimal bir örnek ile yazılmış olabilir mi?
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)')//
CEVAP
Önsöz: Ben güzelleştiren ve yoğun kod http://jsfiddle.net/WZXYr/2/ açıklamalı
Düşünün en dış katmanı
eval(z = '...');
Kod bir dize değişkeni z saklanır. Atama operatörü bir değeri döndürür atanmış bir kod dizisi de eval Bir bağımsız değişken olarak geçirilir.
Kod string z eval içinde çalışır. Kodu temizledim bile son derece geniş, ama öyle geliyor ki
- Base-36 sayı, karakter
4şekillendirdiği bir dize ayrıştırmak. - Değerleri göster, genel değişkenler
e,xygöster durumunu saklamak için kullanarak doldurun. Göster devlet, kısmen duvar saati geçerli ikinci (new Date / 1e3) bir fonksiyonudur. - Harita değerleri kullanarak, çıkış kodu bir dize
poluşturur- kodu kullanır
p = " *#"[index]karar vermek için kullanın boşluk, Yıldız İşareti ya da karma işareti, neredeindexaslındae[x ] e[x ](yukarıda söylediğim gibi,exSorumlu Devlet göster) - eğer Endeksi
" *#", uzunluğundan daha büyüksezkarakterleri ile çıktıpdoldurur geri dönüş kodu var. İç dış karakterler karakterlerzçıkarılmış olsa da animasyon karakterleri ile doldurulur.
- kodu kullanır
Kod sonunda, uyumsuz kod dize değerlendirir z 29 ** bir çağrı var. z Bu tekrar çağırma döngü için kod sağlar.
Basit bir örnek:
İşte süper-basit bir sürümü (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)')
fordöngü çıkış dizep(dize 172 karakter uzunluğunda) her bir karakter ekler:for(i=0;i<172; i)Animasyon bir karakter olan 67, eğer pozisyon 62 arasında bir karakter olursak iç koşullu karar verir:
if(i > 62 && i < 67)EÄŸer istiyorsak, o zaman
!---, duvar saati, ikinci değer onuncu dayalı baskı kaymıştır. Bu animasyon efekti sağlar.p ="!---"[~~(new Date/1e2 i)%4]new Dateorada sadece 0 arasında bir sayı içine bir tarih değeri dönüştürmek için ve 3. etrafında (tüm pislik)Eğer hareketli bir karakter olduğumuzu, aksi takdirde, o zaman dizesi tarafından tanımlanan dizin-
ikarakteri yazdırın"eval(z='" z "')"Bu kod dizesi
zeval('')ile çevrili.Son olarak, dize ve kullanımı çıkış 45* *
zbaşka bir yürütme sıraya:document.body.innerHTML = p;setTimeout(z)
Benim son çıkış olmadığını unutmayınoldukçahaklı sonuna doğru ters eğik çizgi için -- oluşturuyor değil ama yine de teknik genellikle nasıl çalıştığını iyi bir fikir verebilir.

JavaScript kilitler nasıl çalışır?...
Nasıl JavaScript yerelleştirme çalışır...
Nasıl bu sihirli Javascript çalışır?...
Nasıl değişken atama JavaScript çalışı...
Nasıl bir JavaScript nesnesinin bir öz...