
أداة تعمية لجافا سكريبت تعتمد على تقنيات تعمية التمييز التشفيري
هذا المشروع لا يحقق إخفاءً لا يمكن تمييزه. لا ينبغي لك استخدام هذا المنتج لحماية الأسرار. إنه موجود لردع الهندسة العكسية، وليس لمنعها
أداة إخفاء كود جافا سكريبت مصممة لجعل الكود شديد الصعوبة في القراءة والتحليل لكل من البشر ونماذج اللغات الضخمة. مكتوبة بلغة TypeScript. تطبق تقنيات من أبحاث إخفاء التشفير الخاضعة لمراجعة الأقران.
npm install
npm run build
# الاستخدام الأساسي
node dist/index.js input.js > output.js
# مع حصة الرموز المستهدفة (الافتراضي: 2,000,000)
node dist/index.js --target-tokens 500000 input.js > output.js
# إخفاء بسيط (مخرجات صغيرة)
node dist/index.js --target-tokens 10000 input.js > output.js
# تضخيم أقصى (10 ملايين رمز)
node dist/index.js --target-tokens 10000000 input.js > output.js
# استخدام متغير بيئة
INPUT_FILE=input.js node dist/index.js > output.js
# المساعدة
node dist/index.js --help
| الخيار | الافتراضي | الوصف |
|---|---|---|
--target-tokens <n> | 2000000 | حجم المخرجات المستهدفة بالرموز. يتم تضخيم المدخلات الصغيرة حتى هذا الحد. المدخلات الكبيرة تنتج تضخيمًا أقل للبقاء ضمن الميزانية. |
--help, -h | عرض رسالة المساعدة |
npm run build # تجميع TypeScript إلى dist/
npm run start # تشغيل أداة الإخفاء (تقرأ input.js)
npm run test # تشغيل مجموعة الاختبارات
npm run obfuscate-package # تشغيل اختبارات التوافق مع حزم npm
const { obfuscate } = require('./dist/obfuscator');
const code = 'function add(a, b) { return a + b; }';
const obfuscated = obfuscate(code);
// مع خيارات
const obfuscated = obfuscate(code, { targetTokens: 500000 });
يطبق أداة الإخفاء 20 تحويلاً عبر 4 مراحل. تبني كل مرحلة على المرحلة السابقة.
| الترتيب | التحويل | الملف | الوصف |
|---|---|---|---|
| 1 | مصائد إيقاف التصحيح | transforms/antiDebug.ts | يحقن عبارات eval("debugger") وحلقات setInterval من 10-20 بفترات زمنية من الأعداد الأولية (5 ثوانٍ - 600 ثانية) تكرر تشغيل نقاط التوقف الخاصة بتصحيح الأخطاء. كل مثيل يستخدم سلاسل مشفرة فريدة. |
| 2 | أسلاك الرحلات المثقوبة | transforms/tripwires.ts | يدمج فحوصات مخفية تقارن تجزئات المعلمات بقيم سرية. 5 أنماط تجزئة (بصمة bitwise، حساب نمطي، charCodeAt، تجزئة رقمية، typeof+length). تؤدي إلى إفساد الحالة الصامت، حلقات انتظار مزدحمة، أو رمي أخطاء عند المدخلات السرية. [ورقة 4] |
| 3 | حقن الضوضاء LPN | transforms/noiseInjection.ts | يضيف ويلغي ضوضاء عشوائية عبر مسارات منقسمة في الحسابات الحسابية. 6 أنماط: جمع/طرح، XOR، ضرب/قسمة، متغير مزدوج منقسم، سلسلة تجزئة محسوبة، إزاحة بتات. القيم الوسيطة لا معنى لها دون تتبع الإلغاء الكامل. [ورقة 7] |
| الترتيب | التحويل | الملف | الوصف |
|---|---|---|---|
| 4 | تسطيح تدفق التحكم | transforms/controlFlowFlattening.ts | يحول أجسام الدوال إلى آلات حالة while(true) { switch((_s * P) % M) { ... } } مع توزيع حساب نمطي — يتم ترميز قيم الحالات عبر (stateId * multiplier) % modulus باستخدام معلمات أولية عشوائية. [ورقة 3] |
| 5 | المسندات المعتمة | transforms/opaquePredicates.ts | يحقن شروط if التي تقيم دائمًا إلى true أو false ولكن يصعب إثباتها رياضيًا (مثل (x*x+x)%2===0). 15 صيغة مسند عبر فئات الحساب النمطي والبتي والفحص النوعي. |
| 6 | دوال بروكسي | transforms/proxyFunctions.ts | يوجه جميع استدعاءات الدوال عبر موزعين: _fc(fn, ...args) للاستدعاءات البسيطة، _mc(obj, prop, ...args) لاستدعاءات الطرق. يستخدم Function.prototype.apply الملتقطة في متغير محلي للمتانة. |
| 7 | استنفاد نافذة السياق | transforms/contextExhaustion.ts | يلف التعبيرات في تعبيرات ثلاثية متداخلة بعمق مع شروط معتمة، وسلاسل تعبير void، وحشو void شرطي. يجبر نماذج اللغات الضخمة على إهدار رموز نافذة السياق على الضوضاء. |
| 8 | دمج تعبيرات الفاصلة | transforms/commaExpressions.ts | يدمج عبارات التعبير المتعاقبة في تعبيرات فاصلة واحدة: a(); b(); return c() يصبح return a(), b(), c(). |
| الترتيب | التمرير | الملف | الوصف |
|-------|------|-------------|
| 9 | التمرير 1: الفهرسة | passes/firstPass.ts | يجتاز AST ويفهرس كل معرف، مبنيًا خريطة عمومية تعين لكل معرف اسم Unicode عشوائي من 6-16 حرفًا مأخوذًا من 16 نطاق كتابة (CJK، هانغول، يوناني، سيريلي، ديوناكري، تايلندي، عربي، كاتاكانا، إلخ). |
| 10 | التمرير 2: الاستبدال | passes/secondPass.ts | يستبدل جميع أسماء المعرفات بمكافئات Unicode المشفرة. يرمز وسيطات require() كـ String.fromCharCode(...). يرمز مصادر import/export الثابتة كحرفية سلسلة هاربة Unicode. يستبدل مراجع superClass للفئات، تعبيرات القوالب الحرفية، أنماط التدمير. |
| 11 | التمرير 3: المعاملات الوهمية | passes/thirdPass.ts | يحقن 0-15 معلمة غير مستخدمة عشوائية في كل تعريف دالة وتعبير. يتجاهل الدوال ذات المعاملات الباقية. يزيل جميع التعليقات. |
| الترتيب | التحويل | الملف | الوصف |
|---|---|---|---|
| 12 | ترميز المتغيرات العمومية | transforms/globalVariableEncoding.ts | يستبدل مراجع المتغيرات العمومية (المكتشفة ديناميكيًا من globalThis + حزمة window) بـ eval("Name<suffix>".replace(new RegExp("<suffix>$"), "")). كلا السلسلتين تتدفقان عبر مصفوفة السلسلة. |
| 13 | ترميز مفاتيح الخواص | transforms/propertyKeyEncoding.ts | يحول الوصول بالنقطة إلى وصول محسوب بسجلات لكل نطاق. الوصول عبر النطاقات يعمل لأن جميع اللواحق تحل إلى نفس اسم الخاصية في وقت التشغيل عبر .replace(). |
| 14 | ترميز الأرقام | transforms/numberEncoding.ts | 11 استراتيجية ترميز: إزاحة+جمع، هوية XOR، مكمل، قسمة، إزاحات متداخلة، NOT مزدوج، نمطي، إلخ. يتم إنشاء كل مثيل بشكل فريد. يتجاوز مفاتيح الخواص وقيم حالات التبديل. |
| 15 | التحقق من التكامل الذاتي | transforms/selfIntegrity.ts | يحقن 2-4 فحوصات وقت التشغيل: التحقق من الكود الأصلي eval، سلامة Function.prototype.toString، كشف شذوذ التوقيت، التحقق من هيكل الكود. استجابات مكافحة العبث: انتظار مزدحم، رمي خطأ، إفساد صامت. [ورقة 10] |
| 16 | استخراج مصفوفة السلسلة | transforms/stringArrayExtraction.ts | يجمع جميع السلاسل في مصفوفة واحدة مع فك تشفير XOR المتسلسل (مفتاح الإدخال N يعتمد على المحتوى المفكوك للإدخال N-1) وأنماط الأخطاء المتناثرة المعتمدة على الموضع (كل حرف يحصل على مفتاح XOR مختلف، مع أخطاء متناثرة مستوحاة من LPN في مواقع محددة). [الأوراق 2، 9] |
| 17 | نسخ وحدة التحكم | obfuscator.ts | يكتشف ديناميكيًا جميع طرق console ويجعل كل منها دالة لا تفعل شيئًا. |
| 18 | تصغير Terser | obfuscator.ts | يزيل المسافات البيضاء/التنسيق عبر terser (mangle: false, compress: false). يتراجع إلى إزالة تستند إلى regex إذا لم يستطع terser تحليل المخرجات. |
يتم حقن الكود الميت في نقاط متعددة باستراتيجيتين للتوليد:
| الاستراتيجية | المصدر | الوصف |
|---|---|---|
| قائمة على القالب | transforms/deadCodeInjection.ts | 9 أنواع قوالب: تجميع حلقة، بناء مصفوفة، معالجة كائن، تسلسل سلاسل، شروط متداخلة، try/catch، عد تنازلي while، تبديل محسوب، سلاسل بتية. القوالب تشير إلى متغيرات النطاق الحقيقية. |
| قائمة على الطفرة | transforms/deadCodeInjection.ts | يستنسخ عبارات حقيقية ويطفرها: يبدل المعاملات ضمن مجموعات التكافؤ، يزعج الثوابت، يعيد تسمية المعرفات. ينتج كودًا ميتًا متطابقًا هيكليًا مع AST مع الكود الحقيقي ولا يمكن تمييزه عنه بالهيكل وحده. [ورقة 3] |
نقاط حقن الكود الميت:
عدة تحويلات مستوحاة من أبحاث إخفاء التشفير الخاضعة لمراجعة الأقران: