Documentation
/
Obfuscation VM
/

Comment la VM transforme le code

Comment la VM transforme le code

Regarder

Obfuscator.io: Targeting Functions in VM Obfuscation (IIFE and Comment Mode)

Regarder sur YouTube

Avec vmTargetFunctionsMode: 'root' (par défaut), l'obfuscation VM transforme en bytecode le corps de chaque fonction de premier niveau (ou, avec vmAsyncExecutor, de chaque fonction async la plus externe). Les fonctions de premier niveau conservent leur nom ; les fonctions imbriquées sont renommées comme d'habitude. Pour choisir plutôt des fonctions individuelles à n'importe quel niveau d'imbrication, utilisez le mode comment.

JavaScript

Ce choix de conception préserve la compatibilité avec le code qui appelle ces fonctions depuis la portée globale ou qui s'attend à les trouver sur l'objet global. Le corps de la fonction est entièrement protégé, mais son nom reste visible, et l'obfuscateur émet un avertissement VMGlobalFunctionNamesNotRenamed qui liste ces noms.

L'obfuscation VM protège les corps de fonctions, ainsi que les initialiseurs de variables de premier niveau lorsque vmWrapTopLevelInitializers est activé (voir ci-dessous). Si l'entrée ne contient ni fonction ni initialiseur de ce type - du code uniquement de premier niveau comme alert(1); - rien n'est virtualisé : le reste de l'obfuscation s'exécute quand même, mais aucune protection VM n'est appliquée, et l'obfuscateur émet un avertissement VMNoFunctionsToVirtualize (v7.14.1+ ; la version 7.14.0 elle-même est désactivée). Il se déclenche aussi lorsque des fonctions existent mais que toutes ont été ignorées (par exemple, un eval direct ou un new Function dynamique, vmTargetFunctions/vmExcludeFunctions ne laissant rien de sélectionné, ou vmAsyncExecutor ne trouvant aucune fonction async). Enveloppez le code à protéger dans une fonction, par exemple une IIFE.

Initialiseurs de premier niveau

En mode root, vmWrapTopLevelInitializers enveloppe dans des IIFE les initialiseurs de variables de premier niveau éligibles, comme const MY_STRING = 'my-string';, afin que leurs valeurs passent dans le bytecode au lieu de rester visibles en JavaScript clair. Les préréglages VM actuels l'activent. Seuls les initialiseurs de variables sont concernés, pas les autres instructions de premier niveau, et l'option est sans effet en mode comment. Les initialiseurs qui restent en JavaScript clair sont listés dans un avertissement VMTopLevelInitializerNotVirtualized.

Masquer les noms de fonctions sensibles

Comme le mode root conserve le nom, un nom révélateur comme validateLicense ou decryptData reste lisible même une fois son corps converti en bytecode. La solution consiste à sortir la fonction du niveau racine - l'envelopper dans une IIFE, où elle n'est plus de premier niveau et est entièrement transformée par la VM, nom compris - ou à renommer les identifiants de premier niveau avec renameGlobals. Consultez Masquer les noms de fonctions à l'analyse par LLM pour ces deux techniques et leurs compromis.