Cara VM Mentransformasi Kode
Tonton
Obfuscator.io: Targeting Functions in VM Obfuscation (IIFE and Comment Mode)
Dengan vmTargetFunctionsMode: 'root' (bawaan), obfuskasi VM mengubah isi setiap fungsi tingkat root (atau, dengan vmAsyncExecutor, setiap fungsi async terluar) menjadi bytecode. Fungsi tingkat root mempertahankan namanya; fungsi bersarang diganti namanya seperti biasa. Untuk memilih fungsi satu per satu di tingkat bersarang mana pun, gunakan mode komentar.
Desain ini menjaga kompatibilitas dengan kode yang memanggil fungsi-fungsi tersebut dari cakupan global atau mengharapkannya ada di objek global. Isi fungsi terlindungi sepenuhnya, tetapi namanya tetap terlihat, dan obfuscator melaporkan peringatan VMGlobalFunctionNamesNotRenamed yang mencantumkan nama-nama tersebut.
Obfuskasi VM melindungi isi fungsi, ditambah inisialisasi variabel tingkat atas ketika vmWrapTopLevelInitializers aktif (lihat di bawah). Jika masukan tidak memiliki fungsi maupun inisialisasi semacam itu - kode yang hanya berada di tingkat atas seperti alert(1); - tidak ada yang divirtualisasi: obfuskasi lainnya tetap berjalan, tetapi tidak ada proteksi VM yang diterapkan, dan obfuscator melaporkan peringatan VMNoFunctionsToVirtualize (v7.14.1+; 7.14.0 sendiri dinonaktifkan). Peringatan ini juga muncul ketika fungsi ada tetapi semuanya dilewati (misalnya, eval langsung atau new Function dinamis, vmTargetFunctions/vmExcludeFunctions yang tidak menyisakan fungsi terpilih, atau vmAsyncExecutor tidak menemukan fungsi async). Bungkus kode yang ingin Anda lindungi di dalam sebuah fungsi, misalnya IIFE.
Inisialisasi tingkat atas
Dalam mode root, vmWrapTopLevelInitializers membungkus inisialisasi variabel tingkat atas yang memenuhi syarat seperti const MY_STRING = 'my-string'; di dalam IIFE sehingga nilainya berpindah ke bytecode alih-alih tetap terlihat sebagai JavaScript biasa. Preset VM saat ini mengaktifkannya. Opsi ini hanya mencakup inisialisasi variabel, bukan pernyataan tingkat atas lainnya, dan tidak berpengaruh dalam mode komentar. Inisialisasi yang tetap berupa JavaScript biasa dicantumkan dalam peringatan VMTopLevelInitializerNotVirtualized.
Menyembunyikan nama fungsi yang sensitif
Karena mode root mempertahankan nama, nama yang mengungkapkan maksud seperti validateLicense atau decryptData tetap terbaca meskipun isinya sudah menjadi bytecode. Solusinya adalah memindahkan fungsi tersebut dari tingkat atas - bungkus dalam IIFE, sehingga fungsi itu tidak lagi berada di tingkat root dan ditransformasi VM sepenuhnya, termasuk namanya - atau mengganti nama pengenal tingkat root dengan renameGlobals. Lihat Menyembunyikan Nama Fungsi dari Analisis LLM untuk kedua teknik tersebut beserta konsekuensinya.
