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

Async Executor

Async Executor

Pro
v7.3.0+

Chạy VM bất đồng bộ để khóa giải mã bytecode có thể được lấy về khi chạy thay vì đóng gói sẵn trong bundle.

Tùy chọn vmAsyncExecutor bật bộ thực thi VM bất đồng bộ. Lợi ích nổi bật của nó là vmBytecodeArrayEncodingKeyGetter giờ đây có thể trả về một Promise — một key getter bất đồng bộ — nhờ đó khóa giải mã có thể đến từ một yêu cầu mạng, IndexedDB, hoặc bất kỳ nguồn bất đồng bộ nào tại thời điểm nạp, thay vì phải có sẵn một cách đồng bộ khi mã chạy lần đầu.

Để xem hướng dẫn đầy đủ về việc lấy khóa từ backend, hãy xem công thức Lấy khóa mảng bytecode từ backend.

Khi nào nên dùng

Rất được khuyến nghị cho các cơ sở mã bất đồng bộ hoàn toàn. Ở chế độ này, chỉ các hàm async được ảo hóa — một hàm đồng bộ không thể trở thành bất đồng bộ mà không biến giá trị trả về của nó thành một Promise và làm hỏng những nơi gọi nó — nên mã async xuyên suốt sẽ được bảo vệ nhiều nhất. Nó vẫn hoạt động khi gốc là đồng bộ (ví dụ một IIFE đồng bộ hoặc lớp bọc UMD): các hàm async ngoài cùng bên trong được bảo vệ, còn các phần đồng bộ được giữ nguyên.

Những gì được biến đổi

Mọi hàm async ngoài cùng, bất kể xuất hiện ở đâu (kể cả khi lồng bên trong các lớp bọc đồng bộ). Hàm async ngoài cùng trong mỗi chuỗi là đơn vị được bảo vệ — mọi thứ bên trong nó, cả đồng bộ lẫn bất đồng bộ, đều được biên dịch vào. Các hàm đồng bộ và generator thường được giữ nguyên, không làm rối.

function foo() {              // sync — left as-is
    function bar() {}         // sync — left as-is

    async function baz() {    // transformed
        // any code here, including calls to other async or sync functions
    }

    async function bark() {   // transformed
        // any code here, including calls to other async or sync functions
    }
}

Bỏ qua và cảnh báo

Các async generator cũng được giữ nguyên, không làm rối, khi một key getter bất đồng bộ đang hoạt động — một async generator phải trả về iterator của nó một cách đồng bộ và không thể chờ khóa. Ở chế độ mặc định vmTargetFunctionsMode: 'root', việc bỏ qua diễn ra âm thầm (việc chọn lựa là tự động). Ở chế độ 'comment', một cảnh báo được phát ra qua ObfuscationResult.getWarnings() mỗi khi một hàm bạn đánh dấu tường minh không thể được ảo hóa — hóa ra nó là đồng bộ, hoặc nó là một async generator dưới một key getter bất đồng bộ. Các cảnh báo này (VMSyncFunctionSkippedInAsyncMode, VMAsyncGeneratorSkippedInAsyncMode) có thể được tắt theo từng loại thông qua tùy chọn warnings (v7.8.0+).

Yêu cầu

  • Key getter bất đồng bộ yêu cầu vmBytecodeArrayEncoding cùng với một vmBytecodeArrayEncodingKeyGetter.
  • Phiên bản obfuscator 7.3.0 trở lên.

Ví dụ

JavaScriptObfuscator.obfuscate(code, {
    vmObfuscation: true,
    vmAsyncExecutor: true,
    vmBytecodeArrayEncoding: true,
    vmBytecodeArrayEncodingKey: 'mySecretKey123',
    // the key getter may now return a Promise
    vmBytecodeArrayEncodingKeyGetter: 'fetch("/vm-key").then((res) => res.text())'
});