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 outputSposób 2: zmiana nazw zmiennych globalnych i kodowanie (stosować ostrożnie)
Należy włączyć
renameGlobals: true,vmBytecodeEncoding: trueorazvmBytecodeArrayEncoding: true. Powoduje to zmianę nazw identyfikatorów najwyższego poziomu i ich zaszyfrowanie w kodzie bajtowym.
