التوثيق
/
تشويش VM
/

VM قائمة على السجلات

VM قائمة على السجلات

Pro
v7.12.0+

حوّل الآلة الافتراضية إلى نموذج تنفيذ قائم على السجلات للحصول على تشغيل أسرع وشكل VM يختلف عن الافتراضي.

يحوّل الخيار vmRegisterBased الآلة الافتراضية من البايت كود القائم على المكدس الافتراضي إلى نموذج تنفيذ قائم على السجلات. في بعض الحالات يحسّن هذا أداء تشغيل الآلة الافتراضية بنحو 15-20 %، مقابل حزمة مشوَّشة أكبر قليلاً.

القائم على المكدس مقابل القائم على السجلات

تحتفظ الآلة الافتراضية القائمة على المكدس بالمعاملات على مكدس ضمني: يُدفَع كل قيمة، وتستهلكها التعليمة التالية، ثم يُدفَع الناتج من جديد. أما الآلة القائمة على السجلات فتُعنوِن معاملاتها مباشرة، فيُعبَّر عن العمل نفسه بعدد أقل من التعليمات ودون حركة دفع/سحب بينها. من هنا يأتي كسب زمن التشغيل — ولهذا أيضًا يكبر البايت كود قليلاً، إذ صار على كل تعليمة أن تنص على السجلات التي تقرؤها وتكتب فيها بدلاً من تركها ضمنية على المكدس.

لا يغيّر أي من النموذجين ما يفعله كودك ولا ما تحميه الآلة الافتراضية. إنهما ترميزان لنفس المنطق المُوَرْثَن؛ والنموذج القائم على السجلات ببساطة يبادل قليلاً من الحجم بقليل من السرعة.

متى تستخدمه

استعن به حين تهمّ كلفة تشغيل الآلة الافتراضية. فالكود المُوَرْثَن أبطأ من JavaScript العادي بحكم التصميم، لذا على مسار ساخن — حلقة رسوم متحركة، معالِج لكل إطار، روتين تحليل نصّي متضامّ — تستحق نسبة ~15-20 % التي يمكن أن يوفّرها المنفّذ القائم على السجلات الحزمةَ الأكبر. أما في الكود الذي يعمل نادرًا فغالبًا لا تستحق كلفة الحجم العناء.

كما أنه يُنوّع شكل الآلة الافتراضية. ولأنه يُخرج بايت كود ومنفّذًا مختلفين بنيويًا، يحمل الناتج بصمة أكثر تفرّدًا من الآلة الافتراضية القائمة على المكدس الافتراضية. فإن أردت أن تبدو الآلة المُسلَّمة قليلة الشبه بالنوع الشائع القائم على المكدس — كي تكون أقل قابلية للتعرّف عليها بالتحليل العام القائم على الأنماط — فهذه إحدى وسائل تغييرها.

كيف يعمل في الخفاء

هذا ليس مصرّفًا أصليًا قائمًا على السجلات. فالمصرّف المعتاد القائم على المكدس ما يزال يولّد البايت كود تمامًا كما لو لم يكن الخيار مفعّلًا؛ ثم تعيد مرحلة تحويل منفصلة كتابة ذلك البايت كود في صورة قائمة على السجلات. والنتيجة العملية أن كل ما تبقّى من تشويش الآلة الافتراضية — الاستهداف وترميز البايت كود وخيارات المُوزِّع — يتصرّف كما هو، لأن النمط القائم على السجلات يقع خلف كل ذلك في مجرى المعالجة.

المتطلبات

  • يتطلّب vmObfuscation — هذا الخيار يعيد تشكيل الآلة الافتراضية التي يُنتجها vmObfuscation فحسب.
  • إصدار المشوِّش 7.12.0 أو أحدث.

مثال

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