레지스터 기반 VM
더 빠른 런타임과 기본과 다른 VM 형태를 위해 VM을 레지스터 기반 실행 모델로 전환하세요.
vmRegisterBased 옵션은 VM을 기본값인 스택 기반 바이트코드에서 레지스터 기반 실행 모델로 전환합니다. 경우에 따라 VM의 런타임 성능이 약 15~20 % 향상되지만, 그 대가로 난독화된 번들이 약간 커집니다.
스택 기반 대 레지스터 기반
스택 기반 VM은 피연산자를 암묵적 스택에 유지합니다. 각 값이 푸시되고, 다음 명령이 소비하며, 결과가 다시 푸시됩니다. 레지스터 기반 VM은 대신 피연산자를 직접 주소 지정하므로, 같은 작업이 더 적은 명령으로, 그리고 그 사이의 푸시/팝 트래픽 없이 표현됩니다. 런타임 이득은 여기서 나옵니다. 또한 이것이 바이트코드가 약간 커지는 이유이기도 한데, 이제 각 명령이 피연산자를 스택에 암묵적으로 남겨 두는 대신 어떤 레지스터를 읽고 쓰는지 명시해야 하기 때문입니다.
두 모델 모두 당신의 코드가 하는 일이나 VM이 보호하는 대상을 바꾸지 않습니다. 둘은 동일한 가상화 로직의 두 가지 인코딩이며, 레지스터 기반은 그저 약간의 크기를 약간의 속도와 맞바꿀 뿐입니다.
언제 사용하는가
VM의 런타임 비용이 중요할 때 사용하세요. 가상화된 코드는 설계상 일반 JavaScript보다 느리므로, 핫 패스 — 애니메이션 루프, 프레임당 핸들러, 빡빡한 파싱 루틴 — 에서는 레지스터 기반 실행기가 절약할 수 있는 1520 %가 더 큰 번들만큼의 값어치를 합니다. 드물게 실행되는 코드에서는 크기 비용이 대개 그만한 가치가 없습니다.
VM의 형태도 달라지게 합니다. 구조적으로 다른 바이트코드와 실행기를 생성하므로, 출력은 기본 스택 기반 VM보다 더 독특한 핑거프린트를 띱니다. 배포되는 VM이 흔한 스택 기반과 별로 닮지 않기를 — 그래서 일반적인 패턴 기반 분석에 덜 알아보이기를 — 원한다면, 이것이 그것을 바꾸는 한 가지 방법입니다.
내부에서 작동하는 방식
이것은 네이티브 레지스터 기반 컴파일러가 아닙니다. 바이트코드는 옵션이 없을 때와 똑같이 여전히 일반적인 스택 기반 컴파일러가 생성하며, 그 후 별도의 변환 단계가 그 바이트코드를 레지스터 기반 형태로 다시 작성합니다. 실질적인 결과로, VM 난독화의 나머지 모든 것 — 타깃팅, 바이트코드 인코딩, 디스패처 옵션 — 은 동일하게 동작합니다. 레지스터 기반 모드가 그 모든 것의 하류에 자리하기 때문입니다.
요구 사항
vmObfuscation가 필요합니다 — 이 옵션은vmObfuscation이 생성하는 VM을 다시 형태화할 뿐입니다.- Obfuscator 버전 7.12.0 이상.
예시
JavaScriptObfuscator.obfuscate(code, {
vmObfuscation: true,
vmRegisterBased: true
});
