[Ludique] Coder en Javascript avec seulement 3 caractères
Salut à tous,
En me renseignant sur les techniques d'obfuscation en Javascript j'ai appris que certains outils savaient remplacer les String en dur dans le code par des équivalents illisibles à bases de cast douteux entre Array, String et Number.
J'ai creusé un peu pour savoir jusqu'où on pouvait aller. Je me suis aperçu que simplement avec les caractères "[", "+" et "]", on pouvait déjà aller très loin !
+[] donne 0 par cast de l'opérateur +
Pour avoir 1, on pourrait essayer +[]++ mais on ne peut appliquer qu'un seul opérateur à la fois.
Cependant, si on place le tout dans une array dont on récupère le premier élément pour ensuite l'incrémenter, là ça fonctionne :
1: [+[]][0]++
Et comme on sait écrire 0, on arrive à :
1: ++[+[]][+[]]
qu'on peut écrire de manière plus courte par :
1: ++[[]][+[]] (merci Kaamo)
En suivant le même principe d'incrémentation à répétition, on arrive à récupérer tous les chiffres.
Maintenant les lettres !
"" : []+[]
"1" : []+1
"0" : []+0
undefined : [][+[]]
"undefined" : undefined + []
Génial, undefined en string, un tableau de caractères dont on va pouvoir récupérer certaines lettres via les index numériques (qu'on sait déjà coder)
On peut faire la même chose pour NaN : +[][+[]] pour récupérer le N majuscule et le a.
Dernière découverte de la soirée, on pourrait se servir de l'objet Infinity. Incrémenter de un à un jusqu'à l'infini est évidémment bien trop long, mais il existe une autre technique: caster le nombre en notation exponentielle. Comme on a le "e" grâce à "undefined", on peut écrire "1e1000" qui casté en nombre dépasse Number.MAX_VALUE, et donne Infinity. Bingo, des lettres en plus :P
Je n'ai pas d'autres idées pour le moment, mais j'ai déjà de quoi faire des trucs sympas. Par exemple lâchez ça en console Javascript :
Code:
[[]+[][+[]]][+[]][++[++[++[++[+[]][+[]]][+[]]][+[]]][+[]]]+[[]+[][+[]]][+[]][+[]]+[[]+[][+[]]][+[]][++[+[]][+[]]]+[[]+[][+[]]][+[]][++[+[]][+[]]]+[+[++[+[]][+[]]+[]+[[]+[][+[]]][+[]][++[++[++[+[]][+[]]][+[]]][+[]]]+[++[+[]][+[]]+[]][+[]]+[+[]]+[+[]]+[+[]]][+[]]+[]][+[]][++[++[++[++[++[++[++[+[]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]]
Voilà la liste des caractères que j'ai trouvé et leur traduction en [+] :
0: +[]
1: ++[[]][+[]]
2: ++[++[[]][+[]]][+[]]
3: ++[++[++[[]][+[]]][+[]]][+[]]
4: ++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]
5: ++[++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]][+[]]
6: ++[++[++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]
7: ++[++[++[++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]
8: ++[++[++[++[++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]
9: ++[++[++[++[++[++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]
undefined : [][+[]]
NaN : +[][+[]]
Infinity : +[++[[]][+[]]+[]+[[]+[][+[]]][+[]][++[++[++[[]][+[]]][+[]]][+[]]]+[++[[]][+[]]+[]][+[]]+[+[]]+[+[]]+[+[]]][+[]]
"" : []+[]
[]+1 : "1"
[]+0 : "0"
undefined + []: "undefined"
a: [+[]+[][+[]]+[]][+[]][++[[]][+[]]]
d: [[]+[][+[]]][+[]][++[++[[]][+[]]][+[]]]
e: [[]+[][+[]]][+[]][++[++[++[[]][+[]]][+[]]][+[]]]
f: [[]+[][+[]]][+[]][++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]]
i: [[]+[][+[]]][+[]][++[++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]][+[]]]
n: [[]+[][+[]]][+[]][++[[]][+[]]]
t: [+[++[[]][+[]]+[]+[[]+[][+[]]][+[]][++[++[++[[]][+[]]][+[]]][+[]]]+[++[[]][+[]]+[]][+[]]+[+[]]+[+[]]+[+[]]][+[]]+[]][+[]][++[++[++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]]
u: [[]+[][+[]]][+[]][+[]]
y: [+[++[[]][+[]]+[]+[[]+[][+[]]][+[]][++[++[++[[]][+[]]][+[]]][+[]]]+[++[[]][+[]]+[]][+[]]+[+[]]+[+[]]+[+[]]][+[]]+[]][+[]][++[++[++[++[++[++[++[[]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]][+[]]]
I: [+[++[[]][+[]]+[]+[[]+[][+[]]][+[]][++[++[++[[]][+[]]][+[]]][+[]]]+[++[[]][+[]]+[]][+[]]+[+[]]+[+[]]+[+[]]][+[]]+[]][+[]][+[]]
N: [+[][+[]]+[]][+[]][+[]]
Bon on est bien d'accord que tout cela ne sert strictement à rien, ce n'est absolument pas performant en termes d'obfuscation, mais je trouve ça assez fun :mrgreen:
Donc si vous avez d'autres idées pour aller trouver d'autres lettres, balancez !
Là j'ai peut-être une piste en cherchant avec les lettres dont je dispose une fonction dans le prototype de Array / String / Number / Object, puis caster cette fonction en String pour en récupérer une forme littérale. Quelque-chose comme ça :
[""][0]["big"]+[] --> "function big() { [native code] }"
Mais je ne trouve pas de fonction dont je dispose de toutes les lettres. Je pourrais aussi peut-être essayer de choper l'objet Date, mais il me manque le D majuscule...