Come la VM trasforma il codice
Con vmTargetFunctionsMode: 'root' (valore predefinito), l'offuscamento VM trasforma in bytecode il corpo di ogni funzione di primo livello (in base a vmObfuscationThreshold), lasciando però invariato il nome della funzione.
// Input
function fibonacci(n) {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
// Output - function NAME is preserved, BODY is VM-transformed
function fibonacci(b) { // name kept as-is
return vm.call(...); // body converted to bytecode
}
Questa scelta progettuale preserva la compatibilità con il codice che richiama tali funzioni dallo scope globale o che si aspetta di trovarle sull'oggetto globale. Il corpo della funzione è completamente protetto, ma il nome resta visibile.
Nascondere i nomi delle funzioni sensibili:
Se il nome di una funzione rivela ciò che il codice fa (ad esempio validateLicense, decryptData), è possibile ricorrere a uno dei seguenti approcci:
Opzione 1: incapsulare in una IIFE (consigliato)
Collocare le funzioni sensibili all'interno di una IIFE o di qualsiasi altro corpo di funzione. Le funzioni annidate in altre funzioni non sono di primo livello e vengono pertanto trasformate integralmente dalla VM, nomi compresi.
// Wrap sensitive code in IIFE (function() { function fibonacci(n) { if (n <= 1) return n; return fibonacci(n - 1) + fibonacci(n - 2); } // Use fibonacci here... })(); // "fibonacci" name is completely hidden in outputOpzione 2: rinomina delle variabili globali e codifica (da usare con cautela)
Attivare
renameGlobals: true,vmBytecodeEncoding: trueevmBytecodeArrayEncoding: true. In questo modo gli identificatori di primo livello vengono rinominati e cifrati all'interno del bytecode.
