Aide

Deobfuscator JavaScript en ligne : rendre un code obfusqué lisible

Un deobfuscator JavaScript annule les astuces qui rendent un code difficile à lire. Celui-ci déballe les tableaux de chaînes simples, calcule les expressions constantes, décode les échappements hexadécimaux et Unicode et renomme les noms de style _0x, puis affiche le résultat avec une indentation de 2 espaces. Il le fait en lisant le code, pas en l'exécutant : votre JavaScript n'est ni exécuté ni envoyé, et une partie de l'obfuscation, détaillée plus bas, est laissée telle quelle.


Deobfuscator JavaScript online : mode d'emploi

  1. Collez le code dans JavaScript obfusqué. Tant que vous n'avez rien collé, la zone affiche « Collez ici le JavaScript obfusqué… ». La limite est de 5 000 000 de caractères.
  2. Sélectionnez Options de désobfuscation pour ouvrir quatre cases à cocher, toutes activées par défaut : Déballer les tableaux de chaînes, Évaluer les constantes, Décoder les échappements hexadécimaux et Unicode et Renommer les variables hexadécimales. Décochez les étapes dont vous ne voulez pas.
  3. Appuyez sur Désobfusquer. L'écran Code désobfusqué affiche le résultat sous forme de code coloré en lecture seule.
  4. Lisez les pastilles au-dessus du code. Elles indiquent ce qui a changé, par exemple « 3 accès au tableau remplacés », « 5 expressions simplifiées », « 2 littéraux décodés » ou « 4 variables renommées ». Si rien ne s'appliquait, la pastille indique « Rien ici n'avait besoin d'être déballé ni simplifié : le code a seulement été remis en forme. »
  5. Appuyez sur Copier (le bouton devient Copié) ou sur Télécharger le .js pour enregistrer le code sous le nom desobfusque.js.
  6. Choisissez Modifier le code pour revenir à votre texte et relancer avec d'autres options.

Si le texte n'est pas du JavaScript valide, vous voyez « Ce n'est pas du JavaScript valide : erreur de syntaxe à la ligne N, colonne M. » avec la ligne et la colonne réelles, et rien n'est modifié.

Ce que fait chaque option

Les étapes s'exécutent dans cet ordre : un accès au tableau peut donc être déballé d'abord, puis réuni à ses voisins par l'évaluation des constantes. Les noms de propriétés, les étiquettes et les noms d'import et d'export ne sont jamais renommés, et la ligne shebang en tête d'un script est conservée.

Un exemple pas à pas

Cette entrée contient un tableau de chaînes, un nom de style hexadécimal, une propriété entre guillemets et une somme :

var _0x1a2b = ['hello', 'world', '\x68\x69']; function _0x3c(_0x4d) { console['log'](_0x1a2b[0] + ' ' + _0x1a2b[1], _0x4d, _0x1a2b[2]); } _0x3c(1 + 2 * 3);

Et voici le résultat :

function func1(arg1) { console.log("hello world", arg1, "hi"); } func1(7);

Les pastilles indiquent « 3 accès au tableau remplacés », « 5 expressions simplifiées », « 1 littéral décodé » et « 2 variables renommées ». La sortie réelle est répartie sur plusieurs lignes avec une indentation de 2 espaces.

Décoder l'obfuscation JavaScript : ce que l'outil défait

L'outil n'exécute jamais votre code : il ne peut donc défaire que ce qui est visible dans le texte. Tout ce qui demande d'abord l'exécution du programme est laissé tel quel plutôt que deviné.

C'est une aide à la lecture, pas un scanner de sécurité. L'outil ne vérifie pas si un code est malveillant et ne peut pas rendre sûr un code inconnu. Si un script vient d'une source en laquelle vous n'avez pas confiance, ne l'exécutez pas sous prétexte que le résultat paraît net.

Pourquoi un tableau de chaînes pivoté reste en place

De nombreux obfuscateurs déplacent les éléments d'un tableau de chaînes avec une courte boucle avant la première lecture : list[0] n'est donc pas le premier élément visible dans la source. Remplacer par les éléments visibles mettrait le mauvais texte dans votre code.

L'outil ne déballe donc un tableau que si chaque usage est list[3] avec un nombre dans les bornes, ou list.length. Si le tableau est passé à une fonction, enrichi par push, réaffecté ou lu avec un indice que l'outil ne sait pas calculer, ce tableau reste exactement tel qu'il est écrit.

Unminify JavaScript online et gros fichiers

Un code minifié mais non obfusqué revient remis en forme avec une indentation de 2 espaces, et la pastille précise que seule la mise en page a changé. C'est l'usage d'un unminify JavaScript : les noms courts comme a et b ne sont pas renommés, car ils ne sont pas de style hexadécimal et les noms d'origine ont disparu. Pour mettre en forme un code déjà lisible, ou embellir aussi du JSON, du HTML et du CSS, utilisez Formateur de code. Pour réduire de nouveau des feuilles de style, il y a Minifier CSS, et pour décoder une chaîne Base64 trouvée dans un script, Convertisseur Base64.

Tout s'exécute dans un Web Worker, la page reste donc réactive avec de gros fichiers. Des expressions très longues ou très imbriquées peuvent être trop lourdes pour la page : elle indique alors que le code est trop volumineux ou trop imbriqué pour être traité ici.


Questions fréquentes

Comment fonctionne le deobfuscator JavaScript ?

Collez le code dans « JavaScript obfusqué » et appuyez sur « Désobfusquer ». Le code est transformé en arbre syntaxique, les tableaux de chaînes sont déballés, les constantes calculées, les échappements décodés, les noms _0x renommés, puis l'arbre est réimprimé sous forme de code indenté. Copiez-le ou appuyez sur « Télécharger le .js » pour enregistrer desobfusque.js.

Existe-t-il un deobfuscator JavaScript en ligne ?

Oui, cette page en est un. Il s'exécute dans l'onglet de votre navigateur : le code est analysé dans un Web Worker, jamais envoyé et jamais exécuté. Il traite les tableaux de chaînes simples, les expressions constantes, les échappements hexadécimaux et Unicode et les noms de style _0x. Il n'annule pas tous les types d'obfuscation, et la liste de ce qui reste tel quel figure sur cette page.

Peut-il déchiffrer du JavaScript obfusqué avec obfuscator.io ?

Seulement les parties qui n'exigent pas d'exécuter le code. Les échappements hexadécimaux et Unicode sont décodés, les constantes calculées et les noms _0x renommés en var1, func1 et arg1. Le tableau de chaînes que obfuscator.io fait pivoter au démarrage avec push(shift()), et les chaînes obtenues par une fonction de décodage, restent telles quelles, car les défaire reviendrait à exécuter le code.

Comment décoder du JavaScript obfusqué qui contient des chaînes hexadécimales ?

Oui : laissez cochée l'option « Décoder les échappements hexadécimaux et Unicode » dans « Options de désobfuscation ». Une chaîne comme \x68\u0069 devient hi, et un nombre hexadécimal comme 0x1f devient 31. Seuls les échappements présents dans le code sont décodés ; une chaîne hexadécimale que le programme construit à l'exécution ne l'est pas.

Sert-il aussi à unminify JavaScript ?

Oui, la sortie est toujours réimprimée avec une indentation de 2 espaces : un code minifié devient donc lisible même quand il n'y avait rien à déballer. Le résultat affiche alors « Rien ici n'avait besoin d'être déballé ni simplifié : le code a seulement été remis en forme. » Les commentaires de l'entrée sont supprimés. Les noms minifiés comme a et b ne peuvent pas être retrouvés.

L'outil exécute-t-il mon JavaScript ?

Non. Le code est seulement lu et réécrit sous forme de texte. Il n'y a ni eval, ni appel à Function, ni exécution dans la page ou dans le Web Worker, ce qui explique que les tableaux pivotés et les fonctions de décodage restent tels quels. Ce n'est pas non plus un contrôle de sécurité : le résultat se lit mieux, mais un scanner ou un verdict sur un logiciel malveillant est un autre travail.

Pourquoi un tableau de chaînes est-il resté dans le résultat ?

Un tableau n'est déballé que si chaque usage est un indice constant comme list[3] ou list.length. Si le code le fait aussi pivoter, le passe à une fonction, y ajoute des éléments ou le lit avec un indice calculé, le tableau est laissé intact, car remplacer les lectures dans ce cas pourrait donner la mauvaise chaîne.

Que fait « Renommer les variables hexadécimales » ?

Elle donne un nom lisible aux noms comme _0x1a2b : var1 pour les variables, func1 pour les fonctions et arg1 pour les paramètres. Chaque usage est renommé en même temps, aucun nom déjà présent dans le programme n'est réutilisé, et les noms de propriétés et les étiquettes ne sont jamais touchés. Elle ne peut pas retrouver les noms d'origine, qui ne figurent pas dans le fichier.

Quelle taille peut avoir le code, et que se passe-t-il en cas d'erreur ?

Jusqu'à 5 000 000 de caractères. Si le code n'est pas du JavaScript valide, vous voyez « Ce n'est pas du JavaScript valide : erreur de syntaxe à la ligne N, colonne M. » avec les vrais numéros, et rien n'est modifié ; votre texte reste dans la zone pour que vous corrigiez l'endroit.

Mon code est-il envoyé quelque part ?

Non. L'analyse, la réécriture et l'impression se font dans votre navigateur, dans un Web Worker, et rien n'est envoyé à un serveur. Le code n'est pas non plus exécuté.

Recommandés

Aide à garder les outils gratuits. ✨

Images non contractuelles. En tant que Partenaire Amazon, je réalise un bénéfice sur les achats remplissant les conditions requises.