Dokümantasyon
/
VM Obfuscation
/

Yazmaç tabanlı VM

Yazmaç tabanlı VM

Pro
v7.12.0+

Daha hızlı çalışma zamanı ve varsayılandan farklı bir VM biçimi için VM’yi yazmaç tabanlı bir yürütme modeline geçirin.

vmRegisterBased seçeneği, VM’yi varsayılan yığın tabanlı bayt kodundan yazmaç tabanlı bir yürütme modeline geçirir. Bazı durumlarda bu, VM’nin çalışma zamanı performansını yaklaşık %15-20 iyileştirir; bedeli ise biraz daha büyük bir obfuscate edilmiş pakettir.

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

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

İki model de kodunuzun ne yaptığını ya da VM’nin neyi koruduğunu değiştirmez. Bunlar aynı sanallaştırılmış mantığın iki kodlamasıdır; yazmaç tabanlı model yalnızca biraz boyutu biraz hıza takas eder.

Ne zaman kullanmalı

VM’nin çalışma zamanı maliyeti önemliyse buna başvurun. Sanallaştırılmış kod, tasarımı gereği düz JavaScript’ten daha yavaştır; bu yüzden sıcak bir yolda — bir animasyon döngüsü, kare başına bir işleyici, sıkı bir ayrıştırma rutini — yazmaç tabanlı yürütücünün kazandırabileceği ~%15-20 daha büyük paketi hak eder. Nadiren çalışan kodda ise boyut maliyeti genellikle buna değmez.

Ayrıca VM’nin biçimini de değiştirir. Yapısal olarak farklı bir bayt kodu ve yürütücü ürettiği için çıktı, varsayılan yığın tabanlı VM’ye kıyasla daha kendine özgü bir parmak izi taşır. Teslim edilen VM’nin yaygın yığın tabanlı olana pek benzememesini istiyorsanız — genel, örüntü tabanlı analizlerce daha az tanınır olması için — bu, onu değiştirmenin bir yoludur.

Arka planda nasıl çalışır

Bu, yerel bir yazmaç tabanlı derleyici değildir. Bayt kodunu, seçenek olmadan olduğu gibi yine olağan yığın tabanlı derleyici üretir; ardından ayrı bir dönüşüm aşaması bu bayt kodunu yazmaç tabanlı biçime yeniden yazar. Pratik sonuç şudur: VM obfuscation’ının geri kalan her şeyi — hedefleme, bayt kodu kodlama, dispatcher seçenekleri — aynı şekilde davranır, çünkü yazmaç tabanlı model tüm bunların aşağısında yer alır.

Gereksinimler

  • vmObfuscation gerektirir — bu seçenek yalnızca vmObfuscation’ın ürettiği VM’yi yeniden biçimlendirir.
  • Obfuscator sürümü 7.12.0 veya üstü.

Örnek

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