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
,x
y
gö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
p
oluşturur- kodu kullanır
p = " *#"[index]
karar vermek için kullanın boşluk, Yıldız İşareti ya da karma işareti, neredeindex
aslındae[x ] e[x ]
(yukarıda söylediğim gibi,e
x
Sorumlu Devlet göster) - eğer Endeksi
" *#"
, uzunluğundan daha büyüksez
karakterleri ile çıktıp
doldurur 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)')
for
dö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 Date
orada 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-
i
karakteri yazdırın"eval(z='" z "')"
Bu kod dizesi
z
eval('
')
ile çevrili.Son olarak, dize ve kullanımı çıkış 45* *
z
baş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...