esta pregunta es difícil de resumir en un título de pregunta
ACTUALIZACIÓN creé una jsFiddle que construye una cadena ofuscado de su entrada en función de las cartas extraídas de esta pregunta: ¿Se puede acceder a él aquí , o habría un GIST ser más fácil?
Recientemente me encontré con un poco de JavaScript ofuscado en este perfil que se ve así:
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]
Lamento arruinar la sorpresa, pero cuando se evalúa esto devuelve esto:
"I love you" in Chrome
"I lone you" In Firefox
"I lo[e you" in IE10
La forma en que esto funciona cuando se divide es generar una serie de mensajes y extraer letras de ellos de esta manera (usando la "I" como ejemplo):
[]+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"
Otras cadenas que se generan incluyen:
({}+[]) -> "[object Object]" (where the space comes from)
([]+!!-[]) -> "false" (used for it's "l")
[/~/+{}][+!1] -> "/~/[object Object]" (this is used for an "o")
(/<</[1]+[]) -> "undefined"
Estaba interesado en encontrar un reemplazo para la "n" y "[" y se me ocurrió esto:
String.fromCharCode(('1'.charCodeAt(0)<<1)+(10<<1))
Lo que siento en el espíritu de usar 1 y 0, pero viola uno de los aspectos más elegantes del código original, que es la apariencia de no tener nada que ver con las cadenas. ¿Alguien más tiene una idea de cómo generar una "v" que esté de acuerdo con el código ofuscado original?
Aquí hay información adicional que se encontró después de que muchos programadores de JavaScript con talento le echaran un vistazo más profundo a esto
Firefox devuelve "I Ione you" debido a esta línea:
([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])[1^11<<1]+
[1^11<<1]
recorta un carácter específico de esto:
([]+/-/[(!!1+[])[1>>1]+(!!1+[])[1<<1^1]+(!1+[])[1|1<<1]+(!!1+[])[1^1]])
Lo que se evalúa a esto:
"function test() {
[native code]
}"
¡Lo que parece que podríamos tener nuestra "V"!
Chrome devuelve "Te amo", porque el mismo código devuelve esto:
"function test() { [native code] }"
Antes de cerrar la pregunta por una conexión cuestionable con "un problema de programación real", pensé que agregaría una solución resumida que se basa en @ Supr , @ Cory y @ alpha123 , he aquí:
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])
Dada la complejidad del código y el mensaje que produce, es casi como si el motor de JavaScript dijera lo especial que lo hace sentir :)
function test() { [native code] }
, entonces podría normalizarlo y extraer la letra que desea