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

كيف تحوّل VM الكود

كيف تحوّل VM الكود

شاهد

Obfuscator.io: Targeting Functions in VM Obfuscation (IIFE and Comment Mode)

شاهد على YouTube

مع vmTargetFunctionsMode: 'root' (الافتراضي)، يحوّل تشويش VM جسم كل دالة على مستوى الجذر (أو، مع vmAsyncExecutor، كل دالة async خارجية) إلى بايت كود. تحتفظ الدوال على مستوى الجذر بأسمائها؛ أما الدوال المتداخلة فتُعاد تسميتها كالمعتاد. ولاختيار دوال بعينها على أي مستوى تداخل بدلًا من ذلك، استخدم وضع التعليقات.

JavaScript

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

يحمي تشويش VM أجسام الدوال، إضافةً إلى مُهيِّئات المتغيرات في المستوى الأعلى عندما يكون vmWrapTopLevelInitializers مفعّلًا (انظر أدناه). فإذا لم يحتوِ المُدخل على أي دالة ولا على مُهيِّئ من هذا النوع، كالكود الموجود على المستوى الأعلى وحده مثل alert(1);، فلن يُحوَّل شيء إلى الآلة الافتراضية: تستمر بقية مراحل التشويش في العمل، لكن دون تطبيق أي حماية VM، ويُصدر المشوِّش تحذير VMNoFunctionsToVirtualize (v7.14.1+؛ والإصدار 7.14.0 نفسه معطَّل). ويصدر أيضًا عندما توجد دوال لكن تُخطّيت كلها (على سبيل المثال، بسبب eval مباشر أو new Function ديناميكي، أو لأن vmTargetFunctions/vmExcludeFunctions لم يُبقيا شيئًا محددًا، أو عدم عثور vmAsyncExecutor على أي دالة async). غلّف الكود الذي تريد حمايته داخل دالة، كأن تستخدم IIFE مثلًا.

مُهيِّئات المستوى الأعلى

في وضع الجذر، يغلّف الخيار vmWrapTopLevelInitializers مُهيِّئات المتغيرات المؤهلة على المستوى الأعلى، مثل const MY_STRING = 'my-string';، داخل IIFE كي تنتقل قيمها إلى البايت كود بدلًا من أن تبقى ظاهرة بصورة JavaScript عادية. وتفعّله إعدادات VM المسبقة الحالية. يغطي هذا الخيار مُهيِّئات المتغيرات فقط دون غيرها من تعليمات المستوى الأعلى، ولا أثر له في وضع التعليقات. أما المُهيِّئات التي تبقى بصورة JavaScript عادية فتُسرد في تحذير VMTopLevelInitializerNotVirtualized.

إخفاء أسماء الدوال الحساسة

لأن وضع الجذر يُبقي الاسم، فإن اسمًا كاشفًا مثل validateLicense أو decryptData يبقى مقروءًا حتى بعد تحويل جسم الدالة إلى بايت كود. والحل هو نقل الدالة من المستوى الأعلى - بتغليفها داخل IIFE، حيث لا تعود على مستوى الجذر فتُحوَّل بالكامل إلى الآلة الافتراضية بما في ذلك اسمها - أو إعادة تسمية المعرِّفات على مستوى الجذر باستخدام renameGlobals. راجع إخفاء أسماء الدوال عن تحليل نماذج LLM للاطلاع على الأسلوبين ومزايا كل منهما وعيوبه.