2010-10-11 12 views
12

Este código muestra D. La pregunta es ¿CÓMO?¿Código de JavaScript ofuscado con valores binarios?

alert([][(![]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]()[([][(![]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]()+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(![]+[])[+!+[]]](+[]+[+[]])[+!+[]]); 

entiendo que ![] se evalúa a false o 0 y así sucesivamente, pero ¿cómo ejecutar? ¿Y cómo puedo convertir esto en algo que los humanos puedan entender y no solo Jon Skeet?

¿Alguien puede romper algo de este código y explicarme qué está pasando?

+1

: O esto es increíble. Me gustaría ver un análisis de rendimiento de esto. –

+3

@Yuval, el rendimiento de estas cosas, por supuesto, es * realmente * malo: http://jsperf.com/cryptic-obfuscation;) – CMS

Respuesta

11

Bueno, la evaluación de la expresión en partes, al final es equivalente a:

[]['sort']['call']()["btoa"]("00")[1]; // "D" 

se puede simplificar a:

btoa("00")[1]; // "D" 

cómo puede "descifrar"?

Basta con examinar los operadores utilizados, por ejemplo, podemos ver que en un principio se utiliza un literal de matriz, a continuación, varias soporte de notación accesos de propiedad se hacen, y un par de invocaciones.

¿Cómo funciona?

El truco consiste en múltiples conversiones de tipos de cadena, por ejemplo, para obtener el f letra:

(![]+[])[+[]] 

Si examinamos la primera parte, entre paréntesis, ![]+[], vemos una negación booleano, que devolverá false porque un objeto de matriz siempre es cierto y luego una concatenación .

que produce la cadena "false", a continuación, la segunda parte, vemos una soportes aplicados a esa cadena, para acceder a un personaje, y la expresión +[], lo que resulta en 0.

+[] da cero porque el método de la matriz de toString devuelve una cadena vacía, para una matriz vacía como que uno, y una cadena vacía produce a cero cuando se convierte en número (el unario + operador en este ejemplo).

No son sólo trucos como eso, las cosas que producen una cadena, tales "true", "false", "null", "undefined", etc ... y más trucos para obtener la numéricamente.

Por ejemplo, para obtener un número: para acceder a una en caracteres, se utiliza de nuevo críptica conversión de tipo:

+[];   // 0, equivalent to +"" 
+!+[];   // 1, equivalent to +true 
!+[]+!+[];  // 2, equivalent to +true+true 
!+[]+!+[]+!+[]; // 3, equivalent to +true+true+true 
+0

¿Cómo llegaste a ello? ¿Hay alguna herramienta para convertir este código? – BrunoLM

+5

prueba las diferentes partes en un shell javascript interactivo (integrado en chrome y ie8, y se puede obtener para firefox (el firebug de complemento) o puedes instalar node.js o muchas otras herramientas. – einarmagnus

+2

Gracias. Obtengo cómo funciona ahora .Pero todavía me pregunto cómo lo resolvió tan rápido: P – BrunoLM

1

[] es falso. ! [] + [] evalúa a 'falso'. +[] es 0 entonces! + [] Es verdadero, etc. JavaScript es muy extraño con sus conversiones de tipo implícito

+0

Por favor absténgase de usar malas palabras en sus respuestas, estamos tratando de mantener SO para las audiencias generales sin la guía de los padres. – Marko

+0

bien, lo siento. No soy de un país donde pensamos en esos términos. Lo solucionó – einarmagnus

4

Hace algunos trucos con las conversiones de tipo de JavaScript. Como señaló CMS, es equivalente a: []['sort']['call']()["btoa"]("00")[1];

Construyen las cadenas sacándolas de cosas como false, etc.

Por ejemplo, para obtener el s en "especie":

Obtener una "falsa": (![]+[]) - ![] vuelve falsa y +[] la convierte en una cadena.

Obtenga el valor 3 con: !+[]+!+[]+!+[] - cada !+[] devuelve true, pero cuando agrega booleanos, obtiene una representación entera. p.ej. true + true = 2

Obtener el s con la notación de acceso índice de la cadena ("false"[3] = 's'): (![]+[]) [!+[]+!+[]+!+[]]

Y ahora usted tiene una s. Siguen haciéndolo hasta que tengan suficiente acceso a cualquier método o propiedad que deseen.

+0

+1 buena explicación. ¡Gracias! – BrunoLM

Cuestiones relacionadas