VM basada en registros
Cambia la VM a un modelo de ejecución basado en registros para un runtime más rápido y una forma de VM distinta de la predeterminada.
La opción vmRegisterBased cambia la VM de su bytecode basado en pila predeterminado a un modelo de ejecución basado en registros. En algunos casos esto mejora el rendimiento de la VM en tiempo de ejecución en torno a un 15-20 %, a cambio de un bundle ofuscado ligeramente mayor.
Basado en pila frente a basado en registros
Una VM basada en pila mantiene los operandos en una pila implícita: cada valor se apila, la siguiente instrucción lo consume y el resultado se vuelve a apilar. Una VM basada en registros direcciona sus operandos directamente, de modo que el mismo trabajo se expresa en menos instrucciones y sin tráfico de apilar/desapilar entre ellas. De ahí viene la mejora de rendimiento, y también por qué el bytecode crece un poco, ya que cada instrucción ahora debe indicar qué registros lee y escribe en lugar de dejarlos implícitos en la pila.
Ninguno de los dos modelos cambia lo que hace tu código ni lo que protege la VM. Son dos codificaciones de la misma lógica virtualizada; basado en registros simplemente cambia un poco de tamaño por un poco de velocidad.
Cuándo usarla
Recurre a ella cuando el coste de ejecución de la VM importe. El código virtualizado es más lento que el JavaScript normal por diseño, así que en una ruta caliente —un bucle de animación, un manejador por fotograma, una rutina de parseo ajustada— el ~15-20 % que puede ahorrar el ejecutor basado en registros compensa el bundle mayor. En código que se ejecuta pocas veces, el coste de tamaño no suele valer la pena.
También varía la forma de la VM. Como emite un bytecode y un ejecutor estructuralmente distintos, la salida lleva una huella más singular que la VM basada en pila predeterminada. Si quieres que la VM entregada se parezca poco a la habitual basada en pila —para que sea menos reconocible ante análisis genéricos basados en patrones—, esta es una forma de cambiarla.
Cómo funciona internamente
Esto no es un compilador nativo basado en registros. El compilador basado en pila de siempre sigue generando el bytecode exactamente igual que sin la opción; una etapa de transformación aparte reescribe después ese bytecode a la forma basada en registros. La consecuencia práctica es que todo lo demás de la ofuscación de VM —targeting, codificación de bytecode, las opciones del dispatcher— se comporta igual, porque el modo basado en registros va por detrás de todo ello.
Requisitos
- Requiere
vmObfuscation: esta opción solo remodela la VM que producevmObfuscation. - Versión del ofuscador 7.12.0 o posterior.
Ejemplo
JavaScriptObfuscator.obfuscate(code, {
vmObfuscation: true,
vmRegisterBased: true
});
