Cách VM biến đổi mã
Xem
Obfuscator.io: Targeting Functions in VM Obfuscation (IIFE and Comment Mode)
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 (hoặc, khi có vmAsyncExecutor, mỗi hàm async ngoài cùng) thành bytecode. Các hàm cấp gốc giữ nguyên tên; các hàm lồng bên trong vẫn được đổi tên như thường lệ. Để chọn từng hàm riêng lẻ ở bất kỳ cấp lồng nào, hãy dùng chế độ comment.
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 có mặt 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 hàm vẫn hiển thị, và trình làm rối báo cảnh báo VMGlobalFunctionNamesNotRenamed liệt kê các tên như vậy.
Làm rối VM bảo vệ thân hàm, cùng với các bộ khởi tạo biến cấp cao nhất khi vmWrapTopLevelInitializers được bật (xem bên dưới). Nếu đầu vào không có hàm nào và cũng không có bộ khởi tạo như vậy, tức là mã chỉ ở cấp cao nhất như alert(1);, thì không có gì được ảo hóa: phần còn lại của quá trình làm rối vẫn chạy, nhưng không có bảo vệ VM nào được áp dụng, và trình làm rối báo cảnh báo VMNoFunctionsToVirtualize (v7.14.1+; bản 7.14.0 đã bị vô hiệu hóa). Cảnh báo này cũng xuất hiện khi có hàm nhưng tất cả đều bị bỏ qua (ví dụ direct eval hoặc một new Function động, vmTargetFunctions/vmExcludeFunctions không để lại hàm nào được chọn, hoặc vmAsyncExecutor không tìm thấy hàm async nào). Hãy bọc mã bạn muốn bảo vệ trong một hàm, chẳng hạn một IIFE.
Bộ khởi tạo cấp cao nhất
Ở chế độ root, vmWrapTopLevelInitializers bọc các bộ khởi tạo biến cấp cao nhất đủ điều kiện, như const MY_STRING = 'my-string';, trong các IIFE để giá trị của chúng chuyển vào bytecode thay vì lộ ra dưới dạng JavaScript thuần. Các preset VM hiện tại đều bật tùy chọn này. Nó chỉ áp dụng cho bộ khởi tạo biến, không áp dụng cho các câu lệnh cấp cao nhất khác, và không có tác dụng ở chế độ comment. Các bộ khởi tạo vẫn ở dạng JavaScript thuần được liệt kê trong cảnh báo VMTopLevelInitializerNotVirtualized.
Ẩn tên hàm nhạy cảm
Vì chế độ root giữ nguyên tên, một tên để lộ ý nghĩa như validateLicense hay decryptData vẫn đọc được ngay cả khi thân hàm đã trở thành bytecode. Cách khắc phục là đưa hàm ra khỏi cấp cao nhất - bọc nó trong một IIFE, nơi nó không còn ở cấp gốc và được VM biến đổi hoàn toàn, kể cả tên - hoặc đổi tên các định danh cấp gốc bằng renameGlobals. Xem Ẩn tên hàm khỏi phân tích của LLM để biết cả hai kỹ thuật và các đánh đổi của chúng.
