Documentação
/
Ofuscação VM
/

Como a VM transforma o código

Como a VM transforma o código

Assistir

Obfuscator.io: Targeting Functions in VM Obfuscation (IIFE and Comment Mode)

Assistir no YouTube

Com vmTargetFunctionsMode: 'root' (padrão), a ofuscação VM transforma o corpo de cada função de nível raiz (ou, com vmAsyncExecutor, de cada função async mais externa) em bytecode. As funções de nível raiz mantêm seus nomes; as aninhadas são renomeadas normalmente. Para escolher funções individuais em qualquer nível de aninhamento, use o modo comment.

JavaScript

Esse design mantém a compatibilidade com código que chama essas funções a partir do escopo global ou espera encontrá-las no objeto global. O corpo da função fica totalmente protegido, mas o nome continua visível, e o ofuscador emite um aviso VMGlobalFunctionNamesNotRenamed listando esses nomes.

A ofuscação VM protege corpos de funções, além dos inicializadores de variáveis de nível superior quando vmWrapTopLevelInitializers está ativado (veja abaixo). Se a entrada não tiver nenhuma função nem nenhum desses inicializadores - código só de nível superior, como alert(1); -, nada é virtualizado: o resto da ofuscação ainda roda, mas nenhuma proteção VM é aplicada, e o ofuscador emite um aviso VMNoFunctionsToVirtualize (v7.14.1+; a própria 7.14.0 está desativada). Ele também é emitido quando existem funções, mas todas foram ignoradas (por exemplo, eval direto ou um new Function dinâmico, vmTargetFunctions/vmExcludeFunctions sem deixar nada selecionado, ou vmAsyncExecutor sem encontrar nenhuma função async). Envolva o código que você quer proteger em uma função, por exemplo, uma IIFE.

Inicializadores de nível superior

No modo root, vmWrapTopLevelInitializers envolve em IIFEs os inicializadores de variáveis de nível superior elegíveis, como const MY_STRING = 'my-string';, para que seus valores passem para o bytecode em vez de continuarem visíveis como JavaScript comum. As predefinições VM atuais a ativam. Ela cobre apenas inicializadores de variáveis, não outras instruções de nível superior, e não tem efeito no modo comment. Os inicializadores que permanecem em JavaScript comum são listados em um aviso VMTopLevelInitializerNotVirtualized.

Escondendo nomes de funções sensíveis

Como o modo root mantém o nome, um nome revelador como validateLicense ou decryptData continua legível mesmo depois que o corpo vira bytecode. A solução é tirar a função do nível superior - envolvê-la em uma IIFE, onde ela deixa de ser de nível raiz e é totalmente transformada pela VM, incluindo o nome - ou renomear os identificadores de nível raiz com renameGlobals. Veja em Escondendo nomes de funções da análise por LLM as duas técnicas e suas contrapartidas.