문서
/
VM 난독화
/

VM이 코드를 변환하는 방식

VM이 코드를 변환하는 방식

시청

Obfuscator.io: Targeting Functions in VM Obfuscation (IIFE and Comment Mode)

YouTube에서 보기

vmTargetFunctionsMode: 'root'(기본값)에서 VM 난독화는 각 루트 수준 함수(vmAsyncExecutor를 켜면 가장 바깥쪽의 각 async 함수)의 본문을 바이트코드로 변환합니다. 루트 수준 함수는 이름을 유지하고, 중첩된 함수는 평소처럼 이름이 바뀝니다. 대신 중첩 수준과 관계없이 개별 함수를 고르려면 comment 모드를 사용하세요.

JavaScript

이 설계는 전역 스코프에서 이 함수들을 호출하거나 전역 객체에 이 함수들이 있다고 기대하는 코드와의 호환성을 유지합니다. 함수 본문은 완전히 보호되지만 이름은 계속 보이며, 난독화 도구는 이런 이름을 나열하는 VMGlobalFunctionNamesNotRenamed 경고를 보고합니다.

VM 난독화는 함수 본문을 보호하며, vmWrapTopLevelInitializers가 켜져 있으면 최상위 변수 초기화 식도 보호합니다(아래 참고). 입력에 함수도 그런 초기화 식도 없으면(alert(1);처럼 최상위 코드만 있는 경우) 아무것도 가상화되지 않습니다. 나머지 난독화는 그대로 실행되지만 VM 보호는 적용되지 않으며, 난독화 도구는 VMNoFunctionsToVirtualize 경고를 보고합니다(v7.14.1+, 7.14.0 자체는 비활성화됨). 함수가 있지만 모두 제외된 경우(예를 들어 직접 eval이나 동적 new Function, vmTargetFunctions/vmExcludeFunctions로 인해 선택된 함수가 없는 경우, 또는 vmAsyncExecutor가 async 함수를 찾지 못한 경우)에도 이 경고가 발생합니다. 보호하려는 코드를 IIFE 같은 함수로 감싸세요.

최상위 초기화 식

root 모드에서 vmWrapTopLevelInitializers는 const MY_STRING = 'my-string'; 같은 대상이 될 수 있는 최상위 변수 초기화 식을 IIFE로 감싸, 그 값이 평범한 JavaScript로 드러나지 않고 바이트코드로 옮겨지게 합니다. 현재 VM 프리셋은 이 옵션을 켭니다. 이 옵션은 변수 초기화 식에만 적용되고 다른 최상위 문에는 적용되지 않으며, comment 모드에서는 효과가 없습니다. 평범한 JavaScript로 남는 초기화 식은 VMTopLevelInitializerNotVirtualized 경고에 나열됩니다.

민감한 함수 이름 숨기기

root 모드는 이름을 유지하므로, validateLicense나 decryptData처럼 의도를 드러내는 이름은 본문이 바이트코드가 된 뒤에도 읽을 수 있는 상태로 남습니다. 해결책은 함수를 최상위에서 옮기는 것입니다. IIFE로 감싸면 더 이상 루트 수준이 아니므로 이름까지 포함해 완전히 VM 변환됩니다. 또는 renameGlobals로 루트 수준 식별자의 이름을 바꿀 수 있습니다. 두 기법과 각각의 트레이드오프는 LLM 분석으로부터 함수 이름 숨기기를 참고하세요.