
تحليل هندسي عكسي لمعرف الجهاز العالمي (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). |
| "مولد من الأرقام التسلسلية عند التثبيت" | الشكوى تقول أن . القيمة المشتقة من تسلسلات ثابتة ستعود كما هي بعد إعادة التثبيت، وليس التغيير. |
[!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 بت في نفس فئة الكلمة العليا 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الاستدعاء الذي يستقبله يجعله واضحًا. يظهر المعرف كـ سلسلة ويتم تخزينه فقط:
; OnGetStableDeviceIdCompleted
mov rbp, r9 ; r9 = device-id STRING handed in by the identity provider
lea rcx, [rsi+0xD8] ; CDP member field
mov rdx, rbp
call assign@basic_string ; store it, no computation, no serials
call Set@CdpWaitableFlag ; unblock the waiter
خلاصة القول: يتم سك GDID أسفل CDP، في مكدس هوية ويندوز، ويتم تسليمه إلى CDP كسلسلة غير شفافة. هذا يشير إلى خدمة حساب Microsoft.
wlidsvc)[STATIC] C:\Windows\System32\wlidsvc.dll، خدمة Microsoft Account / Passport (Windows Live ID)، هي الملف الثنائي الوحيد للهوية الذي يحتوي على GlobalDeviceId الحرفي، ويحتوي على آلية توفير الجهاز الكاملة:
CDeviceIdentityBase::CreateNewDeviceIdentity / Provision / BindDeviceToHardware / GetDeviceCert
DeviceAssociateRequest (Passport PPCRL SOAP -> login.live.com)
<ps:DevicePUID> ... </ps:DevicePUID>
DeviceIdStore::LogToRegistry
BCryptGenRandom / CCryptRandom::GenRandom (device KEY, not the id)
المعرف هو Device PUID (معرف فريد لجواز السفر)، معرف MSA بطول 64 بت. BCryptGenRandom الموجود هناك يصنع مفتاح مصادقة الجهاز الذي يقوم BindDeviceToHardware بتثبيته على الجهاز، وليس PUID.
[STATIC] يقوم العميل بسحب PUID من استجابة SOAP للخادم، مع مسار XPath في جسم الاستجابة:
/S:Envelope/S:Body/ps:DeviceUpdatePropertiesResponse/HWPUIDFlipped
CAssociateDeviceRequest::ParseResponseBody والطرق ذات الصلة ParseResponse تقرأ عُقد XML الاستجابة إلى BSTRs. لذا فإن التدفق هو: يقوم العميل بتوفير الجهاز -> login.live.com يعين ويعيد Device PUID -> يقوم العميل بتخزينه. هذا هو بالضبط سبب أن إعادة التثبيت تنتج GDID جديدًا (توفير جديد، PUID جديد من الخادم)، ولماذا هو ليس تجزئة للأجهزة.
[OBSERVED] مخزن هوية حساب Microsoft يحتفظ بالقيمة مباشرة في السجل، في خلية المستخدم الخاصة بك:
HKCU\SOFTWARE\Microsoft\IdentityCRL\ExtendedProperties
LID = 0018XXXXXXXXXXXX
HKCU\SOFTWARE\Microsoft\IdentityCRL\Immersive\production\Token\{...}
DeviceId = 0018XXXXXXXXXXXX
بايت ببايت نفس القيمة التي سجلها CDP في DDS حيًا. PUID حساب المستخدم الخاص بك هو رقم مختلف مخزن في مكان آخر كـ puid = 0003... (مثل 00034002XXXXXXXX). هناك أيضًا مفتاح تخزين مؤقت لـ HKLM مسمى باسم PUID (HKLM\SOFTWARE\Microsoft\IdentityCRL\NegativeCache\<PUID>_<userSID>)، لكن هذا خاص بـ SYSTEM فقط، لذا تقرأ القيمة من HKCU.
[!NOTE] البادئة تخبرك ما هو. PUIDs المستخدم هي فئة
0003، جهاز PUIDs هي فئة0018. GDID المحكمة (0018000FC8CB93CC) في مساحة0018لـ Device PUID، مثل جهازي.
[OBSERVED] ذاكرة التخزين المؤقت لرمز MSA (HKLM\SOFTWARE\Microsoft\IdentityCRL\NegativeCache\...) تحتوي على رموز جهاز مخصصة تمامًا لنقاط النهاية التي يستخدمها CDP:
scope=service::dds.microsoft.com::MBI_SSL_TOKEN_BROKER
scope=service::activity.windows.com::MBI_SSL_SA_TOKEN_BROKER
لذا فإن خدمة حساب Microsoft تسلم بيانات اعتماد الجهاز التي تصادق على تسجيل DDS وتحميلات النشاط التي تحمل GDID.
flowchart TD
subgraph MSA["طبقة هوية MSA: wlidsvc.dll"]
A1["توفير الجهاز مع login.live.com<br/>(Passport PPCRL SOAP)"] --> A2["الخادم يعين Device PUID<br/><ps:DevicePUID> / HWPUIDFlipped"]
A2 --> A3["تخزين DeviceId / LID = PUID<br/>HKLM\...\IdentityStore"]
A3 --> A4["إصدار رموز جهاز لـ<br/>dds.microsoft.com و activity.windows.com"]
end
subgraph CDP["عميل الرسم البياني للجهاز: cdp.dll / CDPSvc"]
B1["GetStableDeviceId -> يستقبل سلسلة PUID"] --> B2["RegisterUserDeviceAsync -> DDS<br/>OBSERVED: HTTP 200"]
end
subgraph SRV["خادم: Device Directory Service"]
C1["مفاتيح g:PUID لحساب MSA،<br/>النشاط وتاريخ IP"]
end
subgraph REP["الإبلاغ"]
D1["Delivery Optimization -><br/>UCDOStatus.GlobalDeviceId"]
end
A4 --> B1
B2 --> C1
C1 --> D1كل ما تثبته الشكوى على "GDID"، ثابت لكل تثبيت، يبقى بعد التحديثات، جديد عند إعادة التثبيت، مرتبط بحساب Microsoft، قابل للتتبع عبر IPs والتصفح، كل هذا ينتج عن كونه Device PUID لـ MSA معين من الخادم يسجله CDP في رسم الجهاز.
[OBSERVED] على جهاز مسجل الدخول إلى حساب Microsoft، قراءة سجل واحدة من خلية المستخدم الخاصة بك، لا حاجة لصلاحيات المسؤول:
(Get-ItemProperty 'HKCU:\SOFTWARE\Microsoft\IdentityCRL\ExtendedProperties').LID
سيعطيك هذا Device PUID الخاص بك كـ 16 رقمًا سداسيًا عشريًا (مثل 0018XXXXXXXXXXXX). لرؤيته بالشكل g:<عدد عشري> كما يظهر في جانب الخادم:
$hex = (Get-ItemProperty 'HKCU:\SOFTWARE\Microsoft\IdentityCRL\ExtendedProperties').LID
"g:$([Convert]::ToUInt64($hex,16))"
إذا كان ExtendedProperties\LID فارغًا على جهازك، نفس القيمة موجودة ضمن HKCU\SOFTWARE\Microsoft\IdentityCRL\Immersive\production\Token\{...}\DeviceId.
[!WARNING] لا تنشر قيمتك الخاصة. Device PUID الخاص بك، MSA CID الخاص بك (
0003...)، وSID المستخدم الخاص بك كلها تزيل إخفاء هويتك. قم بتنقيحها في أي شرح عام. القيمة الوحيدة الآمنة للاقتباس هي قيمة المحكمة، لأنها عامة بالفعل.
GDID موجود لأن جهازك مسجل في رسم جهاز حساب Microsoft و Connected Devices Platform يبقيه متزامن. لتقليله:
CDPSvc، CDPUserSvc) وأوقف تشغيل Activity History (الإعدادات، الخصوصية، سجل النشاط) لوقف مزامنة الرسم وتحميلات النشاط.%LOCALAPPDATA%\ConnectedDevicesPlatform يمسح فقط حالة CDP المحلية. PUID يعود مباشرة من مخزن الهوية، لذا هذا وحده لن ينجح.كل هذا جاء من جهاز ويندوز 11 قياسي (build 26200).
Microsoft.Windows.CDP.*) عبر logman أثناء إجبار تسجيل CDPSvc جديد، تم فك تشفيرها باستخدام tracerpt.IdentityStore و IdentityCRL تحت HKLM\SOFTWARE\Microsoft.ETW والتحليل الثابت هو ما نجح بالفعل. الوكيل سيضيع وقتك فقط.
تم حسابها باستخدام تجزئة اسم EventSource (SHA1 لمساحة الاسم بالإضافة إلى اسم الموفر بأحرف كبيرة UTF-16BE). تحقق منها مقابل القيمة المعروفة لـ System.Runtime 49592c0f-5a05-516d-aa4b-a64e02026c89:
Microsoft.Windows.CDP.Core {7762de0c-b0a6-571a-68d3-c018bf009496}
Microsoft.Windows.CDP.Core.Error {a1ea5efc-402e-5285-3898-22a5acce1b76}
Microsoft.Windows.CDP.CDS {dfa6e32a-095f-5f57-d025-0887d33507a1}
Microsoft.Windows.CDP.Aggr {bc1826c8-369c-5b0b-4cd1-3c6ae5bfe2e7}
Microsoft.Windows.CDP.AFS {5fe36556-c4cd-509a-8c3e-2a547ea568ae}
Microsoft.Windows.CDP.OnecoreAccountProvider {4ee5bf9a-3e8f-540b-8bfb-12457a2854b6}
Microsoft.Windows.CDP {9f4cc6dc-1bab-5772-0c71-a89954718d66}
[!NOTE] NullZeroX على تويتر أخبرني أن GDID يتم إرساله أيضًا بغض النظر عن تسجيل الدخول بحساب Microsoft على جهازك. لست متأكدًا من مدى صحة ذلك، لكن يجدر أخذه في الاعتبار.
تحليل مباشر. التصحيحات مرحب بها. شكرًا أيضًا لـ claude للمساعدة في هذا الشرح والرسوم البيانية :3
| القيمة | سداسي عشري (64 بت) | بادئة الفئة |
|---|
| جهازي (منقح) | g:XXXXXXXXXXXXXXXX | 0x0018XXXXXXXXXXXX | 0018 |
| معروض المحكمة | g:6755467234350028 | 0x0018000FC8CB93CC | 0018 |
| الملف الثنائي | الدور | الرموز البارزة |
|---|
wlidsvc.dll | خدمة Microsoft Account / Passport، تسك Device PUID | CDeviceIdentityBase::CreateNewDeviceIdentity, CAssociateDeviceRequest::ParseResponseBody, DeviceIdStore::LogToRegistry |
cdp.dll | Connected Devices Platform، تسجل PUID في DDS | DdsRegistrationClient, GetStableDeviceIdFromProvider (0x0A3140), OnGetStableDeviceIdCompleted (0x06CEA0) |
dosvc.dll / DO | تبلغ عن المعرف كـ UCDOStatus.GlobalDeviceId | غير متاح |
السجل: HKLM\SOFTWARE\Microsoft\IdentityStore (DeviceId و LID)، HKLM\SOFTWARE\Microsoft\IdentityCRL\NegativeCache (نطاقات الرموز).