
Rétro-ingénierie de JavaScript obfusqué visuellement. Enchaînez les transformations, inspectez les changements AST, écrivez des plugins de désobfuscation réutilisables.
Un atelier visuel pour désobfusquer du JavaScript. Construisez des chaînes de transformations, parcourez-les, écrivez vos propres plugins.


Cette application révèle l'arbre syntaxique abstrait (AST) d'un programme JavaScript. L'idée est venue lors de l'analyse d'un échantillon de malware lié à obfuscator.io, qui m'a amené à en apprendre davantage sur BabelJS pour la désobfuscation. Si vous avez déjà essayé de rétro-ingénierer du JS obfusqué (pensez : bundles webpack, sortie d'obfuscator.io, échantillons de malware packagés), vous savez à quel point c'est pénible. Cet outil vous permet de :
npm install
npm start
# Ouvrir http://localhost:3000
C'est tout.
Barre latérale gauche - Toutes les transformations disponibles (intégrées + votre recette sous forme de plugins), y compris la chaîne de recettes. (Pensez à Cyberchef)
Milieu - Éditeurs d'entrée/sortie. Collez votre code obfusqué à gauche et visualisez le code transformé à droite.
Panneaux de droite - Visualiseur AST, analyseur de portée, résumé facile à consulter.

BabelJS nous permet de visualiser la portée et les liaisons. Cela est particulièrement utile pour repérer d'éventuelles variables inutilisées, par exemple. Cette vue permet également de rechercher les endroits où une variable est référencée.

Cliquez sur le bouton + ou appuyez sur Ctrl+N pour ouvrir l'éditeur de script. Les transformations sont simplement du code JS avec accès à :
// Variables globales disponibles :
ast // L'AST Babel parsé
traverse // Parcourir l'arbre : traverse({ Identifier(path) { ... } })
t // Types Babel : t.isStringLiteral(node), t.identifier('x')
config // Configuration utilisateur depuis la carte de recette
stats // Suivre vos modifications : stats.replaced = 5
parser // Parser du code : parser.parse('var x = 1')
generate // Générer du code : generate(node).code
run // Helper d'évaluation : run('1+1') => 2 (DANGEREUX. C'EST PRÉVU POUR ÊTRE EXÉCUTÉ SUR VOTRE PROPRE MACHINE DANS UN BAC À SABLE)
Exemple - supprimer toutes les chaînes "debug" (StringLiteral) :
// Les deux suivants apparaîtront comme paramètres dans la chaîne de recette, comme dans la capture d'écran suivante
const targetValue = config.targetValue || 'debug';
const removeMatches = config.removeMatches !== false;
traverse({
StringLiteral(path) {
if (path.node.value === targetValue) {
if (removeMatches) {
path.remove();
stats.removed = (stats.removed || 0) + 1;
}
}
}
});
Vous pouvez choisir de :
La capture d'écran ci-dessous montre :

Notez qu'elles peuvent échouer selon la technique d'obfuscation et peuvent nécessiter des scripts personnalisés. Vous pouvez également les modifier et les sauvegarder comme nouveau script personnalisé.
Déposez vos propres fichiers .js dans les sous-dossiers plugins/<catégorie>/. Ils apparaîtront dans la barre latérale groupés par dossier.

Par exemple :
Bracket-to-dot-notation.js → "Decode Strings")plugins/Utilities/ → catégorie "nyx")/**
* Bracket to Dot Notation
* Change des choses comme console["log"] en console.log
*
* Category: utilities
*/
// Script Editor - Ctrl+Enter pour exécuter, Ctrl+E pour fermer
// Utilisez traverse(visitor) pour modifier l'AST
// Accédez à 't' pour les types Babel
traverse({
MemberExpression(path) {
if(path.node.computed === true){
// c'est la notation crochet
prop = path.node.property
if(t.isStringLiteral(prop) &&
/^[a-zA-Z_][a-zA-Z_0-9]*$/.test(prop.value)
){
path.node.computed = false; // étape 1
// étape 2 changer le littéral en identifiant
path.node.property = t.identifier(prop.value)
}
}
}
});
Il existe deux méthodes pour ajouter des paramètres :
targetValue et removeMatches)const targetValue = config.targetValue || 'debug';
const removeMatches = config.removeMatches !== false;

Inclut :

| Touche | Action |
|---|---|
Ctrl+E | Activer/désactiver l'éditeur de script |
Ctrl+Shift+E | Activer/désactiver le panneau d'évaluation (DANGEREUX) |
Ctrl+S | Sauvegarder le projet |
NOTEZ QUE LA VERSION AUTONOME PEUT AVOIR DES PROBLÈMES S'IL Y A BEAUCOUP DE NŒUDS IMBRIQUÉS. LA SOLUTION DE CONTOURNEMENT PEUT NE PAS FONCTIONNER PARFOIS.
Pour construire avec npm, nous pouvons utiliser la commande suivante
npm run build # Windows uniquement
La sortie va dans dist/. Copiez le dossier plugins/ à côté de l'exécutable si vous voulez vos transformations personnalisées.
Le code profondément imbriqué (comme JSFuck) peut faire sauter la pile. Le script de build tente de l'augmenter automatiquement sous Windows. Si vous obtenez des débordements de pile, essayez de lancer depuis la source avec npm start (utilise --stack-size=65536)
Je n'ai pas trouvé comment augmenter la taille de pile lors de la construction en un exécutable autonome. Si vous savez comment faire, merci de me le faire savoir !
Construit avec :

Des questions ? Des problèmes ? Ouvrez un ticket GitHub.
| Nom | Ce qu'il fait |
|---|
| Beautifier | Formate le code joliment |
| Pliage de constantes | 1 + 2 → 3, "a" + "b" → "ab" |
| Décode les chaînes | Décode \x48\x65\x6c\x6c\x6f → "Hello" |
| Intègre les valeurs de tableau | Intègre les accès simples aux éléments de tableau |
| Intègre les tableaux de chaînes | Intègre les tableaux de chaînes utilisés par les obfuscateurs |
| Suppression des prédicats opaques | Supprime les conditions toujours vraies/fausses |
| Supprimer les commentaires | Supprime tous les commentaires du code |
| Supprimer les IIFE | Désenveloppe les wrappers (function(){...})() |
| Supprimer le code inutilisé | Supprime les variables et fonctions mortes |
| Simplifier les littéraux | !0 → true, void 0 → undefined |