VM dựa trên thanh ghi
Chuyển VM sang mô hình thực thi dựa trên thanh ghi để có runtime nhanh hơn và một hình dạng VM khác với mặc định.
Tùy chọn vmRegisterBased chuyển VM từ bytecode dựa trên ngăn xếp mặc định sang mô hình thực thi dựa trên thanh ghi. Trong một số trường hợp, điều này cải thiện hiệu năng chạy của VM khoảng 15-20 %, đổi lại là gói đã làm rối lớn hơn một chút.
Dựa trên ngăn xếp so với dựa trên thanh ghi
Một VM dựa trên ngăn xếp giữ các toán hạng trên một ngăn xếp ngầm định: mỗi giá trị được đẩy vào, được lệnh kế tiếp tiêu thụ, rồi kết quả được đẩy trở lại. Một VM dựa trên thanh ghi thì định địa chỉ toán hạng trực tiếp, nên cùng một công việc được diễn đạt bằng ít lệnh hơn và không có lưu lượng push/pop giữa chúng. Đó là nơi phần lợi về thời gian chạy đến từ — và cũng là lý do bytecode lớn lên đôi chút, vì mỗi lệnh giờ phải nêu rõ nó đọc và ghi thanh ghi nào thay vì để chúng ngầm định trên ngăn xếp.
Không mô hình nào thay đổi những gì mã của bạn làm hay những gì VM bảo vệ. Chúng là hai cách mã hóa cùng một logic đã ảo hóa; mô hình dựa trên thanh ghi chỉ đơn giản đánh đổi một chút kích thước lấy một chút tốc độ.
Khi nào nên dùng
Hãy dùng khi chi phí thực thi của VM quan trọng. Mã đã ảo hóa vốn chậm hơn JavaScript thường theo thiết kế, nên trên một đường nóng — vòng lặp hoạt ảnh, trình xử lý mỗi khung hình, một thủ tục phân tích cú pháp chặt chẽ — mức ~15-20 % mà bộ thực thi dựa trên thanh ghi có thể tiết kiệm là xứng đáng với gói lớn hơn. Với mã hiếm khi chạy, chi phí kích thước thường không đáng.
Nó cũng làm thay đổi hình dạng của VM. Vì phát ra bytecode và bộ thực thi khác biệt về cấu trúc, đầu ra mang một dấu vân tay riêng biệt hơn so với VM dựa trên ngăn xếp mặc định. Nếu bạn muốn VM được phân phối trông ít giống loại ngăn xếp phổ biến — để nó ít bị nhận diện bởi phân tích chung dựa trên mẫu — thì đây là một cách để thay đổi nó.
Cách hoạt động bên dưới
Đây không phải là một trình biên dịch thuần dựa trên thanh ghi. Trình biên dịch dựa trên ngăn xếp thông thường vẫn sinh ra bytecode y hệt như khi không bật tùy chọn; sau đó một giai đoạn biến đổi riêng viết lại bytecode ấy thành dạng dựa trên thanh ghi. Hệ quả thực tế là mọi thứ khác của VM obfuscation — nhắm hàm, mã hóa bytecode, các tùy chọn dispatcher — đều hoạt động như cũ, vì mô hình dựa trên thanh ghi nằm ở hạ nguồn của tất cả những điều đó.
Yêu cầu
- Yêu cầu
vmObfuscation— tùy chọn này chỉ định hình lại VM màvmObfuscationtạo ra. - Phiên bản obfuscator 7.12.0 trở lên.
Ví dụ
JavaScriptObfuscator.obfuscate(code, {
vmObfuscation: true,
vmRegisterBased: true
});
