Register-Based VM
Passa la VM a un modello di esecuzione basato su registri per un runtime più veloce e una forma della VM diversa da quella predefinita.
L'opzione vmRegisterBased sostituisce il bytecode basato su stack predefinito della VM con un modello di esecuzione basato su registri. In alcuni casi questo migliora le prestazioni di runtime della VM di circa il 10-20%, al prezzo di un bundle offuscato leggermente più grande.
Attivarla disattiva Stateful Opcodes (vmStatefulOpcodes): le due opzioni sono incompatibili, quindi se vmStatefulOpcodes era attivo, la build basata su registri lo scarta silenziosamente.
Basata su stack e basata su registri a confronto
Una VM basata su stack mantiene gli operandi su uno stack implicito: ogni valore viene inserito, consumato dall'istruzione successiva e il risultato viene reinserito. Una VM basata su registri indirizza invece direttamente i propri operandi, quindi lo stesso lavoro viene espresso con meno istruzioni e senza operazioni di push/pop tra di esse. È da qui che deriva il guadagno di runtime, ed è anche il motivo per cui il bytecode cresce leggermente: ogni istruzione deve ora specificare 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; la variante basata su registri scambia semplicemente un po' di dimensione per un po' di velocità.
Quando usarla
Usala quando il costo di runtime della VM conta. Il codice virtualizzato è per sua natura più lento del semplice JavaScript, quindi su un percorso eseguito di frequente (un ciclo di animazione, un handler eseguito a ogni frame, una routine di parsing intensiva) il 10-20% circa che l'executor basato su registri può far risparmiare vale il bundle più grande. Sul codice eseguito raramente, il costo in dimensione di solito non vale la pena. Il guadagno dipende dal codice, quindi misuralo sui tuoi percorsi frequenti.
Varia anche la forma della VM. Poiché genera bytecode ed executor strutturalmente diversi, l'output porta un'impronta diversa da quella della comune VM basata su stack. Un'analisi generica basata su pattern, tarata su quella forma basata su stack, riconosce meno facilmente una build basata su registri, quindi questo è un modo per allontanare la VM distribuita da quella predefinita.
Come funziona internamente
Non si tratta di un compilatore nativo basato su registri. Il normale compilatore basato su stack genera il bytecode esattamente come fa senza l'opzione; una fase di trasformazione separata riscrive poi quel bytecode in forma basata su registri. Poiché la conversione in registri avviene a valle di tutto ciò, la maggior parte dell'offuscamento VM (targeting, Bytecode Encoding, opzioni del dispatcher) non ne è influenzata (a parte Stateful Opcodes, vedi sopra).
Requisiti
- Richiede
vmObfuscation: questa opzione rimodella solo la VM prodotta davmObfuscation. - Versione dell'offuscatore 7.12.0 o successiva.
Questa opzione è sperimentale. La riscrittura basata su registri è più recente e meno collaudata del percorso predefinito basato su stack, quindi verifica che il tuo codice funzioni correttamente con vmRegisterBased attivo prima di distribuirlo: è lo stesso consiglio valido per qualsiasi opzione VM, ma qui vale doppiamente.
Esempio
L'esecuzione basata su registri si combina con il resto dell'offuscamento VM: Bytecode Encoding, Compact Dispatcher, VM Self Defending e VM Domain Lock funzionano esattamente come con la VM predefinita basata su stack. Cambia il modo in cui il bytecode viene eseguito, non le protezioni che lo avvolgono.
