Dokümantasyon
/
VM Obfuscation
/

Register-Based VM

Register-Based VM

Pro
v7.12.0+

Daha hızlı çalışma ve varsayılandan farklı bir VM yapısı için VM'i yazmaç tabanlı bir yürütme modeline geçirin.

vmRegisterBased seçeneği, VM'i varsayılan yığın tabanlı bayt kodundan yazmaç tabanlı bir yürütme modeline geçirir. Bazı durumlarda bu, biraz daha büyük bir obfuscate edilmiş paket pahasına VM çalışma zamanı performansını yaklaşık %10-20 oranında artırır.

Bu seçeneği etkinleştirmek Stateful Opcodes (vmStatefulOpcodes) seçeneğini kapatır: ikisi uyumsuzdur, bu nedenle vmStatefulOpcodes açıksa yazmaç tabanlı derleme onu sessizce devre dışı bırakır.

Yığın tabanlı ve yazmaç tabanlı

Yığın tabanlı bir VM, işlenenleri örtük bir yığında tutar: her değer yığına itilir, bir sonraki komut tarafından tüketilir ve sonuç yığına geri itilir. Yazmaç tabanlı bir VM ise işlenenlerini doğrudan adresler; böylece aynı iş, aralarında itme/çekme trafiği olmadan daha az komutla ifade edilir. Çalışma zamanı kazancı buradan gelir; bayt kodunun biraz büyümesinin nedeni de budur, çünkü artık her komutun hangi yazmaçları okuyup yazdığını yığında örtük bırakmak yerine açıkça belirtmesi gerekir.

Hiçbir model, kodunuzun ne yaptığını veya VM'in neyi koruduğunu değiştirmez. İkisi, aynı sanallaştırılmış mantığın iki farklı kodlamasıdır; yazmaç tabanlı model yalnızca biraz boyuttan vazgeçerek biraz hız kazanır.

Ne zaman kullanılır

VM çalışma zamanı maliyeti önemli olduğunda başvurun. Sanallaştırılmış kod, tasarımı gereği düz JavaScript'ten daha yavaştır; bu nedenle sık çalışan bir kod yolunda (bir animasyon döngüsü, kare başına çalışan bir işleyici, sıkı bir ayrıştırma rutini) yazmaç tabanlı yürütücünün sağlayabileceği ~%10-20'lik tasarruf, daha büyük pakete değer. Nadiren çalışan kodda boyut maliyeti genellikle buna değmez. Kazanç koda bağlıdır; bu nedenle kendi sık çalışan kod yollarınızda ölçün.

VM'in yapısını da çeşitlendirir. Yapısal olarak farklı bir bayt kodu ve yürütücü ürettiği için çıktı, yaygın yığın tabanlı VM'den farklı bir parmak izi taşır. O yığın tabanlı yapıya göre ayarlanmış genel, kalıp tabanlı analizler yazmaç tabanlı bir derlemeyi daha zor tanır; bu da dağıttığınız VM'i varsayılandan uzaklaştırmanın bir yoludur.

Perde arkasında nasıl çalışır

Bu, yerel bir yazmaç tabanlı derleyici değildir. Normal yığın tabanlı derleyici, bayt kodunu seçenek olmadan nasıl üretiyorsa yine tam olarak öyle üretir; ardından ayrı bir dönüşüm aşaması bu bayt kodunu yazmaç tabanlı biçime yeniden yazar. Yazmaç tabanlı aşama bunların tümünün ardından geldiği için VM obfuscation'ın büyük kısmı (hedefleme, Bytecode Encoding, dispatcher seçenekleri) bundan etkilenmez (Stateful Opcodes hariç, yukarıya bakın).

Gereksinimler

  • vmObfuscation gerektirir; bu seçenek yalnızca vmObfuscation tarafından üretilen VM'i yeniden şekillendirir.
  • Obfuscator sürümü 7.12.0 veya üzeri.

Bu seçenek deneyseldir. Yazmaç tabanlı yeniden yazım, varsayılan yığın tabanlı yoldan daha yenidir ve sahada daha az sınanmıştır; bu nedenle yayınlamadan önce kodunuzun vmRegisterBased etkinken doğru çalıştığını test edin. Bu tavsiye her VM seçeneği için geçerlidir, ancak burada iki kat geçerlidir.

Örnek

JavaScript

Yazmaç tabanlı yürütme, VM obfuscation'ın geri kalanıyla birlikte kullanılabilir: Bytecode Encoding, Compact Dispatcher, VM Self Defending ve VM Domain Lock, varsayılan yığın tabanlı VM'de olduğu gibi aynen çalışır. Bayt kodunun nasıl yürütüldüğünü değiştirir, onu saran korumaları değil.