Async Executor

Pro
v7.3.0+

Uruchamiaj VM asynchronicznie, aby klucz deszyfrujący kod bajtowy mógł być pobierany w czasie wykonania zamiast trafiać do paczki.

Opcja vmAsyncExecutor włącza asynchroniczny executor VM. Jej najważniejszą zaletą jest to, że vmBytecodeArrayEncodingKeyGetter może teraz zwracać obiekt Promise — jako asynchroniczny getter klucza — dzięki czemu klucz deszyfrujący może pochodzić z żądania sieciowego, z IndexedDB lub z dowolnego źródła asynchronicznego podczas ładowania, zamiast być dostępny synchronicznie w momencie pierwszego uruchomienia kodu.

Kompletną instrukcję pobierania klucza z backendu zawiera przepis Pobieranie klucza tablicy kodu bajtowego z backendu.

Kiedy jej używać

Zdecydowanie zalecana dla w pełni asynchronicznych baz kodu. W tym trybie wirtualizowane są wyłącznie funkcje async — funkcji synchronicznej nie da się uczynić asynchroniczną bez zamiany jej wartości zwracanej na Promise, co zepsułoby kod ją wywołujący — więc kod asynchroniczny na wskroś objęty zostaje ochroną w największym stopniu. Opcja działa również wtedy, gdy poziom główny jest synchroniczny (na przykład synchroniczne IIFE lub wrapper UMD): chronione są najbardziej zewnętrzne funkcje async znajdujące się w środku, a części synchroniczne pozostają bez zmian.

Co jest przekształcane

Każda najbardziej zewnętrzna funkcja async, niezależnie od tego, gdzie się pojawia (również zagnieżdżona w synchronicznych wrapperach). Najbardziej zewnętrzna funkcja async w każdym łańcuchu stanowi chronioną jednostkę — wszystko, co znajduje się w jej wnętrzu, synchroniczne i asynchroniczne, zostaje skompilowane razem z nią. Funkcje synchroniczne oraz zwykłe generatory pozostają niezobfuskowane.

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
    }
}

Pominięcia i ostrzeżenia

Generatory asynchroniczne również pozostają niezobfuskowane, gdy aktywny jest asynchroniczny getter klucza — generator asynchroniczny musi zwrócić swój iterator synchronicznie i nie może czekać na klucz. W domyślnym trybie vmTargetFunctionsMode: 'root' pominięcia są ciche (wybór odbywa się automatycznie). W trybie 'comment' ostrzeżenie zgłaszane jest przez ObfuscationResult.getWarnings() za każdym razem, gdy jawnie oznaczonej funkcji nie da się zwirtualizować — bo okazała się synchroniczna albo jest generatorem asynchronicznym przy asynchronicznym getterze klucza. Ostrzeżenia te (VMSyncFunctionSkippedInAsyncMode, VMAsyncGeneratorSkippedInAsyncMode) można wyciszać osobno dla każdego typu za pomocą opcji warnings (v7.8.0+).

Wymagania

  • Asynchroniczny getter klucza wymaga włączenia vmBytecodeArrayEncoding wraz z vmBytecodeArrayEncodingKeyGetter.
  • Obfuskator w wersji 7.3.0 lub nowszej.

Przykład

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())'
});