Документация
/
VM-обфускация
/

Асинхронный исполнитель

Асинхронный исполнитель

Pro
v7.3.0+

Запускайте VM асинхронно, чтобы ключ расшифровки байт-кода можно было получить во время выполнения, а не поставлять его внутри бандла.

Опция vmAsyncExecutor включает асинхронный исполнитель VM. Её главное преимущество в том, что vmBytecodeArrayEncodingKeyGetter теперь может возвращать Promiseасинхронный геттер ключа, — так что ключ расшифровки может поступать из сетевого запроса, IndexedDB или любого асинхронного источника во время загрузки, а не быть доступным синхронно при первом запуске кода.

Полный разбор получения ключа с бэкенда см. в рецепте Получение ключа массива байт-кода с бэкенда.

Когда использовать

Настоятельно рекомендуется для полностью асинхронных кодовых баз. В этом режиме виртуализируются только async-функции — синхронную функцию нельзя сделать асинхронной, не превратив её возвращаемое значение в Promise и не сломав вызывающих, — поэтому код, async по всей своей структуре, получает наибольший охват. Он всё равно работает, когда корень синхронен (например, синхронный IIFE или UMD-обёртка): самые внешние async-функции внутри защищаются, а синхронные части остаются как есть.

Что преобразуется

Каждая самая внешняя async-функция, где бы она ни встречалась (в том числе вложенная в синхронные обёртки). Самая внешняя async в каждой цепочке — это защищаемая единица; всё внутри неё, синхронное и асинхронное, компилируется в неё. Синхронные функции и обычные генераторы остаются необфусцированными.

function foo() {              // sync — left as-is
    function bar() {}         // sync — left as-is

    async function baz() {    // transformed
        // any code here, including calls to other async or sync functions
    }

    async function bark() {   // transformed
        // any code here, including calls to other async or sync functions
    }
}

Пропуски и предупреждения

Асинхронные генераторы также остаются необфусцированными, когда активен асинхронный геттер ключа, — асинхронный генератор должен возвращать свой итератор синхронно и не может ждать ключ. В режиме по умолчанию vmTargetFunctionsMode: 'root' пропуски происходят молча (выбор автоматический). В режиме 'comment' предупреждение выдаётся через ObfuscationResult.getWarnings(), когда явно помеченную вами функцию нельзя виртуализировать — она оказалась синхронной или это асинхронный генератор при асинхронном геттере ключа. Эти предупреждения (VMSyncFunctionSkippedInAsyncMode, VMAsyncGeneratorSkippedInAsyncMode) можно заглушить по типам через опцию warnings (v7.8.0+).

Требования

  • Асинхронный геттер ключа требует vmBytecodeArrayEncoding вместе с vmBytecodeArrayEncodingKeyGetter.
  • Версия обфускатора 7.3.0 или новее.

Пример

JavaScriptObfuscator.obfuscate(code, {
    vmObfuscation: true,
    vmAsyncExecutor: true,
    vmBytecodeArrayEncoding: true,
    vmBytecodeArrayEncodingKey: 'mySecretKey123',
    // the key getter may now return a Promise
    vmBytecodeArrayEncodingKeyGetter: 'fetch("/vm-key").then((res) => res.text())'
});