Comment empaqueter et dépaqueter du JavaScript

L’empaquetage réécrit le JavaScript dans l’enveloppe eval(function(p,a,c,k,e,d){…}(…)) du packer Base62 classique : chaque mot devient un index dans un dictionnaire des mots uniques triés, et la charge conserve le texte source avec les guillemets, les barres obliques inverses et les sauts de ligne échappés. Le dépaquetage évalue cette charge dans la page et affiche le JavaScript obtenu.

C’est de l’obfuscation, pas du chiffrement, et le dépaquetage exécute le code collé : réservez-le aux scripts de confiance. Les deux boutons ne travaillent que sur le texte du champ, rien n’est envoyé et la page ne fait aucune requête pendant l’opération.

  1. Collez le JavaScript dans le champ ci-dessus, ou une charge empaquetée eval(function(p,a,c,k,e,d){…}) si vous voulez la relire.
  2. Cliquez sur Empaqueter le JavaScript. Le champ de résultat affiche l’enveloppe sur une seule ligne, avec la charge empaquetée et le dictionnaire de mots dans sa liste d’arguments.
  3. Récupérez l’enveloppe avec le bouton Copier, ou cliquez sur Effacer pour vider les deux champs.
  4. Dans l’autre sens, collez une charge empaquetée et cliquez sur Dépaqueter. La page l’évalue et affiche le code obtenu.
  5. Si l’entrée ne contient pas eval, ne peut pas être évaluée ou ne renvoie pas du texte, le champ affiche une infobulle avec la raison au lieu d’un résultat vide.

Ce que font les deux boutons

L’enveloppe produite par l’empaqueteur

Chaque mot (lettres, chiffres, souligné et $) est remplacé par un index en base 62 (0-9, puis a-z, puis A-Z) et les mots uniques sont triés dans le dictionnaire qui accompagne la charge. La charge est une chaîne entre guillemets simples : les guillemets, les barres obliques inverses et les sauts de ligne sont donc échappés plutôt que supprimés — un commentaire // reste un commentaire et une instruction sans point-virgule garde son saut de ligne.

Le résultat est du JavaScript ordinaire : collé dans une page, il s’exécute, et tout dépaqueteur qui évalue l’enveloppe redonne le code d’origine. Sur cette version, l’aller-retour a été vérifié octet par octet avec guillemets échappés, expressions régulières à barres obliques inverses, gabarits de chaînes, commentaires de bloc, fichiers sans point-virgule, texte CJK, identifiants en $, texte JSON et dictionnaires de plus de 60 mots.

Relire une charge

Le dépaquetage accepte toute charge qui s’évalue en chaîne, y compris celles produites par la même enveloppe ailleurs. Le champ de résultat est en lecture seule avec coloration syntaxique, et le bouton de copie copie le texte.

Le dépaquetage évalue l’entrée dans cette page — c’est le principe même de l’enveloppe eval() — donc ne dépaquetez que du code de confiance. Si la charge lève une erreur ou ne renvoie pas du texte JavaScript, un message s’affiche au lieu d’un champ vide.

Tailles et durées mesurées

L’empaquetage ramène le code sur une seule ligne et réduit souvent le code répétitif : 2,7 Ko de fonctions sont passés à 1,8 Ko, 16,7 Ko à 11 Ko et 85 Ko à 55 Ko, avec 1 à 5 ms à l’empaquetage et 0,3 à 3 ms au dépaquetage dans Chrome.

L’enveloppe étant réversible par construction, voyez le résultat comme de l’obfuscation contre une lecture rapide, pas comme une protection d’un secret : n’importe qui peut le recoller ici ou dans un autre dépaqueteur pour retrouver le code.

Outils récents :