Async Executor

Pro
v7.3.0+

Esegui la VM in modo asincrono, così che la chiave di decifratura del bytecode possa essere recuperata durante l'esecuzione anziché essere inclusa nel bundle.

Guarda

Obfuscator.io Async Executor: Async Bytecode Key Getter and Async-Only VM Virtualization

Guarda su YouTube

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 decifratura 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, consulta Esternalizzare la chiave di Bytecode Array Encoding.

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 non vengono virtualizzate (il resto dell'offuscamento si applica comunque).

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 virtualizzati (il resto dell'offuscamento si applica comunque a essi).

JavaScript

Esclusioni e avvisi

Anche i generatori asincroni non vengono virtualizzati 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), a meno che non venga virtualizzato nulla, nel qual caso viene segnalato VMNoFunctionsToVirtualize. In modalità 'comment', invece, viene segnalato un avviso (nella dashboard e nell'array warnings della risposta dell'API) 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+).

In modalità root, vmAsyncExecutor lascia gli inizializzatori delle variabili di primo livello in JavaScript semplice anche quando vmWrapTopLevelInitializers è attivo, e (v7.8.0+) un avviso VMTopLevelInitializerNotVirtualized li elenca.

Requisiti

  • Il key getter asincrono richiede vmBytecodeArrayEncoding, e vmBytecodeArrayEncodingKeyGetter deve essere abbinato a vmBytecodeArrayEncodingKey: l'offuscatore verifica che siano impostati entrambi (o nessuno dei due) e che il getter sia analizzabile come espressione, altrimenti rifiuta la build.
  • Versione dell'offuscatore 7.3.0 o successiva.

La semplice attivazione dell'opzione si limita a portare l'executor in modalità asincrona (vengono virtualizzate solo le funzioni async più esterne). È la restituzione di una Promise da parte del key getter a sbloccare il recupero della chiave durante l'esecuzione e ciò richiede, in aggiunta, Bytecode Array Encoding con un key getter. Il fatto che il getter restituisca una Promise non può essere verificato in fase di build, quindi un getter che restituisce una Promise con vmAsyncExecutor disattivato fallisce durante l'esecuzione: il decodificatore riceve la Promise invece della chiave.

Esempio

JavaScript

In una base di codice interamente sincrona non viene virtualizzato quasi nulla, poiché sono idonee soltanto le funzioni async. Se gli entry point non sono async, usa un key getter sincrono e lascia vmAsyncExecutor disattivato.