VM rejestrowa
Przełącz VM na rejestrowy model wykonania, aby uzyskać szybsze działanie i kształt VM inny niż domyślny.
Opcja vmRegisterBased przełącza VM z domyślnego stosowego kodu bajtowego na rejestrowy model wykonania. W niektórych przypadkach poprawia to wydajność działania VM o mniej więcej 15-20 %, kosztem nieco większego zobfuskowanego pakietu.
Stosowy a rejestrowy
VM stosowa trzyma operandy na niejawnym stosie: każda wartość jest odkładana, pobierana przez następną instrukcję, a wynik odkładany z powrotem. VM rejestrowa adresuje operandy bezpośrednio, dzięki czemu ta sama praca jest wyrażona w mniejszej liczbie instrukcji i bez ruchu push/pop między nimi. Stąd bierze się zysk wydajności — i również dlatego kod bajtowy nieco rośnie, ponieważ każda instrukcja musi teraz wskazać, które rejestry odczytuje i zapisuje, zamiast pozostawiać je niejawnie na stosie.
Żaden z modeli nie zmienia tego, co robi Twój kod ani co chroni VM. To dwa kodowania tej samej zwirtualizowanej logiki; model rejestrowy po prostu wymienia trochę rozmiaru na trochę szybkości.
Kiedy jej używać
Sięgnij po nią, gdy liczy się koszt działania VM. Zwirtualizowany kod jest z założenia wolniejszy niż zwykły JavaScript, więc na gorącej ścieżce — pętli animacji, procedurze obsługi na klatkę, ciasnej rutynie parsującej — ~15-20 %, które może zaoszczędzić rejestrowy moduł wykonawczy, jest warte większego pakietu. W kodzie uruchamianym rzadko koszt rozmiaru zwykle się nie opłaca.
Zmienia też kształt VM. Ponieważ generuje strukturalnie inny kod bajtowy i moduł wykonawczy, wynik nosi bardziej wyróżniający się odcisk niż domyślna VM stosowa. Jeśli chcesz, aby dostarczana VM mało przypominała powszechną stosową — tak by była mniej rozpoznawalna dla generycznej analizy opartej na wzorcach — to jeden ze sposobów, by ją zmienić.
Jak to działa pod spodem
To nie jest natywny kompilator rejestrowy. Zwykły kompilator stosowy nadal generuje kod bajtowy dokładnie tak, jak bez tej opcji; osobny etap transformacji przepisuje potem ten kod bajtowy do postaci rejestrowej. Praktyczny skutek jest taki, że cała reszta obfuskacji VM — targetowanie, kodowanie kodu bajtowego, opcje dyspozytora — zachowuje się tak samo, ponieważ tryb rejestrowy leży za tym wszystkim.
Wymagania
- Wymaga
vmObfuscation— ta opcja jedynie przekształca VM tworzoną przezvmObfuscation. - Wersja obfuskatora 7.12.0 lub nowsza.
Przykład
JavaScriptObfuscator.obfuscate(code, {
vmObfuscation: true,
vmRegisterBased: true
});
