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

Cách VM biến đổi mã

Cách VM biến đổi mã

Với vmTargetFunctionsMode: 'root' (mặc định), làm rối VM biến đổi thân của mỗi hàm ở cấp gốc thành bytecode (tùy thuộc vào vmObfuscationThreshold), nhưng giữ nguyên tên hàm.

// Input
function fibonacci(n) {
    if (n <= 1) return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

// Output - function NAME is preserved, BODY is VM-transformed
function fibonacci(b) {  // name kept as-is
    return vm.call(...); // body converted to bytecode
}

Thiết kế này duy trì khả năng tương thích với mã gọi các hàm này từ phạm vi toàn cục hoặc mong đợi chúng nằm trên đối tượng toàn cục. Thân hàm được bảo vệ hoàn toàn, nhưng tên vẫn hiển thị.

Ẩn các tên hàm nhạy cảm:

Nếu tên hàm để lộ chức năng của mã (ví dụ validateLicense, decryptData), hãy dùng một trong các cách sau:

  • Cách 1: Bọc trong một IIFE (Khuyến nghị)

    Đặt các hàm nhạy cảm bên trong một IIFE hoặc thân của bất kỳ hàm nào khác. Các hàm nằm trong hàm khác không ở cấp gốc, nên chúng được biến đổi VM hoàn toàn, bao gồm cả tên của chúng.

    // Wrap sensitive code in IIFE
    (function() {
        function fibonacci(n) {
            if (n <= 1) return n;
            return fibonacci(n - 1) + fibonacci(n - 2);
        }
        // Use fibonacci here...
    })();
    // "fibonacci" name is completely hidden in output
  • Cách 2: Đổi tên biến toàn cục + mã hóa (Dùng thận trọng)

    Bật renameGlobals: true, vmBytecodeEncoding: true, và vmBytecodeArrayEncoding: true. Cách này đổi tên các định danh ở cấp gốc và mã hóa chúng trong bytecode.