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

Register-Based VM

Register-Based VM

Pro
v7.12.0+

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

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

يؤدي تفعيله إلى إيقاف Stateful Opcodes (vmStatefulOpcodes): فالاثنان غير متوافقين، لذا إذا كان vmStatefulOpcodes مفعَّلًا، فإن البناء القائم على السجلات يُسقطه بصمت.

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

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

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

متى تستخدمه

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

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

كيف يعمل من الداخل

هذا ليس مترجِمًا أصيلًا قائمًا على السجلات. فالمترجِم العادي القائم على المكدس لا يزال يولّد البايت كود تمامًا كما يفعل دون هذا الخيار، ثم تعيد مرحلة تحويل منفصلة كتابة ذلك البايت كود بصيغة قائمة على السجلات. ولأن التحويل القائم على السجلات يأتي بعد ذلك كله، فإن معظم جوانب تشويش VM، من الاستهداف إلى ترميز البايت كود إلى خيارات الموزِّع، لا تتأثر (باستثناء خيار Stateful Opcodes، انظر أعلاه).

المتطلبات

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

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

مثال

JavaScript

يتكامل التنفيذ القائم على السجلات مع بقية تشويش VM، فالخيارات Bytecode Encoding وCompact Dispatcher وVM Self Defending وVM Domain Lock تعمل كلها تمامًا كما تعمل مع الآلة الافتراضية القائمة على المكدس (النموذج الافتراضي). فهو يغيّر طريقة تنفيذ البايت كود، لا الحمايات التي تغلّفه.