Async Executor

Pro
v7.3.0+

Ejecuta la VM de forma asíncrona para que la clave de descifrado del bytecode pueda obtenerse en tiempo de ejecución en lugar de enviarse dentro del bundle.

Ver

Obfuscator.io Async Executor: Async Bytecode Key Getter and Async-Only VM Virtualization

Ver en YouTube

La opción vmAsyncExecutor activa el ejecutor asíncrono de la VM. Su principal ventaja es que vmBytecodeArrayEncodingKeyGetter ahora puede devolver una Promise -un key getter asíncrono- de modo que la clave de descifrado puede provenir de una solicitud de red, IndexedDB o cualquier fuente asíncrona en el momento de la carga, en lugar de estar disponible de forma síncrona cuando el código se ejecuta por primera vez.

Para ver una guía completa de obtención de la clave desde el backend, consulta Externalizar la clave de Bytecode Array Encoding.

Cuándo usarlo

Muy recomendado para bases de código totalmente asíncronas. En este modo solo se virtualizan las funciones async -una función síncrona no puede convertirse en asíncrona sin transformar su valor de retorno en una Promise y romper a quienes la llaman-, por lo que el código que es async de principio a fin obtiene la mayor cobertura. Sigue funcionando cuando la raíz es síncrona (por ejemplo, una IIFE síncrona o un envoltorio UMD): las funciones async más externas del interior quedan protegidas y las partes síncronas no se virtualizan (el resto de la ofuscación se sigue aplicando).

Qué se transforma

Cada función async más externa, dondequiera que aparezca (incluso anidada dentro de envoltorios síncronos). La función async más externa de cada cadena es la unidad protegida: todo lo que hay dentro de ella, síncrono y asíncrono, se compila. Las funciones síncronas y los generadores normales no se virtualizan (el resto de la ofuscación se les sigue aplicando).

JavaScript

Exclusiones y advertencias

Los generadores asíncronos tampoco se virtualizan cuando hay un key getter asíncrono activo: un generador asíncrono debe devolver su iterador de forma síncrona y no puede esperar a la clave. En el modo predeterminado vmTargetFunctionsMode: 'root' las exclusiones son silenciosas (la selección es automática), salvo que no se virtualice nada en absoluto, lo que notifica VMNoFunctionsToVirtualize. En el modo 'comment' se notifica una advertencia (en el panel y en el array warnings de la respuesta de la API) cada vez que una función que marcaste explícitamente no puede virtualizarse, ya sea porque resultó ser síncrona o porque es un generador asíncrono bajo un key getter asíncrono. Estas advertencias (VMSyncFunctionSkippedInAsyncMode, VMAsyncGeneratorSkippedInAsyncMode) pueden silenciarse por tipo mediante la opción warnings (v7.8.0+).

En el modo root, vmAsyncExecutor deja los inicializadores de variables de nivel superior en JavaScript normal incluso cuando vmWrapTopLevelInitializers está activada, y (v7.8.0+) una advertencia VMTopLevelInitializerNotVirtualized los enumera.

Requisitos

  • El key getter asíncrono requiere vmBytecodeArrayEncoding, y vmBytecodeArrayEncodingKeyGetter debe ir acompañado de vmBytecodeArrayEncodingKey: el ofuscador valida que ambos estén definidos (o que falten los dos) y que el getter se pueda analizar como una expresión, y en caso contrario rechaza la compilación.
  • Versión del ofuscador 7.3.0 o posterior.

Activar la opción por sí sola solo cambia el ejecutor al modo asíncrono (solo se virtualizan las funciones async más externas). Devolver una Promise desde el key getter es lo que desbloquea la obtención de la clave en tiempo de ejecución, y eso requiere además Bytecode Array Encoding con un key getter. No se puede comprobar en tiempo de compilación si el getter devuelve una Promise, así que un getter que devuelve una Promise con vmAsyncExecutor desactivado falla en tiempo de ejecución: el decodificador recibe la Promise en lugar de la clave.

Ejemplo

JavaScript

En una base de código totalmente síncrona casi nada se virtualiza, ya que solo las funciones async son elegibles. Si tus puntos de entrada no son async, prefiere un key getter síncrono y deja vmAsyncExecutor desactivado.