Dokumentation
/
VM-Obfuskierung
/

Asynchroner Executor

Asynchroner Executor

Pro
v7.3.0+

Führen Sie die VM asynchron aus, damit der Schlüssel zur Bytecode-Entschlüsselung zur Laufzeit abgerufen werden kann, statt im Bundle mitgeliefert zu werden.

Die Option vmAsyncExecutor aktiviert den asynchronen VM-Executor. Ihr wichtigster Vorteil: vmBytecodeArrayEncodingKeyGetter darf nun ein Promise zurückgeben – ein asynchroner Key-Getter – sodass der Entschlüsselungsschlüssel beim Laden aus einer Netzwerkanfrage, aus IndexedDB oder aus einer beliebigen asynchronen Quelle stammen kann, statt bereits beim ersten Ausführen des Codes synchron vorliegen zu müssen.

Eine vollständige Anleitung zum Abruf des Schlüssels vom Backend finden Sie im Rezept Den Bytecode-Array-Schlüssel vom Backend abrufen.

Wann Sie die Option einsetzen sollten

Sehr zu empfehlen für vollständig asynchrone Codebasen. In diesem Modus werden nur async-Funktionen virtualisiert – eine synchrone Funktion lässt sich nicht asynchron machen, ohne ihren Rückgabewert in ein Promise zu verwandeln und damit ihre Aufrufer zu beschädigen –, weshalb durchgängig asynchroner Code die größte Abdeckung erhält. Die Option funktioniert auch dann, wenn die Wurzel synchron ist (etwa ein synchrones IIFE oder ein UMD-Wrapper): Die äußersten darin enthaltenen async-Funktionen werden geschützt, die synchronen Teile bleiben unverändert.

Was transformiert wird

Jede äußerste async-Funktion, wo immer sie auftritt (auch verschachtelt innerhalb synchroner Wrapper). Die äußerste async-Funktion jeder Kette ist die geschützte Einheit – alles darin, synchron wie asynchron, wird mit einkompiliert. Synchrone Funktionen und einfache Generatoren bleiben unobfuskiert.

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

Übersprungenes und Warnungen

Async-Generatoren bleiben ebenfalls unobfuskiert, wenn ein asynchroner Key-Getter aktiv ist – ein Async-Generator muss seinen Iterator synchron zurückgeben und kann nicht auf den Schlüssel warten. Im Standardmodus vmTargetFunctionsMode: 'root' erfolgen diese Auslassungen stillschweigend (die Auswahl geschieht automatisch). Im Modus 'comment' wird über ObfuscationResult.getWarnings() eine Warnung ausgegeben, sobald eine von Ihnen ausdrücklich markierte Funktion nicht virtualisiert werden kann – weil sie sich als synchron herausgestellt hat oder weil sie ein Async-Generator unter einem asynchronen Key-Getter ist. Diese Warnungen (VMSyncFunctionSkippedInAsyncMode, VMAsyncGeneratorSkippedInAsyncMode) lassen sich mit der Option warnings (v7.8.0+) pro Typ stummschalten.

Voraussetzungen

  • Der asynchrone Key-Getter erfordert vmBytecodeArrayEncoding zusammen mit einem vmBytecodeArrayEncodingKeyGetter.
  • Obfuscator-Version 7.3.0 oder neuer.

Beispiel

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