Dokumentacja
/
Obfuskacja VM
/

Jak VM przekształca kod

Jak VM przekształca kod

Przy ustawieniu vmTargetFunctionsMode: 'root' (domyślnym) obfuskacja VM przekształca w kod bajtowy ciało każdej funkcji najwyższego poziomu (w zależności od vmObfuscationThreshold), pozostawiając nazwę funkcji bez zmian.

// Input
function fibonacci(n) {
    if (n <= 1) return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

// Output - function NAME is preserved, BODY is VM-transformed
function fibonacci(b) {  // name kept as-is
    return vm.call(...); // body converted to bytecode
}

Takie rozwiązanie zachowuje zgodność z kodem, który wywołuje te funkcje z zasięgu globalnego lub oczekuje ich na obiekcie globalnym. Ciało funkcji jest w pełni chronione, ale jej nazwa pozostaje widoczna.

Ukrywanie nazw wrażliwych funkcji:

Jeśli nazwa funkcji zdradza, co robi kod (np. validateLicense, decryptData), należy zastosować jedno z poniższych podejść:

  • Sposób 1: opakowanie w IIFE (zalecane)

    Wrażliwe funkcje należy umieścić wewnątrz IIFE lub ciała dowolnej innej funkcji. Funkcje zagnieżdżone w innych funkcjach nie są funkcjami najwyższego poziomu, więc zostają w pełni przekształcone przez VM, łącznie z ich nazwami.

    // Wrap sensitive code in IIFE
    (function() {
        function fibonacci(n) {
            if (n <= 1) return n;
            return fibonacci(n - 1) + fibonacci(n - 2);
        }
        // Use fibonacci here...
    })();
    // "fibonacci" name is completely hidden in output
  • Sposób 2: zmiana nazw zmiennych globalnych i kodowanie (stosować ostrożnie)

    Należy włączyć renameGlobals: true, vmBytecodeEncoding: true oraz vmBytecodeArrayEncoding: true. Powoduje to zmianę nazw identyfikatorów najwyższego poziomu i ich zaszyfrowanie w kodzie bajtowym.