Documentazione
/
Offuscamento VM
/

Executor asincrono

Executor asincrono

Pro
v7.3.0+

Eseguire la VM in modo asincrono, così che la chiave di decrittazione del bytecode possa essere recuperata a runtime anziché essere inclusa nel bundle.

L'opzione vmAsyncExecutor attiva l'executor asincrono della VM. Il vantaggio principale è che vmBytecodeArrayEncodingKeyGetter può ora restituire una Promise — ovvero un key getter asincrono — cosicché la chiave di decrittazione può provenire da una richiesta di rete, da IndexedDB o da qualsiasi altra sorgente asincrona al momento del caricamento, anziché dover essere disponibile in modo sincrono alla prima esecuzione del codice.

Per una guida completa al recupero della chiave dal backend, si veda la ricetta Recuperare la chiave del bytecode array dal backend.

Quando utilizzarlo

Fortemente consigliato per basi di codice interamente asincrone. In questa modalità vengono virtualizzate soltanto le funzioni async — una funzione sincrona non può essere resa asincrona senza trasformarne il valore di ritorno in una Promise e compromettere i relativi chiamanti — pertanto il codice interamente async ottiene la copertura più ampia. L'opzione funziona anche quando la radice è sincrona (ad esempio una IIFE sincrona o un wrapper UMD): le funzioni async più esterne al suo interno vengono protette, mentre le parti sincrone restano invariate.

Che cosa viene trasformato

Ogni funzione async più esterna, ovunque compaia (anche annidata all'interno di wrapper sincroni). La funzione async più esterna di ciascuna catena costituisce l'unità protetta: tutto ciò che si trova al suo interno, sia sincrono sia asincrono, viene compilato insieme a essa. Le funzioni sincrone e i generatori ordinari non vengono offuscati.

function foo() {              // sync — left as-is
    function bar() {}         // sync — left as-is

    async function baz() {    // transformed
        // any code here, including calls to other async or sync functions
    }

    async function bark() {   // transformed
        // any code here, including calls to other async or sync functions
    }
}

Esclusioni e avvisi

Anche i generatori asincroni restano non offuscati quando è attivo un key getter asincrono: un generatore asincrono deve restituire il proprio iteratore in modo sincrono e non può attendere la chiave. Nella modalità predefinita vmTargetFunctionsMode: 'root' le esclusioni sono silenziose (la selezione è automatica). In modalità 'comment', invece, viene emesso un avviso tramite ObfuscationResult.getWarnings() ogni volta che una funzione contrassegnata esplicitamente non può essere virtualizzata, perché è risultata sincrona oppure perché è un generatore asincrono in presenza di un key getter asincrono. Questi avvisi (VMSyncFunctionSkippedInAsyncMode, VMAsyncGeneratorSkippedInAsyncMode) possono essere disattivati singolarmente per tipo tramite l'opzione warnings (v7.8.0+).

Requisiti

  • Il key getter asincrono richiede vmBytecodeArrayEncoding insieme a un vmBytecodeArrayEncodingKeyGetter.
  • Versione dell'offuscatore 7.3.0 o successiva.

Esempio

JavaScriptObfuscator.obfuscate(code, {
    vmObfuscation: true,
    vmAsyncExecutor: true,
    vmBytecodeArrayEncoding: true,
    vmBytecodeArrayEncodingKey: 'mySecretKey123',
    // the key getter may now return a Promise
    vmBytecodeArrayEncodingKeyGetter: 'fetch("/vm-key").then((res) => res.text())'
});