คำถามนี้ยากที่จะสรุปในชื่อคำถาม
อัปเดต ฉันสร้าง JSFiddle ที่สร้างสตริงที่ยุ่งเหยิงจากอินพุตของคุณตามตัวอักษรที่ดึงมาจากคำถามนี้: คุณสามารถเข้าถึงได้ที่นี่หรือส่วนสำคัญจะง่ายขึ้นหรือไม่
ฉันเพิ่งเจอจาวาสคริปต์ที่สับสนในโปรไฟล์นี้ซึ่งมีลักษณะดังนี้:
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]
ขออภัยที่ทำลายความประหลาดใจ แต่เมื่อได้รับการประเมินแล้วจะส่งคืนสิ่งนี้:
"I love you" in Chrome
"I lone you" In Firefox
"I lo[e you" in IE10
วิธีการทำงานเมื่อแตกออกคือการสร้างชุดของข้อความและดึงตัวอักษรออกมาเช่น (ใช้ตัวอย่าง "I"):
[]+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"
สตริงอื่น ๆ ที่สร้างขึ้นรวมถึง:
({}+[]) -> "[object Object]" (where the space comes from)
([]+!!-[]) -> "false" (used for it's "l")
[/~/+{}][+!1] -> "/~/[object Object]" (this is used for an "o")
(/<</[1]+[]) -> "undefined"
ฉันสนใจที่จะหาสิ่งทดแทนสำหรับ "n" และ "[" และมากับสิ่งนี้:
String.fromCharCode(('1'.charCodeAt(0)<<1)+(10<<1))
ซึ่งฉันรู้สึกในจิตวิญญาณของการใช้ 1 และ 0 ของ แต่ละเมิดหนึ่งในด้านที่สวยงามมากขึ้นของรหัสเดิมซึ่งเป็นลักษณะของการไม่มีอะไรเกี่ยวข้องกับสายเลย ใครบ้างมีความคิดวิธีการสร้าง "v" ที่สอดคล้องกับรหัส obfuscated เดิม?
นี่คือข้อมูลเพิ่มเติมบางอย่างที่พบหลังจากโปรแกรมเมอร์ JavaScript ที่มีความสามารถหลายคนมองลึกลงไปในเรื่องนี้
Firefox ส่งคืน "ฉันอยู่คนเดียว" เนื่องจากบรรทัดนี้:
([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]+
[1^11<<1]
ภายนอกข้อมูลรถอักขระเฉพาะจากนี้:
([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])
ซึ่งประเมินสิ่งนี้:
"function test() {
[native code]
}"
ซึ่งดูเหมือนว่าเราอาจมี "V" ของเรา !!!
Chrome ส่งคืน "ฉันรักคุณ" เนื่องจากรหัสเดียวกันส่งคืนสิ่งนี้:
"function test() { [native code] }"
ก่อนที่คำถามจะปิดสำหรับการเชื่อมต่อที่น่าสงสัยกับ "ปัญหาการเขียนโปรแกรมจริง" ฉันคิดว่าฉันจะเพิ่มโซลูชันสรุปที่สร้างบน@ Supr's , @ Cory'sและ@ alpha123'sดูเถิด:
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])
ด้วยความซับซ้อนของรหัสและข้อความที่สร้างขึ้นมันเกือบจะเหมือนเครื่องมือ JavaScript ที่บอกว่าคุณรู้สึกพิเศษอย่างไร :)
function test() { [native code] }
นั้นคุณสามารถทำให้เป็นมาตรฐานและแยกตัวอักษรที่คุณต้องการ