Dokumentasi
/
Obfuskasi VM
/

VM berbasis register

VM berbasis register

Pro
v7.12.0+

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

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

Berbasis stack vs berbasis register

VM berbasis stack menyimpan operand pada stack implisit: setiap nilai didorong, dikonsumsi oleh instruksi berikutnya, lalu hasilnya didorong kembali. VM berbasis register justru mengalamati operand-nya secara langsung, sehingga pekerjaan yang sama dinyatakan dalam lebih sedikit instruksi tanpa lalu lintas push/pop di antaranya. Dari sanalah keuntungan runtime berasal — dan juga alasan bytecode tumbuh sedikit, karena setiap instruksi kini harus menyebutkan register mana yang dibacanya dan ditulisnya alih-alih membiarkannya implisit di stack.

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

Kapan menggunakannya

Gunakan ketika biaya eksekusi VM penting. Kode tervirtualisasi memang lebih lambat daripada JavaScript biasa secara desain, jadi pada jalur panas — loop animasi, handler per frame, rutin parsing yang ketat — ~15-20 % yang dapat dihemat eksekutor berbasis register sepadan dengan bundel yang lebih besar. Pada kode yang jarang berjalan, biaya ukuran biasanya tidak sepadan.

Ini juga memvariasikan bentuk VM. Karena memancarkan bytecode dan eksekutor yang berbeda secara struktural, keluarannya membawa sidik jari yang lebih khas dibandingkan VM berbasis stack default. Jika Anda ingin VM yang dikirim tampak berbeda dari yang berbasis stack umum — agar kurang dikenali oleh analisis generik berbasis pola — ini adalah salah satu cara mengubahnya.

Cara kerjanya di balik layar

Ini bukan kompiler berbasis register yang sesungguhnya. Kompiler berbasis stack seperti biasa tetap menghasilkan bytecode persis seperti tanpa opsi ini; sebuah tahap transformasi terpisah kemudian menulis ulang bytecode itu menjadi bentuk berbasis register. Konsekuensi praktisnya, segala hal lain dari obfuskasi VM — penargetan, pengodean bytecode, opsi dispatcher — berperilaku sama, karena mode berbasis register berada di hilir semuanya.

Persyaratan

  • Membutuhkan vmObfuscation — opsi ini hanya membentuk ulang VM yang dihasilkan vmObfuscation.
  • Versi obfuscator 7.12.0 atau lebih baru.

Contoh

JavaScriptObfuscator.obfuscate(code, {
    vmObfuscation: true,
    vmRegisterBased: true
});