Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

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

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الهندسة العكسيةأمن الويبتحليل البرمجيات الخبيثةالتشفيرتحليل الملفات الثنائيةالأوراق والأبحاثالتعلم والتعليممكافحة الروبوتاتانتحال البصمة الرقمية
5514منذ 4 أشهرتمت المراجعة من قبل 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:

root@kitploit:~
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). جدول تعيين يحولها إلى أسماء قياسية.

root@kitploit:~
node extractor.js
# -> program.json

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

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

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

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

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

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

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

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

root@kitploit:~
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, , ,

مراجع نقاط النهاية: 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 مجموعة تعليمات فائقة هي أهم ميزة مضادة للتحليل. عندما تحل حلقة التوزيع أوبكودًا ما إلى قائد تعليمة فائقة، يقرأ المعالج بايتًا إضافيًا واحدًا من تيار البايت كود ويوزع إلى معالج فرعي. يمكن أن يكون المعالج الفرعي عملية مختلفة تمامًا:

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

root@kitploit:~
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) بشكل صحيح.

root@kitploit:~
node cfg.js        # جميع الدوال -> cfg_output/
node cfg.js 79     # دالة واحدة إلى stdout

تم التحقق من صحته مقابل آثار تنفيذ المتصفح: 600 تعليمة تم تتبعها عبر 14 دالة، 0 عدم تطابق في دلتا المكدس. تم التحقق من صحة جميع الأوبكودات الـ 34 الفريدة. تم تأكيد توزيع التعليمات الفائقة بشكل صحيح لجميع مجموعات القادة العشر التي تم تنفيذها أثناء التهيئة.

الخطوة 5: المنظف

يأخذ مخرجات CFG ويقوم بتشغيل محاكاة المكدس لإنتاج تعليقات تعبيرية. يحول البايت كود الخام إلى شبه كود قابل للقراءة.

root@kitploit:~
node cleaner.js 79     # fn79 إلى stdout

يمشي عبر التعليمات بالترتيب، متتبعًا مكدسًا افتراضيًا. كل دفع/سحب/استدعاء يبني سلسلة تعبيرية:

root@kitploit:~
  0018  GET_VAR                 ; 0.0001
  001e  GET_VAR                 ; or
  0024  PUSH_CONST              ; "_0x166"
  002b  CALL_METHOD_C           ; 0.0001._0x88(or, "_0x166")
  ...
  0114  PUSH_CONST              ; "fontSize"
  011b  PUSH_CONST              ; "pdc"
  0122  CALL_METHOD_C           ; _0x18c.getHours("fontSize", "pdc")

يتم قمع الضوضاء الحسابية/المقارنة البحتة فقط على مكدس فارغ. يتم الاحتفاظ بكل شيء آخر لأن CFG قام بالفعل بتصفية العسل والحشو.

112 دالة، 5435 تعليمة محتفظ بها، 207 ضوضاء مكبوتة. fn79 (جامع البصمات، 1109 تعليمة) لديها تغطية تعليقات تعبيرية بنسبة 85%.

هندسة الآلة الافتراضية

آلة افتراضية قائمة على المكدس بسعة 256 خانة، سلسلة نطاق، سلسلة معالجة try/catch، ومكدس مكرر for-in. تقرأ حلقة التوزيع أوبكودات بـ 2 بايت (Little Endian)، وتحل عبر التبديل + XOR للموضع + إزاحة الكتلة، وتفك تشفير المعاملات في المكان، وتنفذ المعالج، ثم تعيد تشفير المعاملات بحيث لا يتم فك تشفير البايت كود بالكامل في الذاكرة أبدًا.

النتائج الرئيسية

  • تشفير RSA لمخرجات البصمة باستخدام BigInt و modPow والأس 65537
  • بصمة عرض SVG عبر getTotalLength() و getBBox() على مسارات منشأة
  • جمع كامل لشلال performance.timing
  • علامات كشف مضاد للمصحح (CC|CD-04|BREAKPOINT-005)
  • الدالة 79 هي الجامع الرئيسي للبصمات (8361 بايت، ~1200 تعليمة)

ملاحظات

تم استخدام الذكاء الاصطناعي للمساعدة في توثيق الشيفرة، وكتابة الأدوات، وكتابة هذا الـ readme.

إخلاء مسؤولية

لأغراض تعليمية/بحثية أمنية بحتة. لا توجد حلول أو تجاوزات، فقط توثيق لكيفية عمل الآلة الافتراضية لأنها مثيرة للاهتمام حقًا.

إذا كان لدى أي شخص من PerimeterX/HUMAN Security مخاوف بشأن هذا المستودع، فيرجى التواصل: [email protected]

تنزيل الأداة
الحقلالوصف
sالبذرة (12755)، تدفع جميع العمليات التشفيرية
nالـ nonce (1603730985)، عشوائية خاصة بالبرنامج
gعلامة المولد، تفعيل طبقة فك تشفير تجزئة التكامل
xعلامة التشفير، يتم تشفير الثوابت بـ XOR
cمجمع الثوابت، 1230 مدخلاً
fالدوال، 112 مدخلاً مع بايت كود مشفر
eنقطة الدخول، فهرس الدالة 0
بتالاختبار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
ads
enve
init
القائد يحل كـالبايت الفرعيينفذ فعليًا
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