Async Executor

Pro
v7.3.0+

Execute a VM de forma assíncrona para que a chave de descriptografia do bytecode seja obtida em tempo de execução, em vez de ser enviada dentro do bundle.

Assistir

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

Assistir no YouTube

A opção vmAsyncExecutor ativa o executor assíncrono da VM. O principal benefício é que o vmBytecodeArrayEncodingKeyGetter agora pode retornar uma Promise - um getter de chave assíncrono - de modo que a chave de descriptografia pode vir de uma requisição de rede, do IndexedDB ou de qualquer fonte assíncrona no momento do carregamento, em vez de precisar estar disponível de forma síncrona quando o código roda pela primeira vez.

Para um passo a passo completo com a chave obtida no backend, veja Externalizando a chave do Bytecode Array Encoding.

Quando usar

Fortemente recomendado para bases de código totalmente assíncronas. Nesse modo, só as funções async são virtualizadas - uma função síncrona não pode se tornar assíncrona sem transformar o valor de retorno em uma Promise e quebrar quem a chama -, então o código que é async de ponta a ponta tem a maior cobertura. Ele ainda funciona quando a raiz é síncrona (por exemplo, uma IIFE síncrona ou um wrapper UMD): as funções async mais externas lá dentro são protegidas, e as partes síncronas não são virtualizadas (o resto da ofuscação ainda se aplica).

O que é transformado

Toda função async mais externa, onde quer que ela apareça (inclusive aninhada dentro de wrappers síncronos). A async mais externa de cada cadeia é a unidade protegida - tudo dentro dela, síncrono e assíncrono, é compilado junto. Funções síncronas e generators comuns não são virtualizados (o restante da ofuscação ainda se aplica a eles).

JavaScript

Casos ignorados e avisos

Os async generators também não são virtualizados quando um getter de chave assíncrono está ativo - um async generator precisa retornar seu iterador de forma síncrona e não pode esperar pela chave. No modo padrão vmTargetFunctionsMode: 'root', os casos ignorados são silenciosos (a seleção é automática), a menos que nada seja virtualizado, o que emite VMNoFunctionsToVirtualize. No modo 'comment', um aviso é relatado (no painel e no array warnings da resposta da API) sempre que uma função que você marcou explicitamente não pode ser virtualizada - porque ela acabou sendo síncrona ou é um async generator sob um getter de chave assíncrono. Esses avisos (VMSyncFunctionSkippedInAsyncMode, VMAsyncGeneratorSkippedInAsyncMode) podem ser silenciados por tipo pela opção warnings (v7.8.0+).

No modo root, vmAsyncExecutor deixa os inicializadores de variáveis de nível superior em JavaScript simples mesmo quando vmWrapTopLevelInitializers está ativado, e (v7.8.0+) um aviso VMTopLevelInitializerNotVirtualized os lista.

Requisitos

  • O getter de chave assíncrono requer vmBytecodeArrayEncoding, e vmBytecodeArrayEncodingKeyGetter precisa estar acompanhado de vmBytecodeArrayEncodingKey - o ofuscador verifica se os dois estão definidos (ou se ambos estão ausentes) e se o getter é analisado como uma expressão, e rejeita o build caso contrário.
  • Versão do ofuscador 7.3.0 ou posterior.

Ativar só a opção apenas muda o executor para o modo assíncrono (só as funções async mais externas são virtualizadas). O que libera a obtenção da chave em tempo de execução é retornar uma Promise do getter de chave, e isso precisa também de Bytecode Array Encoding com um getter de chave. Não é possível verificar no momento do build se o getter retorna uma Promise, então um getter que retorna uma Promise com vmAsyncExecutor desativado falha em tempo de execução - o decodificador recebe a Promise em vez da chave.

Exemplo

JavaScript

Em uma base de código totalmente síncrona, quase nada é virtualizado, já que só as funções async são elegíveis. Se os seus pontos de entrada não são async, prefira um getter de chave síncrono e deixe o vmAsyncExecutor desativado.