2010-10-11 9 views
12

Ce code produit D. La question est comment?Code javascript obscurci avec des valeurs binaires?

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

Je comprends que ![] est évalué à false ou 0 et ainsi de suite, mais comment peut-il exécuter? Et comment puis-je convertir cela en quelque chose que les humains peuvent comprendre et pas seulement Jon Skeet? Est-ce que quelqu'un peut casser une partie de ce code et m'expliquer ce qui se passe?

+1

: O c'est incroyable. J'aimerais voir une analyse de performance de cela. –

+3

@Yuval, la performance de ce truc est bien sûr * vraiment * mauvaise: http://jsperf.com/cryptic-obfuscation;) – CMS

Répondre

11

Eh bien, l'évaluation de l'expression dans les parties, à la fin, il est équivalent à:

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

Ce qui peut être simplifié à:

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

Comment vous pouvez "décoder"?

Il suffit d'examiner les opérateurs utilisés, par exemple, nous pouvons voir d'abord qu'un littéral de tableau est utilisé, puis notation des parenthèses accès aux propriétés sont effectuées, et quelques invocations.

Comment ça marche?

L'astuce consiste à chaîne multiples conversions de type, par exemple, pour obtenir la lettre f:

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

Si nous examinons la première partie, entre parenthèses, ![]+[], nous voyons une négation booléenne, qui retournera false car un objet tableau est toujours fidèle, puis une concaténation .

qui produit la chaîne "false", puis, la deuxième partie, nous voyons un crochets appliqués à cette chaîne, pour accéder à un caractère, et l'expression +[], qui se traduit par 0.

+[] donne zéro parce que la méthode toString du tableau retourne une chaîne vide, pour un tableau vide comme celui-là, et une chaîne vide produit à zéro lorsqu'il est converti en nombre (l'opérateur + unaire dans cet exemple).

Il y a quelques trucs comme ça, les choses qui produisent une chaîne, ces "true", "false", "null", "undefined", etc ... et plus astuces pour obtenir le numérique.

Par exemple, pour obtenir un numéro -pour accéder à un caractéris-, ils utilisent la conversion de type nouveau cryptique:

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

Comment êtes-vous arrivé? Y a-t-il un outil pour convertir ce code? – BrunoLM

+5

essayez les différentes parties dans un shell javascript interactif (construit en chrome et IE8, et peut être obtenu pour firefox (l'addon firebug) ou vous pouvez installer node.js ou de nombreux autres outils – einarmagnus

+2

Merci, je comprends comment ça fonctionne maintenant Mais je me demande toujours comment vous l'avez résolu si vite: P – BrunoLM

1

[] est faux. ! [] + [] évalue à 'faux'. +[] est 0 donc! + [] Est vrai, etc. javascript est très étrange avec ses conversions de type implicites

+0

Veuillez ne pas utiliser de mots grossiers dans vos réponses, nous essayons de garder SO pour les audiences générales sans le contrôle parental – Marko

+0

ok, désolé, je ne suis pas de un pays où l'on pense en ces termes, l'a réparé – einarmagnus

4

Il fait quelques trucs avec les conversions de type javascript. Comme CMS l'a souligné, c'est équivalent à: []['sort']['call']()["btoa"]("00")[1];

Ils construisent les chaînes en les tirant hors de choses comme false, etc.

Par exemple, pour obtenir le s dans "trier":

obtenir un "faux": (![]+[]) - ![] renvoie false et +[] convertit en une chaîne.

Obtenez la valeur 3 avec: !+[]+!+[]+!+[] - chaque !+[] retours true, mais quand vous ajoutez booléens vous obtenez une représentation entière. par exemple. true + true = 2

Obtenez le s avec la notation d'accès à l'index de chaîne ("false"[3] = 's'): (![]+[]) [!+[]+!+[]+!+[]]

Et maintenant, vous avez une s. Ils continuent à faire cela jusqu'à ce qu'ils aient assez pour accéder à n'importe quelle méthode ou propriété qu'ils veulent.

+0

+1 belle explication Merci! – BrunoLM