Come la VM trasforma il codice
Guarda
Obfuscator.io: Targeting Functions in VM Obfuscation (IIFE and Comment Mode)
Con vmTargetFunctionsMode: 'root' (predefinito), l'offuscamento VM trasforma in bytecode il corpo di ogni funzione di primo livello (oppure, con vmAsyncExecutor, di ogni funzione async più esterna). Le funzioni di primo livello mantengono il proprio nome; quelle annidate vengono rinominate come di consueto. Per selezionare invece singole funzioni a qualsiasi livello di annidamento, usa la modalità comment.
Questa scelta progettuale preserva la compatibilità con il codice che chiama queste funzioni dallo scope globale o si aspetta di trovarle sull'oggetto globale. Il corpo della funzione è completamente protetto, ma il nome resta visibile e l'offuscatore segnala un avviso VMGlobalFunctionNamesNotRenamed che elenca tali nomi.
L'offuscamento VM protegge i corpi delle funzioni, più gli inizializzatori delle variabili di primo livello quando vmWrapTopLevelInitializers è attivo (vedi sotto). Se l'input non contiene alcuna funzione né alcun inizializzatore di questo tipo (codice esclusivamente di primo livello come alert(1);), non viene virtualizzato nulla: il resto dell'offuscamento viene comunque eseguito, ma non si applica alcuna protezione VM e l'offuscatore segnala un avviso VMNoFunctionsToVirtualize (v7.14.1+; la 7.14.0 stessa è disattivata). L'avviso viene emesso anche quando le funzioni esistono ma sono state tutte escluse (ad esempio un eval diretto o un new Function dinamico, vmTargetFunctions/vmExcludeFunctions che non lasciano nulla di selezionato, oppure vmAsyncExecutor che non trova alcuna funzione async). Racchiudi il codice che vuoi proteggere in una funzione, ad esempio una IIFE.
Inizializzatori di primo livello
In modalità root, vmWrapTopLevelInitializers racchiude in IIFE gli inizializzatori idonei delle variabili di primo livello, come const MY_STRING = 'my-string';, in modo che i loro valori passino nel bytecode invece di restare visibili come semplice JavaScript. Gli attuali preset VM lo attivano. Riguarda solo gli inizializzatori di variabili, non le altre istruzioni di primo livello, e non ha effetto in modalità comment. Gli inizializzatori che restano in semplice JavaScript sono elencati in un avviso VMTopLevelInitializerNotVirtualized.
Nascondere i nomi delle funzioni sensibili
Poiché la modalità root conserva il nome, un nome rivelatore come validateLicense o decryptData resta leggibile anche dopo che il corpo della funzione è diventato bytecode. La soluzione è spostare la funzione fuori dal livello superiore, racchiudendola in una IIFE, dove non è più di primo livello e viene trasformata completamente dalla VM, nome incluso, oppure rinominare gli identificatori di primo livello con renameGlobals. Consulta Nascondere i nomi delle funzioni all'analisi degli LLM per entrambe le tecniche e i relativi compromessi.
