문서
/
VM 난독화
/

Register-Based VM

Register-Based VM

Pro
v7.12.0+

VM을 레지스터 기반 실행 모델로 전환해 런타임을 빠르게 하고, 기본값과 다른 형태의 VM을 만듭니다.

vmRegisterBased 옵션은 VM을 기본 스택 기반 바이트코드에서 레지스터 기반 실행 모델로 전환합니다. 경우에 따라 VM 런타임 성능이 대략 10~20% 향상되며, 그 대가로 난독화된 번들이 약간 커집니다.

이 옵션을 켜면 Stateful Opcodes(vmStatefulOpcodes)가 꺼집니다. 두 옵션은 호환되지 않으므로, vmStatefulOpcodes가 켜져 있었다면 레지스터 기반 빌드에서는 조용히 제외됩니다.

스택 기반과 레지스터 기반

스택 기반 VM은 피연산자를 암묵적인 스택에 둡니다. 각 값은 스택에 push되고, 다음 명령어가 이를 소비한 뒤, 결과가 다시 push됩니다. 레지스터 기반 VM은 피연산자를 직접 지정하므로, 같은 작업을 명령어 사이의 push/pop 없이 더 적은 명령어로 표현합니다. 런타임 이득은 바로 여기서 나옵니다. 바이트코드가 약간 커지는 이유도 같습니다. 이제 모든 명령어가 읽고 쓰는 레지스터를 스택에 암묵적으로 맡기지 않고 명시해야 하기 때문입니다.

어느 모델도 코드가 하는 일이나 VM이 보호하는 대상을 바꾸지 않습니다. 둘은 같은 가상화 로직을 서로 다르게 인코딩한 것일 뿐이며, 레지스터 기반은 크기를 조금 내주고 속도를 조금 얻습니다.

언제 사용하나요

VM 런타임 비용이 중요할 때 사용하세요. 가상화된 코드는 설계상 평범한 JavaScript보다 느립니다. 따라서 애니메이션 루프, 프레임마다 실행되는 핸들러, 촘촘한 파싱 루틴처럼 자주 실행되는 경로에서는 레지스터 기반 실행기가 줄여 주는 약 10~20%가 번들 크기 증가를 감수할 만한 가치가 있습니다. 드물게 실행되는 코드에서는 크기 비용이 대개 그만한 가치가 없습니다. 이득은 코드에 따라 다르므로 자신의 자주 실행되는 경로에서 측정하세요.

VM의 형태도 달라집니다. 구조적으로 다른 바이트코드와 실행기를 내보내므로, 출력물은 흔한 스택 기반 VM과 다른 핑거프린트를 갖습니다. 그 스택 기반 형태에 맞춰진 패턴 기반의 일반적인 분석은 레지스터 기반 빌드를 알아보기 더 어려우므로, 이 옵션은 배포하는 VM을 기본값에서 멀어지게 하는 방법 중 하나입니다.

내부 동작 방식

이것은 네이티브 레지스터 기반 컴파일러가 아닙니다. 일반 스택 기반 컴파일러는 이 옵션이 없을 때와 똑같이 바이트코드를 생성하고, 그다음 별도의 변환 단계가 그 바이트코드를 레지스터 기반 형태로 다시 작성합니다. 레지스터 기반 변환은 그 모든 단계의 뒤에 위치하므로, 대상 지정, Bytecode Encoding, 디스패처 옵션 등 VM 난독화의 대부분은 영향을 받지 않습니다(Stateful Opcodes는 예외이며, 위 내용을 참고하세요).

요구 사항

  • vmObfuscation이 필요합니다. 이 옵션은 vmObfuscation이 만든 VM의 형태만 바꿉니다.
  • 난독화 도구 버전 7.12.0 이상이 필요합니다.

이 옵션은 실험적 기능입니다. 레지스터 기반 재작성은 기본 스택 기반 경로보다 새롭고 실전 검증이 덜 되었으므로, 배포하기 전에 vmRegisterBased를 켠 상태에서 코드가 올바르게 실행되는지 테스트하세요. 모든 VM 옵션에 해당하는 조언이지만, 여기서는 특히 중요합니다.

예시

JavaScript

레지스터 기반 실행은 VM 난독화의 나머지 기능과 함께 사용할 수 있습니다. Bytecode Encoding, Compact Dispatcher, VM Self Defending, VM Domain Lock 모두 기본 스택 기반 VM에서와 똑같이 동작합니다. 바뀌는 것은 바이트코드가 실행되는 방식이며, 이를 감싸는 보호 기능은 바뀌지 않습니다.