Documentazione
/
Offuscamento VM
/

Come la VM trasforma il codice

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 output
  • Opzione 2: rinomina delle variabili globali e codifica (da usare con cautela)

    Attivare renameGlobals: true, vmBytecodeEncoding: true e vmBytecodeArrayEncoding: true. In questo modo gli identificatori di primo livello vengono rinominati e cifrati all'interno del bytecode.