Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
px-vm — مجموعة أدوات الهندسة العكسية لـ PerimeterX's bytecode VM، تشتمل على CFG-based disassembler وخط فك تشفير من 5 طبقات وإعادة بناء جدول opcode ومنظف stack emulation cleaner لأبحاث الأمان حول بصمة كشف البوتات. | Kitploit
أدوات/GitHubGitHub/b9ph0met/px-vm
التحليل الديناميكي (عزل)التهرب من IDS/IPSالهندسة العكسيةأمن الويبتحليل البرمجيات الخبيثةالتشفيرتحليل الملفات الثنائيةالأوراق والأبحاثالتعلم والتعليممكافحة الروبوتاتانتحال البصمة الرقمية
551426منذ 5 أشهرتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
GitHub
b9ph0met/px-vm

px-vm

مجموعة أدوات الهندسة العكسية لـ PerimeterX's bytecode VM، تشتمل على CFG-based disassembler وخط فك تشفير من 5 طبقات وإعادة بناء جدول opcode ومنظف stack emulation cleaner لأبحاث الأمان حول بصمة كشف البوتات.

عرض المستودع
مشاركة

تحليل جهاز PerimeterX الافتراضي (VM)

ملخص

يوثق هذا المستودع الهندسة العكسية لـ auditor.js من PerimeterX، وهي آلة افتراضية تعمل بالبايت كود تُستخدم كطبقة ثانية لأخذ البصمات في خط كشف البوتات الخاص بـ PX. يغطي هذا التحليل ما يلي:

  • استخراج البايت كود وسلسلة فك التشفير المكونة من 5 طبقات
  • إعادة بناء جدول الأوبكود (107 أساسي + 40 عسل + 24 حشو + 16 مجموعة تعليمات فائقة)
  • فك تشفير مجمع الثوابت (1230 مدخلاً، 1095 سلسلة مشفرة)
  • مفكك شفرة يعتمد على CFG مع حل التوزيع الفرعي للتعليمات الفائقة
  • منظف محاكاة المكدس ينتج شبه كود قابل للقراءة
  • تقنيات مضادة للتحليل: أوبكود عسل، تعليمات متداخلة، تجزئة تكامل الشيفرة

ملاحظة: يغطي هذا المستودع نسخة واحدة (ثابتة) فقط من الآلة الافتراضية وهو مخصص لأغراض البحث الأمني والتحليل. لا يتضمن حلولاً ديناميكية أو تطبيقات حلول إنتاجية.

خلفية

يوم الخميس 2 أبريل 2026، نشرت PerimeterX آلة افتراضية جديدة بالبايت كود كجزء من خط كشف البوتات الخاص بها.

ما بداخل الملف

لا يبدو auditor.js مثل سكريبت مستشعر PX العادي. بدلاً من عمليات البحث عن الخصائص المبهمة ووظائف الجمع المعتادة:

  • 8 سلاسل base64 ضخمة (_fg0 إلى _fg7)، برنامج الآلة الافتراضية المشفر مقسم عبر المتغيرات
  • دالة فك تشفير XOR (_dp) بمفتاح خاص بالموقع (_pk) تقوم بفك ضغط برنامج JSON
  • خلط Fisher-Yates يقوم بتبديل جدول الأوبكود بحيث تختلف قيم البايت كود لكل بناء
  • حلقة توزيع تحتوي على 107+ معالج حالة، مفسر الآلة الافتراضية
  • حساب BigInt لتشفير RSA لمخرجات البصمة
  • تجزئة تكامل الشيفرة (_0x8df7) تقوم بتجزئة مصدر الآلة الافتراضية لاشتقاق مفتاح فك التشفير، لذا أي تعديل يكسر فك تشفير البايت كود بصمت

الخطوة 1: استخراج البايت كود

برنامج الآلة الافتراضية مقسم عبر 8 متغيرات، يتم دمجها ثم فك تشفيرها عبر _dp() باستخدام تشفير XOR خاص بالموقع مفتاحه _pk:

var _pk = 893686289;
function _dp(_b) {
    var _r = atob(_b), _o = new Array(_r.length);
    for (var _i = 0; _i < _r.length; _i++) {
        _o[_i] = String.fromCharCode(
            _r.charCodeAt(_i) ^ (((_pk >>> (8 * (_i % 4))) ^ Math.imul(_i + 1, 0x6B8B4567)) & 0xFF)
        );
    }
    return _o.join("");
}

النتيجة هي كائن JSON بأسماء مفاتيح مبهمة مكونة من حرفين (مثل "uo" للبذرة، "dk" للـ nonce). جدول تعيين يحولها إلى أسماء قياسية.

node extractor.js
# -> program.json

هيكل البرنامج

الحقلالوصف
sالبذرة (12755)، تدفع جميع العمليات التشفيرية
nالـ nonce (1603730985)، عشوائية خاصة بالبرنامج
gعلامة المولد، تفعيل طبقة فك تشفير تجزئة التكامل
xعلامة التشفير، يتم تشفير الثوابت بـ XOR
cمجمع الثوابت، 1230 مدخلاً
fالدوال، 112 مدخلاً مع بايت كود مشفر
eنقطة الدخول، فهرس الدالة 0

الخطوة 2: فك تشفير الثوابت

جميع سلاسل الثوابت الـ 1095 مشفرة بطبقتين:

الطبقة 1: تشفير XOR ثابت باستخدام Murmur بمفتاح 4008000571، معتمد على الموضع.

الطبقة 2: تشفير XOR بتدفق PRNG باستخدام LCG من glibc، مبذر بدمج بذرة البرنامج مع فهرس كل ثابت عبر ضرب Knuth التجزئي.

قبل فك التشفير، يتم XOR البذرة مع بصمة البيئة (_0xaf48)، وهي قناع بتات 8 بت يتم حسابه عن طريق فحص واجهات برمجة المتصفح:

بتالاختبارChrome
0typeof window.matchMedia === "function"1
1وجود document.elementFromPoint1
2typeof window.requestAnimationFrame === "function"1
3typeof window.getComputedStyle === "function"1
4وجود CSS.supports1
5وجود navigator.sendBeacon1
6وجود document.execCommand1
7وجود process.versions.node (Node.js)0

بالنسبة لـ Chrome: _0xaf48 = 0b01111111 = 127، مما يعطي بذرة فعالة = 12755 ^ 127 = 12716.

هذا يعني أن نفس البرنامج ينتج نتائج فك تشفير مختلفة في بيئات مختلفة. تشغيله في Node.js مقابل Chrome مقابل Firefox يعطي بذورًا مختلفة.

node decrypt_constants.js
# -> program_decrypted.json, constants_table.txt

ما تكشفه الثوابت

تخبرنا السلاسل المفكوكة بالضبط بما تلتقطه الآلة الافتراضية كبصمات:

بصمات المتصفح: screenWidth, screenHeight, innerWidth, innerHeight, devicePixelRatio, colorDepth, platform, userAgent, language, timezone, timezoneOffset, forcedColors, highContrast

توقيت الأداء: navigationStart, domComplete, domLoading, fetchStart, requestStart, responseEnd, secureConnectionStart, serverTiming

تشفير RSA: BigInt, modPow, AQAB (65537 في base64), modulusLength, shiftLeft, shiftRight, getRandomValues

تحقيقات DOM/SVG: http://www.w3.org/2000/svg, createElementNS, getBoundingClientRect, getTotalLength, getBBox

أسماء حقول PX: mtr, tst, mst, enc, sbx, fstec, pdc, prb, wvi, wva, pti, dis, los, cv, sc, jd, ads, enve, init

مراجع نقاط النهاية: https://fst-ec.perimeterx.net/?id=

مضاد للمصحح: _CMP_RCX_07;_JNZ_0x0A_EB_CC, CC|CD-04|BREAKPOINT-005

الخطوة 3: جدول الأوبكود

107 أوبكود أساسي تغطي لغة JavaScript بأكملها، بالإضافة إلى ضوضاء مولدة ديناميكيًا:

40 أوبكود عسل هي تطبيقات بديلة لعمليات حسابية/مقارنة باستخدام تعابير متكافئة رياضياً ولكن مختلفة نحويًا. قد تظهر ADD كـ (a^b) + 2*(a&b) أو -((-a)-b) أو a-(-b). يمكن أن يظهر كل أوبكود أساسي بما يصل إلى 3 متغيرات، مولدة حتميًا من البذرة. يمكن أن تظهر تعليمة ADD بسيطة كـ 4 قيم بايت كود مختلفة داخل نفس البرنامج، مما يكسر طرق مطابقة الأنماط.

24 أوبكود حشو مخصصة في التبديل ولكن ليس لها معالجات ولا يتم إصدارها أبداً. توجد لتوسيع مساحة الأوبكود وجعل الخلط أكثر صعوبة في العكس.

16 مجموعة تعليمات فائقة هي أهم ميزة مضادة للتحليل. عندما تحل حلقة التوزيع أوبكودًا ما إلى قائد تعليمة فائقة، يقرأ المعالج بايتًا إضافيًا واحدًا من تيار البايت كود ويوزع إلى معالج فرعي. يمكن أن يكون المعالج الفرعي عملية مختلفة تمامًا:

القائد يحل كـالبايت الفرعيينفذ فعليًا
FOR_IN_NEXT74FOR_IN_NEXT
FOR_IN_NEXT100MAKE_CLOSURE
ASSIGN_OP_VAR165ASSIGN_OP_VAR
ASSIGN_OP_VAR37JMP
GET_VAR_PROP_C143SET_VAR_POP
GET_VAR_PROP_C23JMP_NULLISH

يتم خلط جدول الأوبكود عبر Fisher-Yates مبذر بالبذرة الفعالة، لذا تختلف قيم البايت كود لكل بناء.

node build_opcodes.js
# -> opcode_table.json, opcode_table.txt

الخطوة 4: منشئ CFG

جوهر مجموعة الأدوات. cfg.js ينشئ رسمًا بيانيًا لتدفق التحكم باتباع جميع مسارات التنفيذ من PC=0، فك تشفير كل تعليمة بسياق التشفير الصحيح.

لماذا ليس مفكك شفرة خطي

تستخدم PX تعليمات متداخلة عند حدود الكتل. نفس البايتات تفك كمعاملات على مسار تنفيذ وكأوبكود على مسار آخر، حسب سياق تشفير الكتلة. المسح الخطي يفك تشفير كل موضع بايت مرة واحدة ويفتقد المسار البديل. يتبع CFG كلاً من الحواف الساقطة وحواف القفز، ويفك تشفير كل مسار بشكل مستقل.

تشفير البايت كود بخمس طبقات

  1. الطبقة 1 (_0x3ca8): تشفير XOR ثابت باستخدام Murmur على بايتات base64 الخام، بمفتاح 4008000571
  2. الطبقة 2 (_0xece1): تشفير XOR خاص بالدالة بطبقتين فرعيتين: مفتاح ثابت معتمد على الموضع + مفتاح تجزئة تكامل الشيفرة
  3. الطبقة 3 (_0x427d): تشفير XOR دوار خاص بالكتلة. كل كتلة تشفير (محددة بحدود fn.bl) تحصل على XOR إضافي مشتق من مفتاح الدالة وفهرس الكتلة. الكتلة 0 غير مشفرة عند الوصول الأول؛ الكتل 1+ مشفرة. هذا هو سبب عمل المفكك الخطي للكتلة الأولى ولكنه ينتج هراء للكتل اللاحقة.
  4. تبديل الأوبكود: خلط Fisher-Yates + إزاحة معتمدة على الموضع + إزاحة معتمدة على الكتلة
  5. XOR معاملات لكل تعليمة: بايتات المعامل XORed بمفتاح مشتق من موضع بداية التعليمة

يطبق CFG جميع الطبقات الخمس بطريقة غير مدمرة (XOR المعامل يحسب أثناء التنفيذ، وليس في المكان) حتى لا تفسد مناطق التعليمات المتداخلة بعضها البعض.

حل التعليمات الفائقة

لكل قائد تعليمة فائقة، يقرأ CFG البايت الفرعي، ويبحث عن المعالج الفعلي في super_groups.json، ويفك تشفير المعامل للأوبكود الحقيقي. يتم اتباع أهداف القفز من أوبكودات القفز المدمجة (مثل ما يبدو كـ ASSIGN_OP_VAR ولكنه في الواقع JMP) بشكل صحيح.

node cfg.js        # جميع الدوال -> cfg_output/
node cfg.js 79     # دالة واحدة إلى stdout
تنزيل الأداة