Dokumentasi
/
Obfuskasi VM
/

Perilaku Direct eval

Direct eval() Menonaktifkan Obfuskasi VM

Jika sebuah fungsi berisi panggilan direct eval(code) di mana pun di dalam isinya (termasuk di fungsi bersarang), fungsi tersebut dilewati oleh obfuskasi VM dan obfuscator melaporkan peringatan VMDynamicCodeSkipped (yang menyebut nama fungsi tersebut jika fungsinya memiliki nama). Dalam mode root (bawaan), seluruh fungsi beserta semua fungsi bersarangnya dilewati; dalam mode komentar, fungsi bersarang yang Anda tandai secara terpisah tetap divirtualisasi kecuali fungsi itu sendiri berisi eval. Direct eval dengan argumen yang tidak statis juga mengeluarkan peringatan DynamicCodeRenameRisk. Hal ini karena direct eval memiliki akses ke variabel lokal fungsi yang melingkupinya, dan variabel tersebut tidak tersedia ketika fungsi dikompilasi menjadi bytecode VM.

Penting untuk kode yang dibungkus IIFE. Jika sebuah IIFE tingkat atas berisi direct eval di mana pun di dalamnya, seluruh IIFE (termasuk semua kode Anda) tidak akan diobfuskasi VM.

JavaScript

Membuka bungkus IIFE memiliki konsekuensi: begitu fungsi-fungsi Anda berada di tingkat atas, hanya fungsi yang bermasalah yang dilewati, tetapi fungsi-fungsi lainnya kini berada di tingkat root, sehingga obfuskasi VM mempertahankan namanya. Lihat Menyembunyikan Nama Fungsi dari Analisis LLM untuk cara menjauhkan nama-nama tersebut dari keluaran.

Bentuk tidak langsung seperti (0, eval)(code) dan window.eval(code) tidak menghalangi obfuskasi VM. eval?.(code) adalah pengecualian: JavaScript menjalankannya sebagai indirect eval, tetapi obfuscator secara konservatif memperlakukannya sebagai direct eval dan melewati fungsi tersebut.

Konstruktor Function (new Function(body) / Function(body)) diperlakukan dengan cara yang sama ketika argumen isinya bersifat dinamis. Fungsi yang berisi panggilan new Function(...) dinamis juga dilewati, dengan peringatan VMDynamicCodeSkipped. Seperti pada direct eval dinamis, obfuscator menambahkan peringatan DynamicCodeRenameRisk, karena isi yang dibangun saat runtime mungkin merujuk ke pengenal yang diganti nama. Panggilan yang sepenuhnya statis seperti new Function('a', 'b', 'return a + b') tidak dilewati.

Indirect eval dan konstruktor Function dieksekusi dalam cakupan global. Keduanya tidak dapat membaca variabel lokal pemanggil, tetapi tetap bisa gagal jika merujuk ke global yang telah diganti nama atau dihapus. Isi statis yang hanya memakai parameternya sendiri, seperti new Function('a', 'b', 'return a + b'), menghindari ketergantungan tersebut. Tinjau peringatan dan uji bundel akhir; mengubah sintaks eval saja tidak membuat kode dinamis sembarang menjadi aman.

Jalan keluar (v6.14.0+): setel vmForceCompileDynamicCode: true (atau aktifkan sakelar Force Compile Dynamic Code di grup Penimpaan pada bagian VM) untuk tetap mengubah fungsi di sekitarnya menjadi bytecode dan membisukan VMDynamicCodeSkipped. Opsi ini tidak dapat memperbaiki cakupan: di dalam fungsi yang dikompilasi paksa, eval langsung tidak dapat membaca atau menulis variabel lokal fungsi tersebut, parameternya, maupun variabel dari fungsi pembungkus yang divirtualisasi, bahkan ketika kodenya berupa literal string. Gunakan opsi ini hanya ketika kode yang dievaluasi tidak merujuk ke apa pun selain global. DynamicCodeRenameRisk tetap muncul meskipun opsi ini aktif, karena risiko penggantian nama yang dijelaskannya tidak bergantung pada dilewatinya VM.

Lihat Obfuskasi VM dengan eval dan new Function untuk matriks lengkap, bentuk peringatan, dan solusinya.