Dokumentasi
/
Obfuskasi VM
/

Register-Based VM

Register-Based VM

Pro
v7.12.0+

Alihkan VM ke model eksekusi berbasis register untuk runtime yang lebih cepat dan bentuk VM yang berbeda dari bawaan.

Opsi vmRegisterBased mengalihkan VM dari bytecode berbasis stack bawaannya ke model eksekusi berbasis register. Dalam beberapa kasus, ini meningkatkan performa runtime VM sekitar 10-20%, dengan biaya bundel hasil obfuskasi yang sedikit lebih besar.

Mengaktifkannya akan mematikan Stateful Opcodes (vmStatefulOpcodes): keduanya tidak kompatibel, sehingga jika vmStatefulOpcodes sebelumnya aktif, build berbasis register membuangnya secara diam-diam.

Berbasis stack vs berbasis register

VM berbasis stack menyimpan operan pada stack implisit: setiap nilai didorong ke stack, dikonsumsi oleh instruksi berikutnya, lalu hasilnya didorong kembali. VM berbasis register justru mengalamatkan operannya secara langsung, sehingga pekerjaan yang sama dinyatakan dengan lebih sedikit instruksi tanpa lalu lintas push/pop di antaranya. Dari situlah peningkatan runtime berasal - dan juga alasan bytecode sedikit membesar, karena setiap instruksi kini harus menyebutkan secara eksplisit register mana yang dibaca dan ditulisnya alih-alih membiarkannya implisit di stack.

Tidak satu pun dari kedua model ini mengubah apa yang dilakukan kode Anda atau apa yang dilindungi VM. Keduanya adalah dua enkoding dari logika tervirtualisasi yang sama; berbasis register hanya menukar sedikit ukuran dengan sedikit kecepatan.

Kapan menggunakannya

Gunakan saat biaya runtime VM penting. Kode tervirtualisasi memang lebih lambat daripada JavaScript biasa, sehingga pada jalur yang sering dieksekusi - loop animasi, handler per frame, rutin parsing yang ketat - penghematan ~10-20% dari executor berbasis register sepadan dengan bundel yang lebih besar. Pada kode yang jarang dijalankan, biaya ukurannya biasanya tidak sepadan. Peningkatannya bergantung pada kode, jadi ukurlah pada jalur yang sering dieksekusi di kode Anda sendiri.

Opsi ini juga memvariasikan bentuk VM. Karena menghasilkan bytecode dan executor yang berbeda secara struktural, keluarannya membawa sidik jari yang berbeda dari VM berbasis stack yang umum. Analisis generik berbasis pola yang disetel untuk bentuk berbasis stack tersebut lebih sulit mengenali build berbasis register, jadi ini adalah salah satu cara untuk menjauhkan VM yang dikirim dari bentuk bawaan.

Cara kerjanya di balik layar

Ini bukan compiler berbasis register native. Compiler berbasis stack biasa tetap menghasilkan bytecode persis seperti tanpa opsi ini; tahap transformasi terpisah kemudian menulis ulang bytecode tersebut ke bentuk berbasis register. Karena berbasis register berada di hilir semua itu, sebagian besar obfuskasi VM - penargetan, Bytecode Encoding, opsi dispatcher - tidak terpengaruh (kecuali Stateful Opcodes, lihat di atas).

Persyaratan

  • Memerlukan vmObfuscation - opsi ini hanya membentuk ulang VM yang dihasilkan oleh vmObfuscation.
  • Obfuscator versi 7.12.0 atau lebih baru.

Opsi ini bersifat eksperimental. Penulisan ulang berbasis register lebih baru dan belum seteruji jalur berbasis stack bawaan, jadi uji bahwa kode Anda berjalan dengan benar dengan vmRegisterBased aktif sebelum mengirimkannya - saran yang sama berlaku untuk opsi VM mana pun, tetapi di sini dua kali lebih penting.

Contoh

JavaScript

Eksekusi berbasis register dapat digabungkan dengan bagian lain obfuskasi VM - Bytecode Encoding, Compact Dispatcher, VM Self Defending, dan VM Domain Lock semuanya berfungsi persis seperti pada VM berbasis stack bawaan. Opsi ini mengubah cara bytecode dieksekusi, bukan proteksi apa yang membungkusnya.