
أداة تعمية لجافا سكريبت تعتمد على تقنيات تعمية التمييز التشفيري
هذا المشروع لا يحقق إخفاءً لا يمكن تمييزه. لا ينبغي لك استخدام هذا المنتج لحماية الأسرار. إنه موجود لردع الهندسة العكسية، وليس لمنعها
أداة إخفاء كود جافا سكريبت مصممة لجعل الكود شديد الصعوبة في القراءة والتحليل لكل من البشر ونماذج اللغات الضخمة. مكتوبة بلغة 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] |
نقاط حقن الكود الميت:
عدة تحويلات مستوحاة من أبحاث إخفاء التشفير الخاضعة لمراجعة الأقران:
| الورقة | المؤلفون | التقنية المطبقة |
|---|---|---|
| [الورقة 1] حول إمكانية/استحالة إخفاء البرامج | Barak، Goldreich، Impagliazzo، Rudich، Sahai، Vadhan، Yang | حالات اختبار دالة غير قابلة للإخفاء — أداة تحقق تختبر ما إذا كانت الأسرار تبقى بعد الإخفاء |
| [الورقة 2] iO المرشح والتشفير الوظيفي لجميع الدوائر | Garg، Gentry، Halevi، Raykova، Sahai، Waters | فك تشفير السلسلة المتسلسل — عشوائية على طريقة Kilian حيث يعتمد مفتاح كل إدخال على السلسلة المفكوكة السابقة |
| [الورقة 3] iO من فرضية حذف المجموعة الفرعية متعددة الخطوط | Gentry، Lewko، Sahai، Waters | كود ميت قائم على الطفرة (متطابق هيكليًا مع الكود الحقيقي)؛ انتقالات الحالة الحسابية النمطية في CFF |
| [الورقة 4] كيفية استخدام iO: التشفير المنكر، والمزيد | Sahai، Waters | أسلاك الرحلات المثقوبة — فحوصات مخفية تُفعل عند المدخلات السرية |
| [الورقة 7] iO من افتراضات راسخة | Jain، Lin، Sahai | حقن ضوضاء مستوحى من LPN في الحسابات الرقمية |
| [الورقة 9] iO من الخرائط ثنائية الخطوط ومتغيرات LPN | Ragavan، Vafa، Vaikuntanathan | ترميز XOR متناثر مع أنماط خطأ معتمدة على الموضع |
| [الورقة 10] iO لدوائر الكم الفارغة والتطبيقات | Bartusek، Malavolta | اختبار الدائرة الفارغة للتحقق من جودة الكود الميت؛ التحقق من التكامل الذاتي (وضع مزدوج) |
أداتا تحقق تقيس جودة الإخفاء، موجودتان في src/verification/:
verification/nullCircuitTest.ts)يخفي دالة حقيقية ودالة "فارغة" (نفس الشكل، لا تفعل شيئًا)، ثم يقارن 14 مقياسًا هيكليًا لتسجيل مدى إمكانية تمييزهما. تشابه أعلى = إخفاء أفضل.
import { runNullCircuitTest } from './verification/nullCircuitTest';
const result = runNullCircuitTest(realCode, paramCount, stmtCount, threshold, targetTokens);
console.log('Similarity:', result.similarity); // 0.0-1.0
verification/unobfuscatableTests.ts)7 حالات اختبار من براهين استحالة الورقة 1 تحاول استخراج الأسرار من الكود المخفي:
import { runAllTests, printSummary } from './verification/unobfuscatableTests';
console.log(printSummary(runAllTests(10000)));
الاختبارات: دالة النقطة (كلمة مرور)، الأرقام السحرية، سلاسل الكناري، المفاتيح المضمنة، عناوين URL، أنماط regex، توقيعات تدفق التحكم.
يتحكم الخيار --target-tokens في حجم المخرجات عبر ميزانية تضخيم تضبط حقن الكود الميت (الرافع الأساسي للحجم). التحويلات المتحكمة بالميزانية:
| نسبة الميزانية | التحويلات المفعلة |
|---|---|
| > 3 | مكافحة التصحيح، أسلاك الرحلات، CFF، المسندات المعتمة، دمج الفاصلة |
| > 5 | دوال البروكسي، ترميز مفاتيح الخواص، حقن الضوضاء، التكامل الذاتي |
| > 8 | استنفاد نافذة السياق |
| > 10 | ترميز المتغيرات العمومية |
يتدرج مضاعف الكود الميت من 1x (نسبة 30) إلى 150x (نسبة 1500+)، متحكمًا في عدد وحجم حالات التبديل الميتة وفروع المسندات المعتمة.
src/
index.ts نقطة الدخول لواجهة سطر الأوامر
obfuscator.ts المنسق الرئيسي لخط الأنابيب (20 تحويلاً)
options.ts نظام الميزانية والخيارات
types.ts تعريفات أنواع AST
random.ts توليد أسماء Unicode عشوائية (6-16 حرفًا، 16 نطاق كتابة)
ast.ts دوال مصنع عقد AST
keywords.ts اكتشاف الكلمات الرئيسية الديناميكي (globalThis + حزمة window)
globals.ts إدارة الحالة العمومية (خرائط النموذج الفارغ)
substitute.ts أدوات استبدال المعرفات
declarations.d.ts إعلانات أنواع الوحدات
passes/
firstPass.ts فهرسة المعرفات
secondPass.ts استبدال المعرفات + ترميز السلاسل
thirdPass.ts حقن المعاملات الوهمية
transforms/
antiDebug.ts مصائد eval("debugger") + حلقات setInterval
tripwires.ts فحوصات المدخلات السرية للبرامج المثقوبة [الورقة 4]
noiseInjection.ts ضوضاء حسابية مستوحاة من LPN [الورقة 7]
controlFlowFlattening.ts توزيع while/switch + حساب نمطي [الورقة 3]
opaquePredicates.ts 15 مسندًا رياضيًا دائمي الصواب/الخطأ
proxyFunctions.ts موزعات تسطيح رسم الاستدعاء
contextExhaustion.ts ضوضاء ثلاثية/void لملء سياق LLM
commaExpressions.ts دمج العبارات عبر عامل الفاصلة
globalVariableEncoding.ts eval+replace للمتغيرات العمومية
propertyKeyEncoding.ts وصول خاصية محسوب بسجلات لكل نطاق
numberEncoding.ts 11 استراتيجية ترميز bitwise/حسابي
selfIntegrity.ts فحوصات وقت تشغيل مضادة للعبث [الورقة 10]
stringArrayExtraction.ts XOR متسلسل + أخطاء موضعية متناثرة [الأوراق 2، 9]
deadCodeInjection.ts كود ميت قائم على القالب والطفرة [الورقة 3]
verification/
nullCircuitTest.ts تسجيل جودة الكود الميت [الورقة 10]
unobfuscatableTests.ts حالات اختبار استخراج الأسرار [الورقة 1]
__tests__/ 300+ اختبار وحدة عبر 21 مجموعة
tools/
obfuscate-package.ts اختبار توافق حزم npm باستخدام webpack
tests/
input*.js ملفات اختبار الإدخال الأصلية
# تشغيل جميع الاختبارات
npm test
# تشغيل مجموعة اختبار محددة
npx jest controlFlowFlattening
npx jest tripwires
npx jest noiseInjection
# اختبار ضد حزم npm (يستنسخ المستودعات، يبنى باستخدام webpack، يخفي، يشغل الاختبارات)
npm run obfuscate-package # جميع الحزم العشرة
npm run obfuscate-package -- minimist semver # حزم محددة
تختبر أداة tools/obfuscate-package.ts أداة الإخفاء ضد حزم npm حقيقية:
| المسار | المحتويات |
|---|---|
dist/obfuscated/<package>/bundle.js | حزمة webpack المخفية لكل حزمة |
dist/obfuscated/report.json | تقرير JSON كامل بأحجام الحزم، حالة الإخفاء، مخرجات الاختبار |
MIT - حقوق النشر 2026 Nicholas Starke