Diagnosticare gli errori di runtime della VM
Il codice offuscato con VM genera un errore a runtime: può trattarsi di un RangeError: Invalid array length, ma la stessa
checklist si applica agli altri errori imprevisti che si manifestano soltanto dopo l'offuscamento. Si consiglia di seguire i
passaggi seguenti nell'ordine indicato. Il primo intercetta di gran lunga la causa più frequente, mentre i successivi
permettono di circoscrivere un bug reale.
Passaggio 1 - Verificare l'ambiente di esecuzione rispetto all'opzione target
La causa di gran lunga più frequente di Invalid array length e degli errori analoghi è la discrepanza fra l'opzione target
e l'ambiente in cui il codice viene effettivamente eseguito, in combinazione con vmSelfDefending: true.
Ambienti in cui il fenomeno si verifica:
- Node.js (esecuzione diretta del bundle offuscato tramite
node) - Chrome / Chromium headless, PhantomJS
- Puppeteer, Playwright, Cypress, Selenium / ChromeDriver, Nightmare
- jsdom e altre emulazioni del DOM lato server
- Qualsiasi ambiente in cui le funzioni native del browser siano state sottoposte a hooking o sostituite
Se il proprio ambiente di esecuzione compare in questo elenco, l'errore non è un bug ma il funzionamento previsto della protezione. Occorre scegliere la soluzione corrispondente al proprio caso:
- Esecuzione intenzionale in Node.js (script lato server, strumento CLI, processo main di Electron): impostare
target: 'node'durante l'offuscamento. Il livello self-defending si calibrerà su Node anziché sul browser. - Esecuzione di test automatici o E2E su una build offuscata (Cypress, Playwright, Puppeteer, Selenium): produrre una build di test separata con
vmSelfDefending: false. L'opzione è progettata per impedire l'automazione e non può essere autorizzata per singoli strumenti. Per l'elenco completo degli ambienti incompatibili si veda VM Self Defending. - Esecuzione in un browser reale con l'errore ancora presente: verificare che nessuna estensione, script dei devtools o pagina wrapper stia effettuando l'hooking delle funzioni native (
Array,Function.prototype,JSONe simili). Prima di considerarlo un bug, occorre riprodurre il problema in un profilo pulito.
Passaggio 2 - Circoscrivere il problema a una singola funzione
Se il Passaggio 1 non ha risolto il problema, l'errore risiede in una porzione specifica del codice trasformato. Passare a
vmTargetFunctionsMode: 'comment' e aggiungere /* javascript-obfuscator:vm */
a una funzione alla volta finché l'errore non si ripresenta. La funzione contrassegnata al momento della ricomparsa
dell'errore è quella responsabile e costituisce la riproduzione minima da inviare al supporto.
Passaggio 3 - Inviare una segnalazione di bug
Una volta accertato che non si tratta di una discrepanza fra target e self-defending e individuata la funzione
responsabile, scrivere a support@obfuscator.io. Maggiore è il numero di elementi seguenti
inclusi nella segnalazione, più rapida sarà la correzione:
- Stack trace completo dell'errore, esattamente come compare nella console e non parafrasato.
- Opzioni dell'offuscatore in formato JSON. Copiare l'intero oggetto delle opzioni utilizzato (oppure il nome del preset e le eventuali modifiche). Le interazioni sottili fra le opzioni sono frequenti, per cui è necessario disporre dell'insieme esatto.
- Versione dell'offuscatore - indicata nell'angolo inferiore destro dell'editor.
- Ambiente - browser e relativa versione, versione di Node.js, sistema operativo e qualsiasi particolarità dell'ambiente di esecuzione (estensioni, polyfill, funzioni native personalizzate).
- Riproduzione minima - idealmente la singola funzione individuata al Passaggio 2, insieme al punto di chiamata necessario a provocare l'errore.
- Il sorgente originale (precedente all'offuscamento), ove possibile. L'output offuscato è opaco anche per noi: senza l'input saremmo costretti a decompilare il nostro stesso bytecode.
