Direct eval() Menonaktifkan Obfuskasi VM
Jika sebuah fungsi mengandung pemanggilan eval(code) langsung di mana pun di dalam tubuhnya (termasuk pada fungsi bersarang), maka seluruh fungsi beserta semua fungsi bersarangnya akan dilewati oleh obfuskasi VM. Ini karena direct eval memiliki akses ke variabel lokal fungsi pembungkusnya, yang tidak tersedia ketika fungsi dikompilasi menjadi bytecode 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 ...
Deteksi menangkap direct eval (eval(code) dan eval?.(code)). Bentuk tidak langsung seperti (0, eval)(code) dan window.eval(code) berjalan pada scope global dan tidak memblokir obfuskasi VM.
Jalan keluar (v6.14.0+): setel vmForceCompileDynamicCode: true (atau aktifkan sakelar Force Compile Dynamic Code di bawah grup Overrides pada bagian VM) untuk tetap membytecode fungsi pembungkusnya dan menekan VMDynamicCodeSkipped. Hanya aman ketika body yang dibangun saat runtime tidak dapat merujuk pengenal yang diganti namanya oleh obfuscator; jika tidak, kode akan melempar ReferenceError saat runtime. Lihat halaman resepnya untuk konsekuensinya secara lengkap.
