Async Executor
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.
Ansehen
Obfuscator.io Async Executor: Async Bytecode Key Getter and Async-Only VM Virtualization
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 unter Schlüssel für Bytecode Array Encoding auslagern.
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 werden nicht virtualisiert (die übrige Obfuskierung wird weiterhin angewendet).
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 werden nicht virtualisiert (die übrige Obfuskierung wird auf sie dennoch angewendet).
Übersprungenes und Warnungen
Async-Generatoren werden ebenfalls nicht virtualisiert, 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), es sei denn, es wird überhaupt nichts virtualisiert; dann wird VMNoFunctionsToVirtualize gemeldet. Im Modus 'comment' wird eine Warnung gemeldet (im Dashboard und im Array warnings der API-Antwort), 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.
Im Root-Modus lässt vmAsyncExecutor Variableninitialisierer auf oberster Ebene als einfaches JavaScript stehen, auch wenn vmWrapTopLevelInitializers aktiviert ist, und (v7.8.0+) eine Warnung VMTopLevelInitializerNotVirtualized listet sie auf.
Voraussetzungen
- Der asynchrone Key-Getter erfordert
vmBytecodeArrayEncoding, undvmBytecodeArrayEncodingKeyGettermuss mitvmBytecodeArrayEncodingKeykombiniert werden. Der Obfuscator prüft, dass beide gesetzt sind (oder beide fehlen) und dass sich der Getter als Ausdruck parsen lässt, und lehnt den Build andernfalls ab. - Obfuscator-Version 7.3.0 oder neuer.
Die Option allein zu aktivieren stellt lediglich den Executor auf den asynchronen Modus um (es werden nur die äußersten async-Funktionen virtualisiert). Erst wenn der Key-Getter ein Promise zurückgibt, wird der Schlüsselabruf zur Laufzeit freigeschaltet, und dafür sind zusätzlich Bytecode Array Encoding samt Key-Getter erforderlich. Ob der Getter ein Promise zurückgibt, lässt sich beim Build nicht prüfen: Ein Getter, der ein Promise zurückgibt, schlägt bei ausgeschaltetem vmAsyncExecutor zur Laufzeit fehl, weil der Decoder das Promise statt des Schlüssels erhält.
Beispiel
In einer vollständig synchronen Codebasis wird nahezu nichts virtualisiert, da nur async-Funktionen infrage kommen. Sind Ihre Einstiegspunkte nicht async, verwenden Sie besser einen synchronen Key-Getter und lassen vmAsyncExecutor ausgeschaltet.
