SORU
12 NİSAN 2013, Cuma


JavaScript'yerleşik dizeleri s?

bu soru bir başlıkta özetlemek zordur

GÜNCELLEME Ben giriş dışında karıştırılmış bir dize oluşturur bir JSFiddle harfleri bu soruyu çıkarılan dayanarak oluşturuldu: erişebildiğinizi* *64 gist bir daha mı kolay olur?

Geçenlerde şuna benzer this profile karıştırılmış JavaScript eğlenceli uğradım:

javascript:[[] 1/!1][1^1][1>>1] ({} [])[1<<1^11>>1] ([] !!-
[])[1<<1] [/~/ {}][ !1][-~1<<1] ([] /-/[(!!1 [])[1>>1] (!!1
 [])[1<<1^1] (!1 [])[1|1<<1] (!!1 [])[1^1]])[1^11<<1] ([,][
~1] [])[1-~1] [[] {}][!1.1%1][11111.1.1*111e11|!1] (/1/ 
1/[1<1][1%1])[1^11] [[],[] {}][1][ 1] (/<</[1] [])[1/1.1&1]

Üzgünüm sürprizi bozmak ama bu değerlendirildiğinde bu döndürür:

"I love you" in Chrome
"I lone you" In Firefox
"I lo[e you" in IE10

Bu kırık ne zaman çalıştığını, mesajları bir dizi oluşturmak ve kullanarak "ben" bir örnek olarak): . bu yüzden mektuplar onları dışarı çekmek için

[] 1/!1
returns
"Infinity"
then
[[] 1/!1]
creates this array:
["Infinity"]
then
[[] 1/!1][1^1]
Takes the first (1^1 == 0) element of that array
"Infinity"
finally
[[] 1/!1][1^1][1>>1]
Takes the first (1>>1 == 0) char of that string
"I"

Oluşturulan diğer dizeleri vardır:

({} [])       -> "[object Object]" (where the space comes from)
([] !!-[])    -> "false" (used for it's "l")
[/~/ {}][ !1] -> "/~/[object Object]" (this is used for an "o")
(/<</[1] [])  -> "undefined"

Eğer yerini bulmakta ilgimi çekti "n" ve "[" ve bu ile geldi:

String.fromCharCode(('1'.charCodeAt(0)<<1) (10<<1))

Hangi hissediyorum içinde ruhun kullanarak 1'ler ve 0'lar, ama ihlal eden birini daha zarif yönlerini orijinal kodu olan görünüşü olan hiç bir ilgisi yok dizeleri. Herkesten bir oluşturmak için nasıl bir fikir "" özgün karıştırılmış kodu ile tutmak? v var mı

Burada birçok yetenekli JavaScript programers bu daha derin bir göz attım sonra bulundu fazladan bilgi

Firefox verir "Ben yalnız seni" bu hat Nedeniyle:

([] /-/[(!!1 [])[1>>1] (!!1 [])[1<<1^1] (!1 [])[1|1<<1] (!!1 [])[1^1]])[1^11<<1] 

[1^11<<1] Bu belirli bir karakteri keser:

([] /-/[(!!1 [])[1>>1] (!!1 [])[1<<1^1] (!1 [])[1|1<<1] (!!1 [])[1^1]])

Bunu değerlendiren:

"function test() {
    [native code]
}"

Bizim sahip olabiliriz gibi görünüyor""!!! V

Krom döner "seni seviyorum", çünkü aynı kodu verir bu

"function test() { [native code] }"

Önce soru kapalı için şüpheli bağlantı ile "gerçek bir programlama sorunu", dedim Ekle özetlenmiş bir çözüm oluşturur @Supr's, @Cory's @alpha123's, demişti:

alert([[] 1/!1][1^1][1>>1] ({} [])[1<<1^11>>1] (
[] !!-[])[1<<1] [/~/ {}][ !1][-~1<<1] [([] /-/[(
!!1 [])[1>>1] (!!1 [])[1<<1^1] (!1 [])[1|1<<1] (
!!1 [])[1^1]])[1 (1^(11 1 1)<<1)],([] /-/[(!!1 [
])[1>>1] (!!1 [])[1<<1^1] (!1 [])[1|1<<1] (!!1 [
])[1^1]])[1^11<<1],([] /-/[(!!1 [])[1>>1] (!!1 [
])[1<<1^1] (!1 [])[1|1<<1] (!!1 [])[1^1]])[1^(11
 1 1)<<1]][((([] /-/[(!!1 [])[1>>1] (!!1 [])[1<<
1^1] (!1 [])[1|1<<1] (!!1 [])[1^1]])[(1<<1<<1<<1
) 1<<1]==({} [])[1^1])*1) ((([] /-/[(!!1 [])[1>>
1] (!!1 [])[1<<1^1] (!1 [])[1|1<<1] (!!1 [])[1^1
]])[(1^11<<1)-1]==({} [])[1^1])<<1)] ([,][~1] []
)[1-~1] [[] {}][!1.1%1][11111.1.1*111e11|!1] 
(/1/ 1/[1<1][1%1])[1^11] [[],[] {}][1][ 1] (/<</
[1] [])[1/1.1&1])

Kod karmaşıklığı ve ürettiği mesajı verdiler neredeyse JavaScript motoru hissediyorum:) nasıl anlatıyor gibi

CEVAP
16 NİSAN 2013, Salı


Öncelikle, komik parçacığı ile oynarken Jason ve tüm katkıda bulunanlara teşekkür etmek istiyorum. Kod parçası yazdımsadece eğlence içinŞubatta eşim göndermek için 14 :) dizüstü bilgisayarda sadece Chrome yüklü Olması nasıl çalışır Firefox ve IE kontrol etmek için hiçbir seçenek vardı. Ayrıca, gerçekten inşa yöntemleri toString() temsil farklı diğer tarayıcılarda bak diye bekliyordum olmadı.

Şimdiasıl sorun hareketlibakalım tam olarak bu kod bir göz atın. Evet, 27* *gerçek "" burada. sorun oldu Herhangi bir yerleşik alınacak [native code] dize ayrıştırma dışında bu mektup almanın başka bir yolu yöntemi buldum. 1 başka hiçbir dizeleri ve sayıları kullandığını kendimi sınırlı olduğundan, adı yalnızca karakter içeren bazı yöntem yararlanmaya ihtiyacım vardı.

Mevcut karakterler elde edilebilir mevcut anahtar ve dize temsilleri, yani başlangıç yaptık NaN, null, undefined, Infinity, true, false, ve "[object Object]". Bazıları kolayca dizeleri, örneğin 1/!1 [] verir "Infinity" dönüştürülebilir.

Ben analiz farklı inşa yöntemleri için diziler [] nesneler {} düzenli ifadeler /(?:)/, sayı 1.1 dizeler "1" ve keşfedilen bir güzel yöntem RegExp nesne adı test(). Adını tüm kullanılabilir karakterleri, "t" örneğin ** 48 false "s" "e" monte edilebilir. 51 ** bir string oluşturdum ve bu yöntem, normal ifade değişmezini için köşeli parantez gösterim kullanarak ele /-/ doğru bu hat tespit:

/-/[(!!1 [])[1>>1] (!!1 [])[1<<1^1] (!1 [])[1|1<<1] (!!1 [])[1^1]]

Daha önce de söylediğim gibi, bu kod parçası Krom olarak değerlendirilir

function test() { [native code] }

olarak: Firefox

function test() {
    [native code]
}

ve IE gibi:

 function test() {     [native code] }  

(ikinci ödemeözelfunction anahtar kelime önce boşluğa dikkat)

Yani, açıkça görmek, benim kod almak çok 24 karakter sundu dize, Krom "v" (planlandığı gibi), ama ne yazık ki Firefox ve IE -- "n" ve "[" sırasıyla.

Tüm tarayıcılarda aynı çıkış yapmak için kullandımfarklı bir yaklaşımdaha başka cevaplar resimli. Şimdi Değiştirilmiş Sürümü bu gibi görünüyor:

javascript:[[] 1/!1][1^1][1>>1] ({} [])[1<<1^11>>1] ([] !!-
[])[1<<1] [/~/ {}][ !1][-~1<<1] /\[[^1] \]/[([] ![])[1<<1<<
1] (/|/[(1 {})[1 11>>>1] [[] {}][ !1][1] ([] 1/[])[1<<1>>1]
 ([1<1] [])[1 11>>>1 1] [[!!1] 1][ []][1-1] ([] !!/!/)[1|1]
 (/1/[1] [])[!1%1] (-{} {})[-1 1e1-1] (1 [!!1])[1] ([] 1 {}
)[1<<1] [!!/!!/ []][ []][1&1]] /=/)[1e1 (1<<1|1) (([] /-/[(
!!1 [])[1>>1] (!!1 [])[1<<1^1] (!1 [])[1|1<<1] (!!1 [])[1^1
]])[1^1]== !1)] (!![] {})[1|1<<1] [1 {} 1][!1 !1][(11>>1) 1
]](([] /-/[(!!1 [])[1>>1] (!!1 [])[1<<1^1] (!1 [])[1|1<<1] 
(!!1 [])[1^1]]))[1&.1][11>>>1] ([,][~1] [])[1-~1] [[] {}][!
1.1%1][11111.1.1*111e11|!1] (/1/ 1/[1<1][1%1])[1^11] [[]
,[] {}][1<<1>>>1][1||1] (/[< >]/[1&1|1] [1.1])[1/11.1&1.11]

Ancak, entrika için okuyucuları ben bunun için bir çözüm sağlamaz. Ben dürüst kolayca nasıl çalıştığını anlayacaksınız inanıyorum... ve hatta çapraz tarayıcı sevgili yollarını sürpriz ;)

P. S. Yet Another Obfuscator

Jason'ın evrensel kafamı allak bullak bir araç oluşturma fikri esinlenerek, bir tane daha yazdım. Bunu bulabilirsinizJSBin: http://jsbin.com/amecoq/2. Numaraları* *62, küçük latin harfleri [a-z] ve boşluk içeren herhangi bir metin allak bullak edebilir. Dize uzunluğu çoğunlukla RAM (cevabımı en azından vücut başarıyla karıştırılmış) ile sınırlıdır. Çıkış Krom, Firefox ve IE tarafından desteklenir.

İpucu:aracı yukarıda sunulmuş daha farklı şaşırtmaca yaklaşım kullanır.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • HowcastSportsFitness

    HowcastSport

    11 Mayıs 2011
  • sinumatic

    sinumatic

    19 Aralık 2006
  • spederson7

    spederson7

    17 Temmuz 2006