Dokumentation
/
VM-Obfuskierung
/

Wie die VM Code transformiert

Wie die VM Code transformiert

Ansehen

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

Auf YouTube ansehen

Mit vmTargetFunctionsMode: 'root' (Standard) wandelt die VM-Obfuskierung den Rumpf jeder Funktion auf oberster Ebene (oder, mit vmAsyncExecutor, jeder äußersten async-Funktion) in Bytecode um. Funktionen auf oberster Ebene behalten ihre Namen; verschachtelte werden wie üblich umbenannt. Um stattdessen einzelne Funktionen auf beliebiger Verschachtelungsebene auszuwählen, verwenden Sie den Kommentarmodus.

JavaScript

Dieses Design bleibt kompatibel mit Code, der diese Funktionen aus dem globalen Gültigkeitsbereich aufruft oder sie auf dem globalen Objekt erwartet. Der Funktionsrumpf ist vollständig geschützt, der Name bleibt jedoch sichtbar, und der Obfuscator meldet eine VMGlobalFunctionNamesNotRenamed-Warnung mit einer Liste solcher Namen.

Die VM-Obfuskierung schützt Funktionsrümpfe sowie, wenn vmWrapTopLevelInitializers aktiviert ist, Variableninitialisierer auf oberster Ebene (siehe unten). Enthält die Eingabe weder eine Funktion noch einen solchen Initialisierer, etwa reinen Code auf oberster Ebene wie alert(1);, wird nichts virtualisiert: Die übrige Obfuskierung läuft weiterhin, es wird aber kein VM-Schutz angewendet, und der Obfuscator meldet eine VMNoFunctionsToVirtualize-Warnung (v7.14.1+; 7.14.0 selbst ist deaktiviert). Sie wird auch ausgelöst, wenn zwar Funktionen vorhanden sind, aber jede davon übersprungen wurde (zum Beispiel direktes eval oder ein dynamisches new Function, vmTargetFunctions/vmExcludeFunctions, die nichts ausgewählt lassen, oder vmAsyncExecutor, der keine async-Funktion findet). Umschließen Sie den zu schützenden Code mit einer Funktion, zum Beispiel einer IIFE.

Initialisierer auf oberster Ebene

Im Root-Modus umschließt vmWrapTopLevelInitializers geeignete Variableninitialisierer auf oberster Ebene wie const MY_STRING = 'my-string'; mit IIFEs, sodass ihre Werte in den Bytecode wandern, statt als einfaches JavaScript sichtbar zu bleiben. Die aktuellen VM-Voreinstellungen aktivieren dies. Es betrifft nur Variableninitialisierer, keine anderen Anweisungen auf oberster Ebene, und hat im Kommentarmodus keine Wirkung. Initialisierer, die einfaches JavaScript bleiben, werden in einer VMTopLevelInitializerNotVirtualized-Warnung aufgeführt.

Sensible Funktionsnamen verbergen

Da der Root-Modus den Namen beibehält, bleibt ein verräterischer Name wie validateLicense oder decryptData lesbar, auch nachdem sein Rumpf zu Bytecode geworden ist. Die Lösung besteht darin, die Funktion von der obersten Ebene zu entfernen - sie in eine IIFE einzubetten, wo sie nicht mehr auf oberster Ebene liegt und vollständig VM-transformiert wird, einschließlich ihres Namens - oder Bezeichner auf oberster Ebene mit renameGlobals umzubenennen. Beide Techniken und ihre Nachteile beschreibt Funktionsnamen vor der LLM-Analyse verbergen.