
Windows XP Keygen
مولّد مفاتيح VLK لنظامي Windows XP / Windows Server 2003. تتيح لك هذه الأداة توليد مفاتيح Windows XP صالحة استنادًا إلى المفتاح الخام (Raw Product Key)، والذي يمكن أن يكون عشوائيًا.
يتم توفير المفتاح الخام (RPK) بصيغة 9 أرقام XXX-YYYYYY وهو ضروري فقط لتوليد مفتاح Windows XP.

انتقل إلى تبويب Releases وحمّل أحدث إصدار من هناك.
هذا المشروع لم يمت — سأبذل قصارى جهدي لإنجاحه.
بشكل عام، الشيء الوحيد الذي يفصلنا عن توليد مفاتيح Windows XP صالحة لكل إصدار ولكل بناء هو عدم وجود المفاتيح الخاصة المقابلة لنظيراتها العامة داخل pidgen.dll. لا يوجد كود لدالة اللوغاريتم المتقطع للمنحنى الإهليلجي متاح على نطاق واسع عبر الإنترنت، بل توجد فقط معلومات غامضة حول كيفية القيام بذلك.
مع مرور الوقت، تم حل المشكلة جزئيًا.
لم يكن مورد BINK مشفّرًا بأي شكل من الأشكال، وكانت البيانات تُكتب في المورد بشكل تسلسلي فقط. كما شرح sk00ter تنسيق BINK بالكامل في منتديات MDL. بالاستفادة من المعرفة المجتمعية السابقة حول هذا الموضوع، كتبت قارئ BINK بلغة Python 3. الملف متاح للعموم في هذا المستودع، اضغط هنا لعرض الكود المصدري.
يُعد حل اللوغاريتم المتقطع أكثر مجالات البحث التي لم تُستكشف بعد حتى 28 مايو 2023. ومع ذلك، وجد صديقي nephacks تلك الأداة المراوغة لحل هذه المشكلة الصعبة في أحلك زوايا الإنترنت. تُسمى ECDLP (Elliptic Curve Discrete Logarithm Problem) Solver من إعداد Mr. HAANDI. ونظرًا لأنه كان من المحبط للغاية العثور عليها عبر الإنترنت، أعدت رفعها على موقعي الإلكتروني. يمكنك تحميل الأداة هنا.
ملف ReadMe المرفق مع الإصدار 0.2a من الحلّال جيد بما يكفي بحد ذاته، لذا فأي شخص يملك عقلًا سيكون قادرًا على إعداد تلك الأداة. ومع ذلك، فهي ليست مفتوحة المصدر، لذا ثبت أن دمجها في مولّد المفاتيح الخاص بي مستحيل.
في السيناريو المثالي، سيطلب منك مولّد المفاتيح مورد BINK المستخرج من pidgen.dll، ثم يقوم بفكّه إلى المقاطع التالية:
pubX; pubY)genX; genY)a; b)pبمعرفة هذه المقاطع، سيقوم مولّد المفاتيح بالبحث الشامل عن ترتيب المولّد genOrder باستخدام خوارزمية Schoof، متبوعًا بالمفتاح الخاص privateKey، مع الاستفادة من genOrder المحسوب لاستخدام خوارزمية Pollard's Rho الأكثر مثالية. مما لا شك فيه أننا نستطيع كسر أي مفتاح خاص في غضون 20 دقيقة باستخدام القوة الحاسوبية الحديثة، بشرط أن تكون لدينا الخوارزمية العاملة.
بمجرد أن ينهي مولّد المفاتيح البحث الشامل عن المفتاح الخاص الصحيح، تختصر المهمة في توليد مفتاح فعليًا، وهذا ما يفعله هذا المولّد. لأعطيك منظورًا أفضل، يمكنني أن أوفر لك تدفق عمل المولّد المثالي. ما هو مشطوب هو ما يطبقه مولّدي:
نحتاج إلى استخدام مفتاح خام عشوائي كأساس لتوليد معرّف منتج بصيغة AAAAA-BBB-CCCCCCS-DDEEE.
ثابت عائلة نظام التشغيل AAAAA يختلف لكل سلسلة من سلاسل Windows XP. على سبيل المثال، هو 76487 للإصدار SP3.
القسمان BBB وCCCCCC يقومان أساسًا بترميز المفتاح الخام. على سبيل المثال، إذا كان القسم الأول يساوي XXX والقسم الثاني يساوي YYYYYY، فسيتم ترميز المفتاح الخام كـ XXX-YYYYYY.
يتم اختيار رقم التحقق S بحيث يكون مجموع جميع أرقام C مع إضافته عددًا يقبل القسمة على 7.
فهرس المفتاح العام DD يخبرنا أي مفتاح عام تم استخدامه للتحقق بنجاح من صحة مفتاح المنتج لدينا.
على سبيل المثال، هو 22 لمفاتيح Professional و23 لمفاتيح VLK.
يُستخدم رقم عشوائي EEE لتوليد معرّف تثبيت مختلف في كل مرة.
مفتاح المنتج نفسه (وليس الخلط بينه وبين RPK) يكون بصيغة FFFFF-GGGGG-HHHHH-JJJJJ-KKKKK، مُرمّز بنظام Base-24 مع
الأبجدية BCDFGHJKMPQRTVWXY2346789 لاستبعاد أي أحرف يمكن الخلط بينها بسهولة، مثل I و1 أو O و0.
وفقًا لصيغة سعة الأبجدية، يمكن أن يحتوي المفتاح على 114 بتًا من المعلومات على الأكثر. $$N = \log_2(24^{25}) \approx 114$$
بناءً على هذا الحساب، نقوم بفك مفتاح المنتج ذي 114 بتًا إلى 4 مقاطع مرتبة:
لتبسيط الأمر، سنجمع مقطعي Upgrade وSerial في مقطع واحد يُسمى Data. وبهذا المنطق سنتمكن من استخراج RPK عن طريق
إزاحة Data إلى اليمين وإعادة تجميعه عن طريق إزاحة البتات إلى اليسار، لأن معظم مفاتيح المنتج الصالحة قبليًا التي فحصتها كان علم الترقية فيها مضبوطًا على 1.
أعادت Microsoft تصميم تنسيق مفتاح المنتج مع Windows Server 2003 لتضمين مفتاح مصادقة خادم خلفي، وهو نهج آمن فعليًا للتحقق من الترخيص، إذ لم يكن بمقدور أي أحد أن يخمّن خوارزمية التحقق التي وظّفوها على خادمهم الخاص. بالإضافة إلى إضافة آلية التحقق عبر الإنترنت، رفعوا أيضًا الحسابات الإجمالية من 384 إلى 512 بتًا، وقيمة التوقيع إلى 62 بتًا من المعلومات.
ومع ذلك، إذا أنشأنا مفتاحًا دون وضع التفعيل عبر الإنترنت في الاعتبار، فسنظل قادرين على توليد مفاتيح صالحة تتيح لنا اجتياز إعداد نظام التشغيل. وهذا بالضبط ما يفعله الكود - فهو يولد مفتاح مصادقة عشوائيًا من 10 بتات. في الوقت الحاضر لا يهم ذلك إطلاقًا، لأن خوادم التفعيل معطّلة و يُعتبر Server 2003 برامج مهجورة (abandonware)، وبنفس الطريقة لا ينبغي اعتبار هذا المشروع بأكمله قرصنة.
تشفير المنحنيات الإهليلجية (ECC) هو نوع من أنظمة التشفير بالمفتاح العام. تعتمد هذه الفئة من الأنظمة على مسائل رياضية "أحادية الاتجاه" صعبة - سهلة الحساب في اتجاه واحد ويستعصي حلها في الاتجاه "الآخر". تُسمى أحيانًا دوال "الباب الخلفي" (trapdoor) - سهلة الدخول إليها، وصعبة الهروب منها.[5]
يعتمد ECC على حل معادلات من الشكل $$y^2 = x^3 + ax + b$$
بشكل عام، هناك حالتان خاصتان للمنحنى الإهليلجي المستخدم في التشفير - F2m وFp. تختلفان بشكل طفيف فقط. كلا المنحنيين معرّفان على حقل محدود؛ يستخدم Fp معاملًا أوليًا أكبر من 3، بينما يفترض F2m أن $p = 2m$. استخدمت Microsoft الأخير في خوارزميتها.
يتكون المنحنى الإهليلجي فوق الحقل المحدود Fp من:
منحنى إهليلجي فوق F17 سيبدو هكذا:

يتكون المنحنى من النقاط الزرقاء في الصورة أعلاه. عمليًا، "المنحنيات الإهليلجية" المستخدمة في التشفير هي "مجموعات نقاط في مصفوفة مربعة".
المنحنى أعلاه "تعليمي". إنه يوفّر طول مفتاح صغير جدًا (4-5 بتات). في مواقف العالم الحقيقي، يستخدم المطورون عادةً منحنيات من 256 بتًا أو أكثر.
بما أنه نظام تشفير بالمفتاح العام، كان على Microsoft مشاركة المفتاح العام مع إصدار Windows XP الخاص بها للتحقق من مفاتيح المنتج المُدخلة.
يتم تخزينه داخل pidgen.dll في شكل مورد BINK. المجموعة الأولى من بيانات BINK موجودة للتحقق من مفاتيح البيع بالتجزئة، والثانية لمفاتيح
OEM على التوالي.
هيكل مورد BINK لنظامي Windows 98 وWindows XP هو كما يلي:
يتم تمييز كل مقطع بلون مختلف، بينما قيم ترويسة BINK هي نفسها.

يطبّق Windows Server 2003 وWindows XP x64 الأمر بشكل مختلف:
وفيما يلي النماذج الأولية للبنية التي أعددتها لقارئ BINK بلغة C:```c typedef struct _EC_BYTE_POINT { CHAR x[256]; // x-coordinate of the point on the elliptic curve. CHAR y[256]; // y-coordinate of the point on the elliptic curve. } EC_BYTE_POINT;
typedef struct _BINKHDR { // BINK version - not stored in the resource. ULONG32 dwVersion;
// Original BINK header.
ULONG32 dwID;
ULONG32 dwSize;
ULONG32 dwHeaderLength;
ULONG32 dwChecksum;
ULONG32 dwDate;
ULONG32 dwKeySizeInDWORDs;
ULONG32 dwHashLength;
ULONG32 dwSignatureLength;
// Extended BINK header. (Windows Server 2003+)
ULONG32 dwAuthCodeLength;
ULONG32 dwProductIDLength;
} BINKHDR;
typedef struct _BINKDATA { CHAR p[256]; // Finite Field order p. CHAR a[256]; // Elliptic Curve parameter a. CHAR b[256]; // Elliptic Curve parameter b.
EC_BYTE_POINT G; // Base point (Generator) G.
EC_BYTE_POINT K; // Public key K.
} BINKDATA;
typedef struct _BINKEY { BINKHDR header; BINKDATA data; } BINKEY;
في حال أردت استكشاف المزيد، فإن الكود المصدري لـ `pidgen.dll` وجميع دواله متاح داخل هذا المستودع، في مجلد "pidgen".
### عكس المفتاح الخاص
إذا أردنا توليد مفاتيح منتج صالحة لنظام Windows XP، يجب علينا حساب المفتاح الخاص المقابل باستخدام المفتاح العام المرفق مع `pidgen.dll`،
وهذا يعني أننا بحاجة إلى حل عكسي لمهمة ECC أحادية الاتجاه.
استنادًا إلى المفتاح الموجود في BINK، فإن ترتيب المنحنى يبلغ **384 بت** في Windows XP و**512 بت** في Server 2003 / XP x64 على التوالي.
صعوبة الحساب باستخدام خوارزمية Pollard's Rho الأكثر كفاءة مع التعقيد المقارب $O(\sqrt{n})$ ستكون على الأقل $O(2^{168})$ لنظام Windows XP، و $O(2^{256})$ لنظام Windows Server 2003، لكن لحسن الحظ،
قيّدت Microsoft قيمة التوقيع إلى 55 بت في Windows XP و62 بت في Windows Server 2003 من أجل تقليل عدد مفاتيح المنتج المتطابقة، مما يقلل الصعوبة إلى $O(2^{28})$ / $O(2^{31})$ أكثر قابلية للإدارة.
كما ذُكر سابقًا، هناك أداة عامة واحدة فقط تلبي احتياجاتنا الحالية، وهي أداة حل ECDLP من السيد HAANDI.<br>
لحساب المفتاح الخاص، سنحتاج إلى تزويد الأداة بقيم ECC العامة الموجودة في مورد BINK، بالإضافة إلى الترتيب `genOrder` للنقطة الأساسية `G(Gx; Gy)`.
يمكن حساب ترتيب النقطة الأساسية باستخدام SageMath.
**إليك الخوارزمية الأساسية التي استخدمتها لعكس المفتاح الخاص لنظام Windows 98:**
1. احسب ترتيب النقطة الأساسية باستخدام **SageMath**. في SageMath، نفّذ الأوامر التالية:
1) `E = EllipticCurve(GF(p), [0, 0, 0, a, b])`، حيث `p` و`a` و`b` هي معاملات منحنى إهليلجي ممثلة بالكسور العشرية من مورد BINK.
2) `G = E(Gx, Gy)`، حيث `Gx` و`Gy` هما إحداثيات النقطة الأساسية ممثلة بالكسور العشرية من مورد BINK.
3) `K = E(Kx, Ky)`، حيث `Kx` و`Ky` هما إحداثيات المفتاح العام ممثلة بالكسور العشرية من مورد BINK.
4) `n = G.order()`، سيكون `n` هو الترتيب المحسوب للنقطة الأساسية. **قد يستغرق حسابه بعض الوقت، حتى على أحدث الإصدارات.**
5) حلل الترتيب باستخدام `factor(n)`. استخدمت Microsoft أعدادًا أولية لترتيبات النقاط، لذا إذا أعاد الرقم نفسه، فهذا طبيعي تمامًا.
6) احفظ العوامل الناتجة للترتيب في مكان ما.
7) سيعطيك `-K` معكوس المفتاح العام في مستوى إسقاطي بإحداثيات `(x : y : z)`. احفظ إحداثي `y` في مكان ما، فهو مطلوب لتوليد مفتاح خاص صحيح.
2. احسب المفتاح الخاص باستخدام **ECDLP Solver v0.2a**.
1) تأتي الأداة مع ملف قالب `job_template.txt` وملف ReadMe. من الضروري فهم كيفية عمل الأداة لاستخدامها.
2) أدخل جميع قيم المنحنى الإهليلجي العامة من مورد BINK، **باستثناء إحداثي `Ky`**. لتوليد مفتاح خاص صحيح، **يجب عليك استخدام الإحداثي المعكوس `-Ky` الذي حسبته في SageMath سابقًا.**
3) أدخل عوامل ترتيب النقطة الأساسية `n` وحدد عدد العوامل. من المرجح جدًا أن يكون `1`، حيث تستخدم Microsoft الأعداد الأولية بشكل أساسي لترتيبات المولّدات الخاصة بها.
4) شغّل الأداة `<arch> ECDLP Solver.exe <job_name>.txt` وانتظر حتى تحسب لك المفتاح الخاص `k = %d`.
**فيما يلي مثال على ملف وظيفة Windows XP `job_xp.txt` الذي ينتج المفتاح الخاص الصحيح لأداة ECDLP Solver.**```pascal
GF := GF(22604814143135632990679956684344311209819952803216271952472204855524756275151440456421260165232069708317717961315241);
E := EllipticCurve([GF|1,0]);
G := E![10910744922206512781156913169071750153028386884676208947062808346072531411270489432930252839559606812441712224597826,19170993669917204517491618000619818679152109690172641868349612889930480365274675096509477191800826190959228181870174];
K := E![14399230353963643339712940015954061581064239835926823517419716769613937039346822269422480779920783799484349086780408,17120082747148185997450361756610881166187863099877353630300913555824935802439591336620545428308962346299700128114607];
/*
FactorCount:=1;
61760995553426173
*/
وهذه مخرجات أداة حل ECDLP له:

ملاحظة مهمة:
انتبه إلى أنني لم أتمكن من توليد مفتاح Windows XP x64 صحيح باستخدام المفتاح الخاص الذي استخرجته بعكس الهندسة، حتى عند استخدام إحداثي Ky بدلاً من -Ky المعتاد.
لسبب ما، فشلت أيضًا في حساب ترتيب النقطة الأساسية لـ Windows Server 2003 باستخدام SageMath. أعطيته 12 ساعة لإتمام الحساب على معالج i7-12700K، لكنه ظل عالقًا في الحساب.
بقية العمل يتم داخل كود مولّد المفاتيح هذا.
0x40000/0x62A32، وهو ما يساوي بالضبط
0.64884، أي حوالي 65%. كان تقديري "2 من كل 3" دقيقًا بشكل لا يصدق.BBB على 640 وقسم CCCCCC على غير الصفر.سأضيف المزيد من القراءات الجيدة إلى قائمة المراجع في الإصدارات اللاحقة.
فهم أساسيات تفعيل Windows XP:
فهم تشفير المنحنيات الإهليلجية:
نقاشات عامة:
إذا كنت ستعرض هذا البرنامج أو تفرّعه، فيرجى نسب الفضل إلى Endermanch وz22 وMSKey.
لا تتردد في تعديله كما يحلو لك، طالما أبقيتَه مفتوح المصدر. مرخّص بموجب رخصة GNU General Public License v3.0.
أي مساهمات أو أسئلة مرحّب بها.
genOrderprivateKey| Digits | Meaning |
|---|
| AAAAA | ثابت عائلة نظام التشغيل |
| BBB | معرّف القناة |
| CCCCCC | الرقم التسلسلي |
| S | رقم التحقق |
| DD | فهرس المفتاح العام |
| EEE | رقم عشوائي من 3 أرقام |
| Segment | Capacity | Data |
|---|
| الترقية | 1 بت | علم إصدار الترقية |
| الرقم التسلسلي | 30 بتًا | المفتاح الخام (RPK) |
| التجزئة | 28 بتًا | تجزئة RPK |
| التوقيع | 55 بتًا | توقيع المنحنى الإهليلجي لتجزئة RPK |
| Segment | Capacity | Data |
|---|
| الترقية | 1 بت | علم إصدار الترقية |
| معرّف القناة | 10 بتات | جزء BBB من RPK |
| التجزئة | 31 بتًا | تجزئة RPK |
| التوقيع | 62 بتًا | توقيع المنحنى الإهليلجي لتجزئة RPK |
| مفتاح المصادقة | 10 بتات | قيمة المصادقة الخلفية |
| Offset | Value |
|---|
0x0000 | معرّف BINK |
0x0004 | حجم بنية BINKEY بالبايتات (دائمًا 0x16C عمليًا) |
0x0008 | طول الترويسة (دائمًا 7 عمليًا) |
0x000C | المجموع الاختباري |
0x0010 | تاريخ مُرمّز رقميًا - إصدار BINKEY (دائمًا 19980206 عمليًا) |
0x0014 | حجم ترتيب منحنى ECC (دائمًا 12 عمليًا) |
0x0018 | طول التجزئة (دائمًا 28 عمليًا) |
0x001C | طول التوقيع (دائمًا 55 عمليًا) |
0x0020 | ترتيب الحقل المحدود p |
0x005C | معامل المنحنى a |
0x0098 | معامل المنحنى b |
0x00D4 | إحداثي x للنقطة الأساسية Gx |
0x0110 | إحداثي y للنقطة الأساسية Gy |
0x014C | إحداثي x للمفتاح العام Kx |
0x0188 | إحداثي y للمفتاح العام Ky |
| Offset | Value |
|---|
0x0000 | معرّف BINK |
0x0004 | حجم بنية BINKEY بالبايتات |
0x0008 | طول الترويسة (دائمًا 9 عمليًا) |
0x000C | المجموع الاختباري |
0x0010 | تاريخ مُرمّز رقميًا - إصدار BINKEY (دائمًا 20020420 عمليًا) |
0x0014 | حجم ترتيب منحنى ECC (دائمًا 16 عمليًا) |
0x0018 | طول التجزئة (دائمًا 31 عمليًا) |
0x001C | طول التوقيع (دائمًا 62 عمليًا) |
0x0020 | طول قيمة المصادقة الخلفية (دائمًا 12 عمليًا) |
0x0024 | طول معرّف المنتج (دائمًا 20 عمليًا) |
0x0028 | ترتيب الحقل المحدود p |
0x0068 | معامل المنحنى a |
0x00A8 | معامل المنحنى b |
0x00E8 | إحداثي x للنقطة الأساسية Gx |
0x0128 | إحداثي y للنقطة الأساسية Gy |
0x0168 | إحداثي x للمفتاح العام Kx |
0x01A8 | إحداثي y للمفتاح العام Ky |