SORU
16 EYLÜL 2013, PAZARTESİ


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)')//

JSFiddle

CEVAP
16 EYLÜL 2013, PAZARTESİ


Ö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

  1. Base-36 sayı, karakter 4 şekillendirdiği bir dize ayrıştırmak.
  2. 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.
  3. 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, nerede index aslında e[x ] e[x ] (yukarıda söylediğim gibi, e x Sorumlu Devlet göster)
    • eğer Endeksi " *#", uzunluğundan daha büyükse z karakterleri ile çıktı p doldurur geri dönüş kodu var. İç dış karakterler karakterler z çıkarılmış olsa da animasyon karakterleri ile doldurulur.

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)')
  1. for döngü çıkış dize p (dize 172 karakter uzunluğunda) her bir karakter ekler:

    for(i=0;i<172;  i)
    
  2. Animasyon bir karakter olan 67, eğer pozisyon 62 arasında bir karakter olursak iç koşullu karar verir:

    if(i > 62 && i < 67)
    
  3. 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)

  4. 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.

  5. 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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FD2097

    FD2097

    21 HAZİRAN 2009
  • MatheusDosGames

    MatheusDosGa

    28 Aralık 2011
  • Tinkernut

    Tinkernut

    28 Aralık 2006