VM basata su registri
Passa la VM a un modello di esecuzione basato su registri per un runtime più veloce e una forma di VM diversa da quella predefinita.
L’opzione vmRegisterBased passa la VM dal suo bytecode basato su stack predefinito a un modello di esecuzione basato su registri. In alcuni casi questo migliora le prestazioni runtime della VM di circa il 15-20 %, al costo di un bundle offuscato leggermente più grande.
Basato su stack o su registri
Una VM basata su stack tiene gli operandi su uno stack implicito: ogni valore viene inserito, consumato dall’istruzione successiva e il risultato reinserito. Una VM basata su registri indirizza invece gli operandi direttamente, così lo stesso lavoro è espresso in meno istruzioni e senza traffico di push/pop tra di esse. Da qui viene il guadagno di runtime — e anche il motivo per cui il bytecode cresce un po’, dato che ogni istruzione deve ora indicare quali registri legge e scrive invece di lasciarli impliciti sullo stack.
Nessuno dei due modelli cambia ciò che fa il tuo codice o ciò che la VM protegge. Sono due codifiche della stessa logica virtualizzata; il modello basato su registri semplicemente baratta un po’ di dimensione con un po’ di velocità.
Quando usarla
Usala quando il costo di esecuzione della VM conta. Il codice virtualizzato è più lento del normale JavaScript per progettazione, quindi su un percorso caldo — un ciclo di animazione, un handler per frame, una routine di parsing serrata — il ~15-20 % che l’esecutore basato su registri può risparmiare vale il bundle più grande. Su codice che gira di rado, il costo in dimensione di solito non ne vale la pena.
Varia anche la forma della VM. Poiché emette un bytecode e un esecutore strutturalmente diversi, l’output porta un’impronta più peculiare rispetto alla VM basata su stack predefinita. Se vuoi che la VM distribuita assomigli poco a quella comune basata su stack — così da essere meno riconoscibile a un’analisi generica basata su pattern — questo è un modo per cambiarla.
Come funziona internamente
Questo non è un compilatore nativo basato su registri. Il consueto compilatore basato su stack continua a generare il bytecode esattamente come senza l’opzione; una fase di trasformazione separata riscrive poi quel bytecode nella forma basata su registri. La conseguenza pratica è che tutto il resto dell’offuscamento VM — targeting, codifica del bytecode, le opzioni del dispatcher — si comporta allo stesso modo, perché il modello basato su registri sta a valle di tutto ciò.
Requisiti
- Richiede
vmObfuscation— questa opzione rimodella soltanto la VM prodotta davmObfuscation. - Versione dell’offuscatore 7.12.0 o successiva.
Esempio
JavaScriptObfuscator.obfuscate(code, {
vmObfuscation: true,
vmRegisterBased: true
});
