
تحليل هندسي عكسي لمعرف الجهاز العالمي (GDID) من مايكروسوفت، يكشف عن إنشائه كمعرف جهاز PUID مخصص من الخادم MSA، وتخزينه في السجل، ونقله عبر منصة الأجهزة المتصلة، مع منهجية تحقيق قابلة للتكرار.
كيف يتم إنشاء وتخزين وإرسال "Global Device Identifier" من مايكروسوفت، بصمة ويندوز الثابتة المذكورة في شكوى Scattered Spider في يوليو 2026.
[!NOTE] ما هو مذكور أدناه صحيح، لكنه يفتقد بعض المعلومات. بغض النظر عن تسجيل الدخول بحساب MSA، سيكون لديك GDID. لم أدرك ذلك وقت النشر لكني بحثت فيه. لدى CDP مسار جهاز مجهول يستخدم إذا لم يتم ربط أي حساب MSA. النظام الأساسي لا يزال صحيحًا من الناحية الواقعية لكنه يفتقد بعض الأشياء.
Global Device Identifier g:6755467234350028.g:<رقم عشري>.wlidsvc (خدمة حساب Microsoft) تزود الجهاز بـ login.live.com وتستعيد Device PUID -> تخزنه في السجل -> Connected Devices Platform (cdp.dll / CDPSvc) تقرأه وتسجله في رسم Device Directory Service (DDS) -> Delivery Optimization تبلغ عنه كـ UCDOStatus.GlobalDeviceId الموثق.[!NOTE] وضع العلامات الثقة. كل ادعاء موسوم حتى تتمكن من تقييمه بنفسك:
[COURT]حقيقة مصدر أساسي،[OBSERVED]أعيد إنتاجه حيًا على جهاز الاختبار الخاص بي،[STATIC]مثبت من الملفات الثنائية وPDBs ويندوز العامة، `[ASSESSED]] استنتاج قوي من الأدلة.
wlidsvc)في 1 يوليو 2026، كشفت وزارة العدل الأمريكية عن شكوى جنائية ضد بيتر ستوكس، عضو مزعوم في Scattered Spider (المعروف أيضًا باسم Octo Tempest / UNC3944 / 0ktapus). يصف الإفادة كيف ساعدت مايكروسوفت مكتب التحقيقات الفيدرالي في نسب النشاط إلى جهاز.
[!IMPORTANT]
[COURT]من الشكوى اللاحقة (¶25، ص.34)، نصًا:"تم إعداد حساب ngrok عبر Global Device Identifier g:6755467234350028 ('GDID'). وفقًا لممثل مايكروسوفت، فإن Global Device Identifier في نظام ويندوز هو معرف ثابت على مستوى الجهاز مصمم لتحديد تثبيت نظام تشغيل ويندوز بشكل فريد على جهاز... GDID هو معرف فريد عالميًا مرتبط بتثبيت ويندوز على جهاز. يظل GDID ثابتًا عبر تحديثات نظام تشغيل ويندوز على الجهاز، ولكن إعادة تثبيت ويندوز... سترتبط بـ GDID فريد جديد."
يضيف حاشية أن مستخدم مايكروسوفت الواحد يمكن أن يكون لديه عدة GDIDs. ثم يربط الإفادة تاريخ IP للـ GDID والتصفح (مثل empirehotelnyc.com، رابط تسجيل Growtopia/Ubisoft) بحسابات المشتبه به التي كان مسجلاً فيها.
شيئان هنا يحملان بقية هذا الشرح:
g: بالإضافة إلى عدد صحيح عشري (g:6755467234350028). في النظام الست عشري هذا 0x0018000FC8CB93CC، أي رقم بطول 64 بت.الملخص على وسائل التواصل الاجتماعي ادعى أن GDID هو "معرف 128 بت يتم إنشاؤه من الأرقام التسلسلية عند التثبيت." كلا النصفين خاطئان:
| الادعاء (وسائل التواصل الاجتماعي) | الواقع (المصدر الأساسي) |
|---|---|
| "128 بت" | القيمة في الشكوى هي g:6755467234350028، رقم عشري يناسب 64 بت (0x0018000FC8CB93CC). |
| "مولد من الأرقام التسلسلية عند التثبيت" | الشكوى تقول أن إعادة التثبيت تنتج GDID جديدًا. القيمة المشتقة من تسلسلات ثابتة ستعود كما هي بعد إعادة التثبيت، وليس التغيير. |
[!NOTE] بعد المزيد من عكس هندسة CDP. قدمت بعض المعلومات الخاطئة. استخدام حساب محلي لا يمنع GDID. لدى CDP مسار جهاز مجهول يتم اتخاذه إذا لم يكن هناك حساب Microsoft. ضع هذا في الاعتبار عند القراءة.
[STATIC] وثائق Azure Monitor العامة لمايكروسوفت تحدد عمود GlobalDeviceId في جدول UCDOStatus (Update Compliance / Delivery Optimization):
GlobalDeviceId(سلسلة): "معرف الجهاز العالمي لمايكروسوفت. هذا معرف يستخدم داخليًا بواسطة مايكروسوفت."
يقع بجوار LastCensusSeenTime وISP وCity وCountry، لذا فهو معرف جهاز مرتبط بالموقع الجغرافي وIP. هذا هو المكان الوحيد الذي تسميه مايكروسوفت القيمة في الوثائق العامة. لكن Delivery Optimization تبلغ عنها فقط. من المهم أنها لا تمتلكها. اتبعها عكس التيار وستصل إلى Connected Devices Platform.
[STATIC] C:\Windows\System32\cdp.dll (Connected Devices Platform، خدمات CDPSvc + CDPUserSvc) تحتوي على رمز GlobalDeviceId ونظام تسجيل كامل لـ Device Directory Service:
ddsregistrationclient.cpp ddsregistrationmanager.cpp ddsregistrationinfo.cpp
DdsRegistrationClient RegisterUserDevicesObserver DdsRegistrationInfoProviderForCDP
endpoints: dds.microsoft.com fd.dds.microsoft.com aad.cs.dds.microsoft.com cdpcs.access.microsoft.com
device-id format string: "g:%s"
DDS = Device Directory Service، رسم هوية الأجهزة المتعددة لمايكروسوفت (الواجهة الخلفية وراء Phone Link، الحافظة السحابية، "Continue on PC"، Nearby Share). CDP هو عميل ويندوز الذي يسجل التثبيت في هذا الرسم، حيث يتم مفتاحه كـ g:<عدد عشري>.
[OBSERVED] إجبار تسجيل جديد (إعادة تشغيل CDPSvc مع مسح حالته المحلية) والتقاط موفري ETW الخاصين بـ CDP أنتج المصافحة الكاملة:
DdsClient::RegisterUserDeviceAsync() RegistrationReason: Startup Account Type: MSA
DDSClient: Registration response received. HTTP status code: 200
OnRegisterUserDeviceComplete
GetDeviceIdAndTicketActivity -> deviceid: 0018XXXXXXXXXXXX
هذا deviceid، المكتوب كـ g:<عدد عشري>، يطابق بنية القيمة في الشكوى:
| القيمة | سداسي عشري (64 بت) | بادئة الفئة | |
|---|---|---|---|
| جهازي (منقح) | g:XXXXXXXXXXXXXXXX | 0x0018XXXXXXXXXXXX | 0018 |
| معروض المحكمة | g:6755467234350028 | 0x0018000FC8CB93CC | 0018 |
كلاهما قيم 64 بت في نفس فئة الكلمة العليا 0x0018 (مساحة اسم Device PUID، انظر §6). البادئة g: هي فقط ذلك العدد الصحيح بالنظام العشري.
[STATIC] مع PDB العام (cdp.pdb)، مسار معرف الجهاز في cdp.dll هو مجرد طلب وانتظار ضد مكدس الهوية. لا يحسب CDP المعرف بنفسه أبدًا:
flowchart TD
A["GetStableDeviceIdFromProvider<br/>0x0A3140"] --> B["provider.GetStableDeviceIdAsync<br/>(vtable +0x48)"]
B --> C["OneCoreAccountProvider::<br/>GetStableDeviceIdAsync 0x0C8370"]
C --> D["IWebAccountBackedAccountProvider<br/>(MSA / AAD identity COM)"]
D --> E["OnGetStableDeviceIdCompleted<br/>(const char* deviceId) 0x06CEA0"]
E -->|"assign() string, signal flag"| A
الاستدعاء الذي يستقبله يجعله واضحًا. يظهر المعرف كـ سلسلة ويتم تخزينه فقط: