pertanyaan ini sulit untuk diringkas dalam judul pertanyaan
PEMBARUAN Saya membuat JSFiddle yang membangun string yang dikaburkan dari input Anda berdasarkan surat-surat yang diambil dari pertanyaan ini: Anda dapat mengaksesnya di sini , atau apakah intisari akan lebih mudah?
Baru-baru ini saya menemukan sedikit keceriaan JavaScript yang membingungkan di profil ini yang terlihat seperti ini:
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%11.1*111e11|!1]+(/1/+
1/[1<1][1%1])[1^11]+[[],[]+{}][1][+1]+(/<</[1]+[])[1/1.1&1]
Maaf merusak kejutan tetapi ketika ini dievaluasi itu mengembalikan ini:
"I love you" in Chrome
"I lone you" In Firefox
"I lo[e you" in IE10
Cara ini berfungsi ketika pecah, adalah untuk menghasilkan serangkaian pesan dan menarik surat keluar seperti itu (menggunakan "I" sebagai contoh):
[]+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"
String lain yang dihasilkan termasuk:
({}+[]) -> "[object Object]" (where the space comes from)
([]+!!-[]) -> "false" (used for it's "l")
[/~/+{}][+!1] -> "/~/[object Object]" (this is used for an "o")
(/<</[1]+[]) -> "undefined"
Saya tertarik mencari pengganti untuk "n" dan "[" dan muncul dengan ini:
String.fromCharCode(('1'.charCodeAt(0)<<1)+(10<<1))
Yang saya rasakan dalam semangat menggunakan 1 dan 0, tetapi melanggar salah satu aspek yang lebih elegan dari kode asli yang merupakan penampilan yang tidak ada hubungannya dengan string sama sekali. Apakah ada orang lain yang memiliki ide tentang bagaimana menghasilkan "v" yang sesuai dengan kode asli yang dikaburkan?
Berikut adalah beberapa informasi tambahan yang ditemukan setelah banyak programmer JavaScript yang berbakat melihat lebih dalam
Firefox mengembalikan "I lone you" Karena baris ini:
([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]+
[1^11<<1]
memangkas karakter tertentu dari ini:
([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])
Yang mengevaluasi ini:
"function test() {
[native code]
}"
Yang sepertinya kita punya "V" kita !!!
Chrome mengembalikan "I love you", karena kode yang sama mengembalikan ini:
"function test() { [native code] }"
Sebelum pertanyaan ditutup untuk koneksi yang meragukan dengan "masalah pemrograman nyata", saya pikir saya akan menambahkan solusi terangkum yang dibangun di atas @ Supr , @ Cory's dan @ alpha123's , lihat:
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%11.1*111e11|!1]+
(/1/+1/[1<1][1%1])[1^11]+[[],[]+{}][1][+1]+(/<</
[1]+[])[1/1.1&1])
Mengingat kompleksitas kode dan pesan yang dihasilkannya, hampir seperti mesin JavaScript memberi tahu betapa istimewanya Anda membuatnya :)
sumber
function test() { [native code] }
, maka Anda dapat menormalkannya dan mengekstrak surat yang Anda inginkanJawaban:
Pertama-tama, saya ingin mengucapkan terima kasih kepada Jason dan semua kontributor untuk bermain dengan potongan lucu itu. Saya telah menulis kode itu hanya untuk bersenang-senang untuk mengirimkannya kepada istri saya pada tanggal 14 Februari :) Dengan hanya menginstal Chrome di laptop saya tidak punya pilihan untuk memeriksa cara kerjanya di Firefox dan IE. Selain itu, saya belum benar-benar berharap bahwa
toString()
representasi metode built-in mungkin terlihat berbeda di browser lain.Sekarang, pindah ke masalah sebenarnya , mari kita lihat kodenya. Ya,
"v"
adalah "masalah" sebenarnya di sini. Saya tidak menemukan cara lain untuk mendapatkan surat ini kecuali[native code]
string parsing , yang dapat diambil dari metode bawaan apa pun. Karena saya membatasi diri dengan tidak memiliki string dan tidak ada angka kecuali1
digunakan, saya perlu mengeksploitasi beberapa metode yang hanya memiliki karakter yang tersedia dalam namanya.Karakter yang tersedia dapat diperoleh dari kata kunci yang ada dan representasi String, yaitu dari mulai kita punya
NaN
,null
,undefined
,Infinity
,true
,false
, dan"[object Object]"
. Beberapa dari mereka dapat dengan mudah dikonversi menjadi string, misalnya1/!1+[]
memberi"Infinity"
.Saya telah menganalisis berbagai metode build-in untuk array
[]
, objek{}
, ekspresi reguler/(?:)/
, angka1.1
, string"1"
, dan menemukan satu metodeRegExp
objek yang indah yang disebuttest()
. Namanya dapat dikumpulkan dari semua karakter yang tersedia, misalnya"t"
dan"e"
daritrue
, dan"s"
darifalse
. Saya telah membuat string"test"
dan membahas metode ini menggunakan notasi tanda kurung siku untuk regex literal/-/
, yang diidentifikasi dengan benar di baris ini:Seperti yang sudah dibahas, kode ini dievaluasi di Chrome sebagai:
di Firefox sebagai:
dan di IE sebagai:
(di kedua membayar khusus memperhatikan ruang sebelum
function
kata kunci)Jadi, seperti yang Anda lihat dengan jelas, kode saya mendapatkan karakter ke-24 dari string yang disajikan, yang di Chrome
"v"
(seperti yang direncanakan), tetapi sayangnya di Firefox dan IE -"n"
dan"["
masing - masing.Untuk membuat output yang sama di semua browser, saya telah menggunakan pendekatan yang berbeda dari yang diilustrasikan dalam jawaban lain. Sekarang versi yang dimodifikasi terlihat seperti itu:
Namun, untuk membangkitkan minat para pembaca saya tidak akan memberikan solusi untuk itu. Jujur saya percaya bahwa Anda akan dengan mudah memahami cara kerjanya ... dan beberapa bahkan dapat mengejutkan kekasih mereka dengan cara lintas-browser;)
PS Yet Another Obfuscator
Terinspirasi oleh ide Jason untuk membuat alat mengaburkan universal, saya telah menulis satu lagi. Anda dapat menemukannya di JSBin: http://jsbin.com/amecoq/2 . Itu dapat mengaburkan teks apa pun yang berisi angka
[0-9]
, huruf latin kecil[a-z]
, dan spasi. Panjang string dibatasi sebagian besar dengan RAM Anda (setidaknya badan jawaban saya berhasil dikaburkan). Outputnya didukung oleh Chrome, Firefox, dan IE.Petunjuk: alat ini menggunakan pendekatan kebingungan yang berbeda dari yang disajikan di atas.
sumber
Mengapa tidak
native code
sedikit dari pertanyaan yang digunakan? Yang ini memberi'v'
di Chrome dan Firefox:Edit untuk mendukung IE dan melakukannya tanpa operator ternary: Yang ini berfungsi di Chrome, IE, dan FF. Membuat array dan menggunakan
==
untuk menentukan browser.Dapat dibaca:
sumber
n
danv
dan hanya memilih mana yang terbesar:str[23]>str[27]?str[23]:str[27]
. Dengan kata lain, operator tersier adalah triknya. Dapat diperluas untuk mendukung IE juga:([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1+(1^(11+1+1)<<1)]
Ini hampir sedekat yang saya dapat, sayangnya itu melanggar konvensi kebingungan asli dengan membuat panggilan ke
unescape()
:Menangis:
Ide lain:
unescape("\x76")
118
tanpa meneleponString.fromCharCode()
Pembaruan:
Saya mulai bermain golf kode dan membuatnya lebih pendek, mengganti bagian dengan lebih banyak
1
, dll.sumber
'%'
dengan(/%/+[[]+1/!1])[1]
menghapus sembarang kutipan. Saya juga menambahkanl=unescape;
menggunakan huruf kecilL
untuk menyembunyikan referensiunescape
. Ini menyenangkan :)(/%/+[])[1]
$1
;Inilah bagian yang menghasilkan n / v:
Di Firefox,
([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])
evaluasikan kesementara di Chrome itu
1^11<<1
sama dengan 23. Jadi karena spasi tambahan Firefox, ini tidak cukup untuk sampai ke 'v', dan sebaliknya 'n'.Dan inilah mengapa Anda tidak harus mengandalkan perilaku Function # toString. ;)
EDIT: Akhirnya saya menemukan versi cross-browser yang cukup dikaburkan:
Ini menggantikan bagian n / v dengan:
yang mengeksploitasi perbedaan parseInt (tampaknya Firefox mem-parsing angka dimulai dengan 0 sebagai oktal, sementara Chrome tidak) untuk menambahkan 4 dalam kasus Firefox, sehingga mendapatkan 'v' dari 'asli' dalam kedua kasus (saya tidak dapat menemukan yang lain 'v ': P).
ParseInt terlihat agak tidak pada tempatnya, tapi itu yang terbaik yang bisa saya lakukan untuk saat ini.
sumber
Does anyone else have an idea of how to generate a "v" that is in keeping with the original obfuscated code?
Untuk kasus penggunaan umum , jika casing karakter bukan masalah besar, saya mungkin cenderung sedikit curang.
Buat fungsi "c" yang mengubah angka 0 .. 25 menjadi karakter.
Untuk alasan kinerja, pra-cache surat-surat, jika Anda mau.
Di konsol Chrome, array yang dihasilkan terlihat seperti ini:
Jadi ... v Anda mungkin
l[10+10+1]
.Atau, solusi umum seperti ini:
Atau, untuk masalah khusus ini , mungkin hanya:
sumber
Ini memberi av di Chrome:
Dan ini dilakukan di Firefox:
Mereka berdua mengeluarkannya
Object.prototype.preventExtensions()
, jadi Anda mungkin bisa menemukan cara lintas-browser untuk referensi metode itu. (Ini satu-satunya nama 17 karakter di Object.Prototype sebagai permulaan.)Merasa bebas untuk membangun versi yang lebih membingungkan ini dan mengambil semua pujian untuk diri Anda sendiri, saya kehabisan waktu;)
sumber
Dalam chrome, ekspresi
([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])
dievaluasi menjadi"function test() { [native code] }"
,[1^11<<1]
dievaluasi ke 23 (operator bitwise menyebabkan variabel terpotong menjadi 32 bit)sumber
Does anyone else have an idea of how to generate a "v" that is in keeping with the original obfuscated code?