
Windows Hello PIN को प्रवेश के समय कैप्चर करता है, LogonUI.exe में DLL इंजेक्ट करके जो NgcSerializeConvenienceCredential पर CPU हार्डवेयर ब्रेकपॉइंट सेट करता है, साथ ही एक WHFB/NGC/TPM एन्यूमरेटर भी।
ऐसे होस्ट पर जहाँ Windows Hello VBS/VSM (VTL1 में एक पृथक NgcIso कंटेनर) + एक TPM द्वारा संरक्षित है, वहाँ PIN ऑफ़लाइन पुनर्प्राप्त करने योग्य नहीं है और ऑनलाइन ब्रूट-फ़ोर्स को सुरक्षित-कर्नेल ट्रस्टलेट द्वारा अवरुद्ध कर दिया जाता है। एकमात्र विश्वसनीय मार्ग प्रवेश-के-समय कैप्चर है।
यह प्रोजेक्ट LogonUI.exe के भीतर टाइप किए गए PIN को पैकेज करने वाले फ़ंक्शन पर एक CPU हार्डवेयर ब्रेकपॉइंट रखकर, एक Vectored Exception Handler में फँसे थ्रेड कॉन्टेक्स्ट से आर्ग्युमेंट पढ़कर, और मूल, अपरिवर्तित निर्देश को निष्पादित होने देकर PIN को कैप्चर करता है, ताकि PIN लॉगिन सामान्य रूप से सफल होता रहे।
यह Get-WHFBKeys.ps1 भी प्रदान करता है, जो एक पूर्ण WHFB/NGC/TPM गणना और कुंजी-सामग्री हार्वेस्टर है।
Intel fTPM 2.0 और VBS चालू के साथ Windows 11 26200 (Home) पर एंड-टू-एंड सत्यापित।
| देखी गई सुरक्षा | परिणाम |
|---|---|
VBS / VSM चालू (Win32_DeviceGuard VBS स्थिति = 2, LsaIso.exe मौजूद) | कुंजी पदानुक्रम VTL1 (सुरक्षित कर्नेल) में रहता है, VTL0 में SYSTEM से अगम्य |
NgcIso कंटेनर (Container.json में NgcIsoHeader_… / NgcSvc में लोड किए गए प्रोटेक्टर ब्लॉब्स NgcIsoCtnr.dll) | PIN रहस्य ट्रस्टलेट के भीतर अनसील होता है, सामान्य यूज़र मोड में नहीं |
TPM-सील्ड मास्टर सामग्री (Container.json में srk, impl कुंजी प्रकार) | डिस्क पर कोई सादा-पाठ कुंजी नहीं, अनसील के लिए TPM आवश्यक |
एंटी-हैमरिंग (Protectors.json में softLockoutAttemptLimit = 5, sealedLockoutAuth) | ऑनलाइन अनुमान लॉकआउट कर देता है, काउंटर VTL1 द्वारा लागू होता है, डिस्क से रीसेट करने योग्य नहीं |
लॉक-स्क्रीन / साइन-इन पर, PIN LogonUI.exe द्वारा होस्ट किए गए NGC क्रेडेंशियल प्रदाता में टाइप किया जाता है (SYSTEM के रूप में चलता है, PPL नहीं, माँग पर स्पॉन किया जाता है)। प्रदाता टाइप किए गए PIN को ngckeyenum.dll!NgcSerializeConvenienceCredential को सौंपता है, जिसका arg1 (RCX) इनकी ओर इंगित करता है:
struct { // arg1
uint64_t type; // 1 (convenience-PIN credential)
void* buffer; // -> ASCII PIN, e.g. 0x32 0x30 0x30 0x32 = "2002" example PIN
uint32_t length; // digit count (e.g. 4)
};
// arg2 = full NGC key name "S-1-5-...-1001/<container-guid>//<key-guid>"
// arg3 = username, arg4 = computername, arg5 = SID, arg6 = "Negotiate"
NgcSerializeConvenienceCredential (या NgcPackAuthBuffer) की क्लासिक इनलाइन/ट्रैम्पोलिन हुकिंग सीरियलाइज़्ड लॉगऑन क्रेडेंशियल को भ्रष्ट कर देती है। लक्षण गंभीर और मौन होता है: साइन-इन स्क्रीन बिना किसी त्रुटि के बस पुनः लोड हो जाती है, सही PIN अस्वीकार कर दिया जाता है, और बार-बार अस्वीकृति PIN को सॉफ्ट-लॉक कर देती है (पासवर्ड साइन-इन के लिए बाध्य करती है)। NgcSvc को जबरन-किल करना भी इसी तरह कंटेनर को बाधित करता है।
हमें एक कैप्चर प्रिमिटिव की आवश्यकता है जो लक्ष्य फ़ंक्शन के कोड या नियंत्रण प्रवाह के एक भी बाइट को बदले बिना आर्ग्युमेंट को पढ़े।
ngccap.dll (देखें src/ngccap.c) को LogonUI.exe में इंजेक्ट किया जाता है और यह:
एक CPU हार्डवेयर एक्ज़ीक्यूट ब्रेकपॉइंट सशस्त्र करता है। यह
ngckeyenum!NgcSerializeConvenienceCredential को रिज़ॉल्व करता है, फिर प्रक्रिया के प्रत्येक थ्रेड पर DR0 = लक्ष्य और
DR7 = L0 | exec | len-1 सेट करता है (CreateToolhelp32Snapshot → OpenThread → SuspendThread → GetThreadContext /
SetThreadContext के साथ CONTEXT_DEBUG_REGISTERS → ResumeThread के माध्यम से)।
वेक्टर्ड एक्सेप्शन हैंडलर में ट्रैप को संभालता है। जब फ़ंक्शन में प्रवेश होता है, CPU निर्देश निष्पादित करने से पहले EXCEPTION_SINGLE_STEP उत्पन्न करता है। VEH ContextRecord->Rip == target की जाँच करता है, Rcx → {buffer, length} पढ़ता है, ASCII PIN को कॉपी करता है, फिर:
EFlags में Resume Flag (RF) सेट करता है ताकि ब्रेकपॉइंट तुरंत फिर से ट्रिगर न हो, औरEXCEPTION_CONTINUE_EXECUTION लौटाता है।मूल निर्देश बिना किसी परिवर्तन के चलता है। चूँकि कोई कोड पैच नहीं किया गया और कोई ट्रैम्पोलिन/अतिरिक्त स्टैक फ़्रेम नहीं जोड़ा गया, NgcSerializeConvenienceCredential ठीक वैसे ही निष्पादित होता है जैसे वह होता। क्रेडेंशियल सही ढंग से बनता है, LSA इसे स्वीकार करता है, और PIN लॉगिन सामान्य रूप से सफल होता है।
स्वयं-सफ़ाई करता है। पहले कैप्चर के बाद DLL सभी थ्रेड्स पर DR0/DR7 साफ़ कर देता है और VEH हटा देता है, जिससे प्रक्रिया पूरी तरह साफ़ रहती है।
WHFB-PIN-Capture/
├─ README.md
├─ Get-WHFBKeys.ps1 # WHFB/NGC/TPM enumerator + key-material harvester
└─ src/
├─ ngccap.c # HW-breakpoint capture DLL
├─ build.bat # cl.exe build (MSVC 2022 Build Tools)
└─ logonui_watch.ps1 # injects ngccap.dll into LogonUI on sight
SeDebugPrivilege सक्षम करता है)। LogonUI SYSTEM के रूप में चलता है
लेकिन PPL नहीं है, इसलिए एक उन्नत व्यवस्थापक टोकन इसे खोल और इंजेक्ट कर सकता है।:: 1) build the capture DLL
cd src
build.bat
:: 2) start the injector (elevated admin PowerShell)
powershell -ExecutionPolicy Bypass -File .\logonui_watch.ps1
3) Lock the workstation (Win+L) and sign back in with your PIN, it works normally.
4) Read the captured PIN:
type C:\Windows\Temp\pin_capture.log
-> >>> PIN CAPTURED = "1234"
पथ कॉन्फ़िगर करने योग्य हैं: ngccap.c के शीर्ष पर LOGPATH और logonui_watch.ps1 में $plog
का मेल खाना चाहिए (डिफ़ॉल्ट C:\Windows\Temp\pin_capture.log)।
Get-WHFBKeys.ps1 TPM स्थिति, डिवाइस-जॉइन / NGC प्रोविज़निंग, WHFB नीति, डिस्क पर मौजूद
NGC कंटेनर स्टोर (कंटेनर → प्रोटेक्टर → कुंजियाँ, स्वयं को SYSTEM तक उन्नत करते हुए), NCrypt कुंजियाँ
(Passport KSP / Platform Crypto Provider / Software KSP सार्वजनिक-कुंजी निर्यात के साथ), और बायोमेट्रिक
नामांकन की रिपोर्ट करता है, एक JSON रिपोर्ट उत्सर्जित करते हुए। यह कभी भी निजी कुंजियाँ नहीं निकालता (TPM-सील्ड, गैर-निर्यातयोग्य);
यह सार्वजनिक कुंजियाँ, मेटाडेटा और डिस्क पर मौजूद प्रोटेक्टर ब्लॉब्स को डंप करता है।
powershell -ExecutionPolicy Bypass -File .\Get-WHFBKeys.ps1 -DumpBlobs -OutDir .\out
ऑफ़लाइन और ब्रूट-फ़ोर्स पथ बंद दिखाए गए, और PIN को तब कैप्चर किया गया जब मालिक ने सही PIN के साथ सामान्य रूप से साइन इन किया हार्डवेयर-ब्रेकपॉइंट DLL का उपयोग करके।
केवल शैक्षिक और अधिकृत सुरक्षा-अनुसंधान उपयोग के लिए। कोई वारंटी नहीं।