직접 eval() 호출은 VM 난독화를 비활성화합니다
함수 본문 어딘가에(중첩된 함수 내부를 포함해) 직접 eval(code) 호출이 있으면, 해당 함수 전체와 그 안의 모든 중첩 함수가 VM 난독화에서 제외됩니다. 직접 eval은 자신을 감싸는 함수의 지역 변수에 접근할 수 있는데, 함수를 VM 바이트코드로 컴파일하면 그 지역 변수를 사용할 수 없기 때문입니다.
// ❌ Entire IIFE is NOT VM-obfuscated because of direct eval inside
(function () {
function loadConfig() {
eval(decodedLoader); // direct eval - blocks VM for the whole IIFE
}
// ... all your code ...
})();
// ✅ Use indirect eval - runs in global scope, does not block VM
(function () {
function loadConfig() {
(0, eval)(decodedLoader); // indirect eval - VM obfuscates the IIFE
}
// ... all your code ...
})();
// ✅ Or unwrap the IIFE - each top-level function is checked independently
function loadConfig() {
eval(decodedLoader); // only this function is skipped
}
// ... other top-level functions are still VM-obfuscated ...
탐지 대상은 직접 eval(eval(code) 및 eval?.(code))입니다. (0, eval)(code)나 window.eval(code) 같은 간접 형태는 전역 스코프에서 실행되므로 VM 난독화를 차단하지 않습니다.
예외 처리 수단 (v6.14.0+): vmForceCompileDynamicCode: true로 설정하면(또는 VM 섹션의 Overrides 그룹에서 Force Compile Dynamic Code 스위치를 켜면) 감싸는 함수를 그래도 바이트코드로 변환하고 VMDynamicCodeSkipped를 억제합니다. 이는 런타임에 만들어지는 본문이 난독화 도구가 이름을 바꾸는 식별자를 참조할 수 없는 경우에만 안전하며, 그렇지 않으면 런타임에 ReferenceError가 발생합니다. 자세한 장단점은 레시피 페이지를 참고하세요.
