Tài liệu
/
Làm rối VM
/

Hành vi của direct eval

Direct eval() vô hiệu hóa làm rối VM

Nếu một hàm chứa một lệnh gọi eval(code) trực tiếp ở bất kỳ đâu trong thân của nó (kể cả trong các hàm lồng nhau), thì toàn bộ hàm đó và tất cả các hàm lồng bên trong sẽ bị làm rối VM bỏ qua. Lý do là direct eval có quyền truy cập vào các biến cục bộ của hàm bao quanh, những biến vốn không còn khả dụng khi hàm được biên dịch thành bytecode của 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 ...

Cơ chế phát hiện bắt được direct eval (eval(code)eval?.(code)). Các dạng gián tiếp như (0, eval)(code)window.eval(code) chạy trong phạm vi toàn cục và không chặn làm rối VM.

Lối thoát (v6.14.0+): đặt vmForceCompileDynamicCode: true (hoặc bật công tắc Force Compile Dynamic Code trong nhóm Overrides của phần VM) để vẫn bytecode hóa hàm bao quanh và tắt cảnh báo VMDynamicCodeSkipped. Chỉ an toàn khi phần body được dựng lúc chạy không thể tham chiếu tới một định danh mà trình làm rối đổi tên; nếu không, mã sẽ ném ReferenceError khi chạy. Xem trang công thức để biết đầy đủ về sự đánh đổi.