
विंडोज़ नोटिफिकेशन सुविधा के लिए C# यूटिलिटीज़
यह Windows Notification Facility (WNF) टूल्स के लिए रिपॉज़िटरी है। वर्तमान में, Alex Ionescu (@aionescu) और Gabrielle Viala (@pwissenlit) द्वारा विकसित wnfun में टूल्स का C# पोर्ट अपलोड किया गया है। जब मैं Windows Notification Facility के लिए अतिरिक्त टूल्स विकसित करूँगा, तो वे यहाँ अपलोड किए जाएँगे।
यह टूल WNF स्टेट नेम्स के बारे में जानकारी डंप या हेरफेर करता है। wnfdump.exe और WnfDump.py के समकक्ष। मैंने मूल टूल में कुछ अपडेट किए हैं (एक्सेप्शन हैंडलिंग, वेल-नोन स्टेट नेम और नया WNF_DATA_SCOPE सदस्य)।
अपने होस्ट पर सभी वेल-नोन, परमानेंट और पर्सिस्टेंट WNF स्टेट नेम्स की जानकारी प्राप्त करने के लिए, -d (--dump) फ्लैग के साथ निष्पादित करें:```
PS C:\Dev> .\SharpWnfDump.exe -d
| WNF_WEBA_CTAP_DEVICE_STATE | S | W | N | RW | I | 0 | 12 | 0 | | WNF_WEBA_CTAP_DEVICE_CHANGE_NOTIFY | S | W | N | RW | I | 0 | 4 | 0 | | WNF_PNPA_DEVNODES_CHANGED | S | W | N | RO | U | 0 | 0 | 11 |
--snip--
To show only state name used in system, set `-u` (`--used`) flag.
This flag can be applied to `-d` and `-b` option:
सिस्टम में उपयोग किए गए केवल state नाम दिखाने के लिए, `-u` (`--used`) फ़्लैग सेट करें।
यह फ़्लैग `-d` और `-b` विकल्पों पर लागू किया जा सकता है:```
PS C:\Dev> .\SharpWnfDump.exe -d -u
| WNF State Name [WellKnown Lifetime] | S | L | P | AC | N | CurSize | MaxSize | Changes |
----------------------------------------------------------------------------------------------------------------------
| WNF_PNPA_DEVNODES_CHANGED | S | W | N | RO | U | 0 | 0 | 140 |
| WNF_AUDC_RENDER | S | W | N | RO | U | 4096 | 4096 | 7 |
| WNF_AUDC_CAPTURE | S | W | N | RO | U | 4096 | 4096 | 1 |
| WNF_AUDC_SPATIAL_STATUS | S | W | N | RO | U | 4096 | 4096 | 3 |
--snip--
यदि आप Security Descripter जानकारी प्राप्त करना चाहते हैं, तो -s (--sid) फ्लैग सेट करें:```
PS C:\Dev> .\SharpWnfDump.exe -d -s
| WNF_WEBA_CTAP_DEVICE_STATE | S | W | N | RW | I | 0 | 12 | 0 |
D:(A;;CCDC;;;SY)(A;;CCDC;;;BA)(A;;CCDC;;;S-1-5-80-242729624-280608522-2219052887-3187409060-2225943459)(A;;CC;;;AU)(A;;CC;;;AC)
| WNF_WEBA_CTAP_DEVICE_CHANGE_NOTIFY | S | W | N | RW | I | 0 | 4 | 0 |
D:(A;;CCDC;;;SY)(A;;CCDC;;;BA)(A;;CCDC;;;S-1-5-80-242729624-280608522-2219052887-3187409060-2225943459)(A;;CC;;;AU)(A;;CC;;;AC)
| WNF_PNPA_DEVNODES_CHANGED | S | W | N | RO | U | 0 | 0 | 11 |
D:(A;;CC;;;BU)(A;;CCDC;;;SY)
--snip--
यदि आप बफर डेटा प्राप्त करना चाहते हैं, तो `-v` (`--value`) या `-r` (`--read`) फ्लैग सेट करें।
इन फ्लैग्स का उपयोग `-s` फ्लैग के साथ किया जा सकता है:```
PS C:\Dev> .\SharpWnfDump.exe -d -v
| WNF State Name [WellKnown Lifetime] | S | L | P | AC | N | CurSize | MaxSize | Changes |
----------------------------------------------------------------------------------------------------------------------
| WNF_WEBA_CTAP_DEVICE_STATE | S | W | N | RW | I | 0 | 12 | 0 |
| WNF_WEBA_CTAP_DEVICE_CHANGE_NOTIFY | S | W | N | RW | I | 0 | 4 | 0 |
--snip--
| WNF_AUDC_RENDER | S | W | N | RO | U | 4096 | 4096 | 1 |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 | 01 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 | ........ ........
00000010 | 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 | ........ ........
00000020 | 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 | ........ ........
--snip--
अपने होस्ट पर सभी अस्थायी WNF State Names की जानकारी प्राप्त करने के लिए, -b (--brut) फ़्लैग के साथ निष्पादित करें:```
PS C:\Dev> .\SharpWnfDump.exe -b
| 0x41C64E6DA3AC3845 | S | T | N | RW | A | 8 | ? | 1 | | 0x41C64E6DA3AC4845 | S | T | N | RW | A | 8 | ? | 1 | | 0x41C64E6DA3AC6845 | S | T | N | RW | A | 8 | ? | 1 |
--snip--
The `-b` (`--brut`) फ़्लैग का उपयोग `-v` (`--value`) या `-r` (`--read`) फ़्लैग के साथ किया जा सकता है, लेकिन `-s` (`--sid`) फ़्लैग के साथ नहीं किया जा सकता।
`--dump` या `--brut` विकल्प के परिणामों से प्राप्त तालिका में प्रत्येक स्तंभ का अर्थ इस प्रकार है:
| Column Name | Description |
| :--- | :--- |
| `WNF State Name` | WNF स्टेट नाम यहाँ आउटपुट होते हैं |
| `S` | WNF स्टेट नाम के लिए डेटा स्कोप। प्रदर्शित अक्षरों के अर्थ इस प्रकार हैं:<br><br>+ `S` : सिस्टम स्कोप<br>+ `s` : सेशन स्कोप<br>+ `U` : उपयोगकर्ता स्कोप<br>+ `P` : प्रोसेस स्कोप<br>+ `M` : मशीन स्कोप<br>+ `p` : फिज़िकल मशीन स्कोप |
| `L` | WNF स्टेट नाम के लिए लाइफटाइम। प्रदर्शित अक्षरों के अर्थ इस प्रकार हैं:<br><br>+ `W` : वेल-नोन<br>+ `P` : परमानेंट<br>+ `V` : पर्सिस्टेंट (वोलेटाइल)<br>+ `T` : टेम्परेरी |
| `P` | प्रदर्शित करता है कि WNF स्टेट नाम स्थायी है या नहीं:<br><br>+ `Y` : हाँ<br>+ `N` : नहीं |
| `AC` | WNF स्टेट नाम के लिए एक्सेस नियंत्रण:<br><br>+ `RW` : पठनीय और लिखने योग्य<br>+ `RO` : केवल पठनीय<br>+ `WO` : केवल लिखने योग्य<br>+ `NA` : न पठनीय और न लिखने योग्य |
| `N` | सब्सक्राइबर की उपस्थिति प्रदर्शित करता है:<br><br>+ `A` : सब्सक्राइबर मौजूद है<br>+ `I` : कोई सब्सक्राइबर मौजूद नहीं है<br>+ `U` : अज्ञात |
| `CurSize` | यह संख्या WNF स्टेट नाम के लिए उपयोग किए गए वर्तमान बफर आकार को दर्शाती है। |
| `MaxSize` | यह संख्या WNF स्टेट नाम के लिए उपयोग किए जा सकने वाले अधिकतम बफर आकार को दर्शाती है। |
| `Changes` | यह संख्या दर्शाती है कि कितनी बार अपडेट किया गया। |
यदि आप किसी विशिष्ट WNF स्टेट नाम के बारे में जानकारी प्राप्त करना चाहते हैं, तो `SharpWnfDump.exe` को `-i` (`--info`) विकल्प के साथ निम्नानुसार निष्पादित करें:```
PS C:\Dev> .\SharpWnfDump.exe -i WNF_SHEL_APPRESOLVER_SCAN
| WNF State Name | S | L | P | AC | N | CurSize | MaxSize | Changes |
----------------------------------------------------------------------------------------------------------------------
| WNF_SHEL_APPRESOLVER_SCAN | S | W | N | RW | A | 4 | 4 | 1 |
-i (--info) विकल्प का उपयोग -v (--value), -r (--read), और -s (--sid) फ़्लैग के साथ किया जा सकता है:```
PS C:\Dev> .\SharpWnfDump.exe -i WNF_SHEL_APPRESOLVER_SCAN -s -v
| WNF_SHEL_APPRESOLVER_SCAN | S | W | N | RW | A | 4 | 4 | 1 |
D:(A;;CC;;;WD)(A;;CCDC;;;AU)(A;;CCDC;;;AC)
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 | 01 00 00 00 | ....
किसी विशिष्ट WNF State Name से डेटा पढ़ने के लिए, `-r` (`--read`) फ़्लैग का उपयोग इस प्रकार करें:```
PS C:\Dev> .\SharpWnfDump.exe -r WNF_SHEL_APPRESOLVER_SCAN
WNF_SHEL_APPRESOLVER_SCAN:
00000000 | 11 00 00 00 | ....
किसी विशिष्ट WNF State Name में डेटा लिखने के लिए, -w (--write) फ्लैग का उपयोग इस प्रकार करें (लिखने के लिए डेटा एक फ़ाइल के साथ प्रदान किया जाना चाहिए):```
PS C:\Dev> "hi" | Out-File -Encoding ascii -FilePath C:\Dev\test.txt
PS C:\Dev> Get-Content -Path C:\Dev\test.txt
hi
PS C:\Dev> .\SharpWnfDump.exe -w WNF_SHEL_APPRESOLVER_SCAN C:\Dev\test.txt
[>] Trying to write data. [] Target WNF Name : WNF_SHEL_APPRESOLVER_SCAN [] Data Source : C:\Dev\test.txt [+] Data is written successfully.
PS C:\Dev> .\SharpWnfDump.exe -i WNF_SHEL_APPRESOLVER_SCAN -r
| WNF_SHEL_APPRESOLVER_SCAN | S | W | N | RW | A | 4 | 4 | 2 |
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 | 68 69 0D 0A | hi..
### SharpWnfNameDumper
[वापस ऊपर](#sharpwnfsuite)
[प्रोजेक्ट](https://github.com/daem0nc0re/sharpwnfsuite/blob/main/SharpWnfSuite/SharpWnfNameDumper)
यह टूल DLL से Well-Known State Name डंप करता है (आमतौर पर perf_nt_c.dll)।
[WnfNameDumper.py](https://github.com/ionescu007/wnfun/blob/master/script_python/WnfNameDumper.py) के समकक्ष।
आमतौर पर, Well-Known State Names perf_nt_c.dll में निहित होते हैं (यह Windows Performance Analyzer में है)।
DLL से Well-Known State Names डंप करने के लिए, `SharpWnfNameDumper.exe` को `-d` (`--dump`) विकल्प के साथ निम्नानुसार चलाएँ:```
PS C:\Dev> .\SharpWnfNameDumper.exe -d perf_nt_c.dll
[>] Output results in C# style.
public enum WELL_KNOWN_WNF_NAME : ulong
{
WNF_9P_REDIRECTOR_STARTED = 0x41C61E54A3BC1075UL,
WNF_9P_UNKNOWN_DISTRO_NAME = 0x41C61E54A3BC0875UL,
--snip--
यदि आप Well-Known State Names के लिए विवरण डंप करना चाहते हैं, तो -v फ़्लैग सेट करें:```
PS C:\Dev> .\SharpWnfNameDumper.exe -d perf_nt_c.dll -v
[>] Output results in C# style.
public enum WELL_KNOWN_WNF_NAME : ulong { // The Plan 9 Redirector was started and is ready to accept requests. WNF_9P_REDIRECTOR_STARTED = 0x41C61E54A3BC1075UL, // The Plan 9 Redirector got a request for an unknown WSL distribution and there is no user callback registered to query it. WNF_9P_UNKNOWN_DISTRO_NAME = 0x41C61E54A3BC0875UL,
--snip--
आउटपुट प्रारूप निर्दिष्ट करने के लिए, `-f` (`--format`) विकल्प का उपयोग करें। `SharpWnfNameDumper.exe` C#, C (`-f c`) और Python (`-f py`) प्रारूप का समर्थन करता है (डिफ़ॉल्ट प्रारूप C# है):```
PS C:\Dev> .\SharpWnfNameDumper.exe -d perf_nt_c.dll -f py
[>] Output results in Python style.
g_WellKnownWnfNames = {
"WNF_9P_REDIRECTOR_STARTED": 0x41C61E54A3BC1075,
"WNF_9P_UNKNOWN_DISTRO_NAME": 0x41C61E54A3BC0875,
--snip--
परिणाम को फ़ाइल में आउटपुट करने के लिए, आउटपुट फ़ाइल पथ निर्दिष्ट करने हेतु -o (--output) विकल्प का उपयोग करें:```
PS C:\Dev> .\SharpWnfNameDumper.exe -d perf_nt_c.dll -o result.txt
[>] Output results in C# style.
C:\dev>type result.txt public enum WELL_KNOWN_WNF_NAME : ulong { WNF_9P_REDIRECTOR_STARTED = 0x41C61E54A3BC1075UL, WNF_9P_UNKNOWN_DISTRO_NAME = 0x41C61E54A3BC0875UL,
--snip--
2 DLLs से diff लेने के लिए, `-D` (`--diff`) विकल्प का उपयोग करें:```
PS C:\Dev> .\SharpWnfNameDumper.exe -D perf_nt_c_old.dll perf_nt_c_new.dll
[>] Output results in C# style.
################################################
# NEW KEYS #
################################################
public enum WELL_KNOWN_WNF_NAME : ulong
{
WNF_SHEL_CHAT_ICON_BADGE = 0x0D83063EA3B8A035UL,
WNF_SHEL_ENTERPRISE_START_PINS_POLICY_VALUE_CHANGED = 0x0D83063EA3B89475UL,
WNF_SHEL_FILE_EXPLORER_PINNED_FOLDERS = 0x0D83063EA3B8ACF5UL,
WNF_SHEL_MAC_AUTO_UPDATE_SUCCEEDED = 0x0D83063EA3B89875UL
}
यह एक WNF State Name को सब्सक्राइब करने का टूल है। यह wnfclient-rtl.exe और WnfClientServer.py के समकक्ष है।
उदाहरण के लिए, यदि आप WNF_SHEL_APPLICATION_STARTED की स्थिति की निगरानी करना चाहते हैं, तो SharpWnfClient.exe को इस प्रकार निष्पादित करें:```
PS C:\Dev> .\SharpWnfClient.exe WNF_SHEL_APPLICATION_STARTED
[>] Received data from server. [] Timestamp : 4 [] Buffer Size : 92 byte(s) [*] Data :
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 | 61 00 3A 00 6D 00 69 00-63 00 72 00 6F 00 73 00 | a.:.m.i. c.r.o.s.
00000010 | 6F 00 66 00 74 00 2E 00-77 00 69 00 6E 00 64 00 | o.f.t... w.i.n.d.
00000020 | 6F 00 77 00 73 00 74 00-65 00 72 00 6D 00 69 00 | o.w.s.t. e.r.m.i.
00000030 | 6E 00 61 00 6C 00 5F 00-38 00 77 00 65 00 6B 00 | n.a.l._. 8.w.e.k.
00000040 | 79 00 62 00 33 00 64 00-38 00 62 00 62 00 77 00 | y.b.3.d. 8.b.b.w.
00000050 | 65 00 21 00 61 00 70 00-70 00 00 00 | e.!.a.p. p...
फिर, यदि आप notepad एप्लिकेशन शुरू करते हैं, तो आपको निम्नलिखित परिणाम देखना चाहिए:```
[>] Received data from server.
[*] Timestamp : 5
[*] Buffer Size : 90 byte(s)
[*] Data :
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 | 61 00 3A 00 6D 00 69 00-63 00 72 00 6F 00 73 00 | a.:.m.i. c.r.o.s.
00000010 | 6F 00 66 00 74 00 2E 00-77 00 69 00 6E 00 64 00 | o.f.t... w.i.n.d.
00000020 | 6F 00 77 00 73 00 6E 00-6F 00 74 00 65 00 70 00 | o.w.s.n. o.t.e.p.
00000030 | 61 00 64 00 5F 00 38 00-77 00 65 00 6B 00 79 00 | a.d._.8. w.e.k.y.
00000040 | 62 00 33 00 64 00 38 00-62 00 62 00 77 00 65 00 | b.3.d.8. b.b.w.e.
00000050 | 21 00 61 00 70 00 70 00-00 00 | !.a.p.p. ..
यह उपकरण एक अस्थायी जीवनकाल वाला WNF State Name बनाता है और सब्सक्राइबर को कुछ संदेश भेजता है। यह wnfserver.exe और WnfClientServer.py के समतुल्य है।
नया WNF State Name सर्वर शुरू करने के लिए, बस SharpWnfServer.exe निष्पादित करें। हमें निम्नानुसार एक इंटरैक्टिव शेल में प्रवेश करना चाहिए:```
PS C:\Dev> .\SharpWnfServer.exe
[+] New WNF State Name is created successfully : 0x41C64E6DA3834945
Encoded State Name: 0x41C64E6DA3834945, Decoded State Name: 0x3F4931 Version: 1, Lifetime: Temporary, Scope: Machine, Permanent: NO, Sequence Number: 0x7E9, Owner Tag: 0x0
Sending input data to WNF subscriber...
[INPUT]>
`SharpWnfServer.exe` को निष्पादित करने के बाद, किसी अन्य टर्मिनल से `SharpWnfClient.exe` को `SharpWnfServer.exe` के साथ दिए गए WNF State Name के साथ निष्पादित करें। आपको `SharpWnfServer.exe` से संदेश के रूप में "Hello, world!" प्राप्त होना चाहिए:```
PS C:\Dev> .\SharpWnfClient.exe 0x41C64E6DA3834945
[>] Received data from server.
[*] Timestamp : 1
[*] Buffer Size : 13 byte(s)
[*] Data :
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 | 48 65 6C 6C 6F 2C 20 77-6F 72 6C 64 21 | Hello,.w orld!
अतिरिक्त संदेश SharpWnfClient.exe को प्रकाशित करने के लिए, अपना संदेश SharpWnfServer.exe के इंटरैक्टिव शेल में दर्ज करें:```
[INPUT]> This is WNF test
Sending input data to WNF subscriber...
[INPUT]>
फिर, आपको टर्मिनल में `SharpWnfClient.exe` के लिए निम्न संदेश दिखाई देना चाहिए:```
[>] Received data from server.
[*] Timestamp : 2
[*] Buffer Size : 16 byte(s)
[*] Data :
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 | 54 68 69 73 20 69 73 20-57 4E 46 20 74 65 73 74 | This.is. WNF.test
यह उपकरण modexp के wnfscan पर आधारित है, और प्रोसेस से WNF सदस्यता जानकारी डंप करता है।``` PS C:\Dev> .\SharpWnfScan.exe -h
SharpWnfScan - Tool for dumping WNF information from process.
Usage: SharpWnfScan.exe [Options]
-h, --help : Displays this help message.
-p, --pid : Specifies the target PID.
-P, --processname : Specifies the target process name.
-n, --name : Specifies a wnf state name for filtering.
-a, --all : Flag to dump information from all process.
-l, --list : Flag to list WNF State Name on this system.
-d, --debug : Flag to enable SeDebugPrivilege. Administrative privilege is required.
-v, --verbose : Flag to get verbose information.
किसी विशिष्ट प्रक्रिया को डंप करने के लिए, `-p` विकल्प इस प्रकार सेट करें:```
PS C:\Dev> .\SharpWnfScan.exe -p 5800
Process ID : 5800
Image File Name : C:\Windows\explorer.exe
Architecture : ARM64
WNF_SUBSCRIPTION_TABLE @ 0x0000000001206660
WNF_NAME_SUBSCRIPTION @ 0x0000000001206B00
StateName : 0x0280032EA3BC0875 (WNF_CMFC_FEATURE_CONFIGURATION_CHANGED)
WNF_NAME_SUBSCRIPTION @ 0x000000000120AD10
StateName : 0x418B1929A3BC3835 (WNF_DWM_DUMP_REQUEST)
WNF_NAME_SUBSCRIPTION @ 0x0000000005099950
StateName : 0x41960A2EA3BC1835 (WNF_CDP_CDPUSERSVC_READY)
--snip--
यदि आप WNF_USER_SUBSCRIPTION जानकारी प्राप्त करना चाहते हैं, तो -v फ्लैग निम्नानुसार सेट करें:```
PS C:\Dev> .\SharpWnfScan.exe -p 5800 -v
Process ID : 5800 Image File Name : C:\Windows\explorer.exe Architecture : ARM64
WNF_SUBSCRIPTION_TABLE @ 0x0000000001206660
WNF_NAME_SUBSCRIPTION @ 0x0000000001206B00
StateName : 0x0280032EA3BC0875 (WNF_CMFC_FEATURE_CONFIGURATION_CHANGED)
WNF_USER_SUBSCRIPTION @ 0x0000000001206A40
Callback @ 0x00007FFE88478470 (ntdll!RtlNotifyFeatureUsage+0x1C0)
Context @ 0x00007FFE886F0B20 (ntdll!NlsAnsiCodePage+0x2390)
WNF_NAME_SUBSCRIPTION @ 0x000000000120AD10
StateName : 0x418B1929A3BC3835 (WNF_DWM_DUMP_REQUEST)
WNF_USER_SUBSCRIPTION @ 0x0000000001207FD0
Callback @ 0x00007FF7073027C0 (explorer)
Context @ 0x0000000001208CC0 (N/A)
--snip--
आप `-P` विकल्प के साथ नाम से लक्षित प्रक्रियाओं को निर्दिष्ट कर सकते हैं:```
PS C:\Dev> .\SharpWnfScan.exe -P notepad
Process ID : 8720
Image File Name : C:\Program Files\WindowsApps\Microsoft.WindowsNotepad_11.2401.26.0_arm64__8wekyb3d8bbwe\Notepad\Notepad.exe
Architecture : ARM64
WNF_SUBSCRIPTION_TABLE @ 0x000001DE2B007560
WNF_NAME_SUBSCRIPTION @ 0x000001DE2B02D640
StateName : 0x41C61629A3BC2835 (WNF_DX_MONITOR_CHANGE_NOTIFICATION)
WNF_NAME_SUBSCRIPTION @ 0x000001DE2B03E040
StateName : 0x41950223A3BC1035 (WNF_NLS_USER_UILANG_CHANGED)
--snip--
राज्य नाम से फ़िल्टर करने के लिए, -n विकल्प में hex या ज्ञात wnf नाम स्ट्रिंग सेट करें जैसा कि निम्नानुसार है:```
PS C:\Dev> .\SharpWnfScan.exe -P notepad -n WNF_RPCF_FWMAN_RUNNING
Process ID : 8720 Image File Name : C:\Program Files\WindowsApps\Microsoft.WindowsNotepad_11.2401.26.0_arm64__8wekyb3d8bbwe\Notepad\Notepad.exe Architecture : ARM64
WNF_SUBSCRIPTION_TABLE @ 0x000001DE2B007560
WNF_NAME_SUBSCRIPTION @ 0x000001DE2B075040
StateName : 0x07851E3FA3BC0875 (WNF_RPCF_FWMAN_RUNNING)
PS C:\Dev> .\SharpWnfScan.exe -P notepad -n 0x07851E3FA3BC0875
Process ID : 8720 Image File Name : C:\Program Files\WindowsApps\Microsoft.WindowsNotepad_11.2401.26.0_arm64__8wekyb3d8bbwe\Notepad\Notepad.exe Architecture : ARM64
WNF_SUBSCRIPTION_TABLE @ 0x000001DE2B007560
WNF_NAME_SUBSCRIPTION @ 0x000001DE2B075040
StateName : 0x07851E3FA3BC0875 (WNF_RPCF_FWMAN_RUNNING)
एक समय में सभी प्रोसेस डंप करने के लिए, `-a` विकल्प का उपयोग करें:```
PS C:\Dev> .\SharpWnfScan.exe -a
Process ID : 1180
Image File Name : C:\Windows\System32\svchost.exe
Architecture : ARM64
WNF_SUBSCRIPTION_TABLE @ 0x000002101A806560
WNF_NAME_SUBSCRIPTION @ 0x000002101A830120
StateName : 0x07851E3FA3BC0875 (WNF_RPCF_FWMAN_RUNNING)
WNF_NAME_SUBSCRIPTION @ 0x000002101A86C1C0
StateName : 0x41C64E6DA3B0E045 (N/A)
WNF_NAME_SUBSCRIPTION @ 0x000002101A833C50
StateName : 0x41C64E6DA3BC6145 (N/A)
WNF_NAME_SUBSCRIPTION @ 0x000002101A846A50
StateName : 0x41C64E6DA3BD0945 (N/A)
WNF_NAME_SUBSCRIPTION @ 0x000002101A86CA00
StateName : 0x41C64E6DA3BB8045 (N/A)
WNF_NAME_SUBSCRIPTION @ 0x000002101A806A00
StateName : 0x0280032EA3BC0875 (WNF_CMFC_FEATURE_CONFIGURATION_CHANGED)
WNF_NAME_SUBSCRIPTION @ 0x000002101A86C4C0
StateName : 0x41C64E6DA3B1E045 (N/A)
WNF_NAME_SUBSCRIPTION @ 0x000002101A86C700
StateName : 0x41C64E6DA3A0F945 (N/A)
WNF_NAME_SUBSCRIPTION @ 0x000002101A830EE0
StateName : 0x4195003AA3BC0875 (WNF_WNS_CONNECTIVITY_STATUS)
WNF_NAME_SUBSCRIPTION @ 0x000002101A86C880
StateName : 0x41C6072FA3BC3875 (WNF_BI_APPLICATION_SERVICING_START_CHANNEL)
WNF_NAME_SUBSCRIPTION @ 0x000002101A86CC40
StateName : 0x41C6072FA3BC1875 (WNF_BI_USER_LOGOFF_CHANNEL)
WNF_NAME_SUBSCRIPTION @ 0x000002101A835E90
StateName : 0x41C6072FA3BC1075 (WNF_BI_USER_LOGON_CHANNEL)
WNF_NAME_SUBSCRIPTION @ 0x000002101A86CD00
StateName : 0x41C6072FA3BC2875 (WNF_BI_SESSION_DISCONNECT_CHANNEL)
WNF_NAME_SUBSCRIPTION @ 0x000002101A86CAC0
StateName : 0x41C6072FA3BC2075 (WNF_BI_SESSION_CONNECT_CHANNEL)
WNF_NAME_SUBSCRIPTION @ 0x000002101A86C940
StateName : 0x41840B3EA3BC2075 (WNF_SEB_NETWORK_STATE_CHANGES)
WNF_NAME_SUBSCRIPTION @ 0x000002101A853920
StateName : 0x41C6072FA3BC3075 (WNF_BI_APPLICATION_UNINSTALL_CHANNEL)
WNF_NAME_SUBSCRIPTION @ 0x000002101A836040
StateName : 0x41C6072FA3BC4875 (WNF_BI_LOCK_SCREEN_UPDATE_CHANNEL)
WNF_NAME_SUBSCRIPTION @ 0x000002101A86C580
StateName : 0x41C6072FA3BC4075 (WNF_BI_APPLICATION_SERVICING_STOP_CHANNEL)
WNF_NAME_SUBSCRIPTION @ 0x000002101A833B80
StateName : 0x41C6072FA3BC6075 (WNF_BI_QUIET_MODE_UPDATE_CHANNEL)
WNF_NAME_SUBSCRIPTION @ 0x000002101A86C400
StateName : 0x41C6072FA3BC5075 (WNF_BI_EVENT_DELETION)
Process ID : 2952
Image File Name : C:\Windows\System32\svchost.exe
Architecture : ARM64
WNF_SUBSCRIPTION_TABLE @ 0x0000023DD3A065C0
WNF_NAME_SUBSCRIPTION @ 0x0000023DD3AF8B80
StateName : 0x41C64E6DA3B1E045 (N/A)
WNF_NAME_SUBSCRIPTION @ 0x0000023DD3AF8C40
StateName : 0x41C64E6DA3BC6145 (N/A)
--snip--
SeDebugPrivilege को सक्षम करने के लिए, -d फ्लैग को इस प्रकार सेट करें।
इस विकल्प के लिए व्यवस्थापकीय विशेषाधिकार की आवश्यकता होती है:```
PS C:\Dev> .\SharpWnfScan.exe -d -P winlogon
[+] SeDebugPrivilege is enabled successfully.
Process ID : 680 Image File Name : C:\Windows\System32\winlogon.exe Architecture : ARM64
WNF_SUBSCRIPTION_TABLE @ 0x00000265F4E05F80
WNF_NAME_SUBSCRIPTION @ 0x00000265F4E48AE0
StateName : 0x41C64E6DA3BC6145 (N/A)
WNF_NAME_SUBSCRIPTION @ 0x00000265F4E27AD0
StateName : 0x41C61629A3BC1035 (WNF_DX_MODE_CHANGE_NOTIFICATION)
--snip--
लक्ष्य प्रणाली में उपयोग होने वाले WNF State Names की सूची बनाने के लिए, `-l` फ़्लैग इस प्रकार सेट करें:```
PS C:\Dev> .\SharpWnfScan.exe -l
[>] Trying to list WNF State Names used in this system. Wait a moment.
[1304 WNF State Names]
[*] 0x07851E3FA3BC0875 (WNF_RPCF_FWMAN_RUNNING)
[*] 0x41C64E6DA3B0E045 (N/A)
[*] 0x41C64E6DA3BC6145 (N/A)
[*] 0x41C64E6DA3BD0945 (N/A)
[*] 0x41C64E6DA3BB8045 (N/A)
[*] 0x0280032EA3BC0875 (WNF_CMFC_FEATURE_CONFIGURATION_CHANGED)
[*] 0x41C64E6DA3B1E045 (N/A)
--snip--
[16 Access Denied Processes]
[*] svchost (PID : 2352)
[*] svchost (PID : 4952)
[*] MsMpEng (PID : 3132)
--snip--
[*] Done.
यह उपकरण यह जाँचने के लिए है कि हमलावर कोड इंजेक्शन तकनीक के लिए WNF का दुरुपयोग कैसे कर सकते हैं:``` PS C:\Dev> .\SharpWnfInject.exe -h
SharpWnfInject - Tool to investigate WNF code injection technique.
Usage: SharpWnfInject.exe [Options]
-h, --help : Displays this help message.
-n, --name : Specifies WNF State Name to inject. Hex format or Well-known name format is accepted.
-p, --pid : Specifies PID to inject.
-i, --input : Specifies the file path to shellcode.
-d, --debug : Flag to enable SeDebugPrivilege. Requires administrative privilege.
[!] -n option is required.
यह टूल `WNF_USER_SUBSCRIPTION` में विशिष्ट WNF स्टेट नाम के लिए कॉलबैक फंक्शन पॉइंटर को ओवरराइट करता है।
कोड इंजेक्शन तकनीक सभी WNF स्टेट नाम के लिए काम नहीं करती है।
उदाहरण के लिए, यह तकनीक `explorer.exe` द्वारा Windows 11 23H2 में उपयोग किए जाने वाले `WNF_SHEL_WINDOWSTIP_CONTENT_PUBLISHED` के लिए उपलब्ध मानी जाती है।
इस तकनीक का परीक्षण करने के लिए, इस टूल को निम्नानुसार निष्पादित करें:```
PS C:\Dev> .\SharpWnfInject.exe -p 5800 -n WNF_SHEL_WINDOWSTIP_CONTENT_PUBLISHED -i .\notepad_arm64.bin
[*] Target WNF State Name is 0x0D83063EA3BE10F5 (WNF_SHEL_WINDOWSTIP_CONTENT_PUBLISHED).
[+] Got a handle from the target Process
[*] Process Name : explorer.exe
[*] Process ID : 5800
[*] Image File Name : C:\Windows\explorer.exe
[*] Architecture : ARM64
[+] Pointer for WNF_SUBSCRIPTION_TABLE is at 0x00007FFE886F4E20.
[+] WNF_SUBSCRIPTION_TABLE is at 0x0000000001206660.
[*] WNF_NAME_SUBSCRIPTION is at 0x0000000001273540.
[+] Got 1 WNF_USER_SUBSCRIPTION.
[*] Target callback pointer is at 0x00000000051C2250.
[*] Callback function is at 0x00007FFE54FD4D20 (twinui!DllGetClassObject+0x11AFF0).
[+] Shellcode buffer is at 0x0000000003270000.
[+] 344 bytes shellcode is written successfully.
[+] Callback pointer is overwritten successfully.
[>] Triggering shellcode.
[+] WNF State Data is updated successfully. Shellcode might be executed.
[+] Callback pointer is reverted successfully.
[*] Done.

यदि आप SeDebugPrivilege सक्षम करना चाहते हैं, तो -d फ़्लैग सेट करें और व्यवस्थापकीय विशेषाधिकार के साथ निष्पादित करें।
नोटपैड निष्पादित करने के लिए नमूना शेलकोड Shellcode निर्देशिका में स्थित हैं।
इस निर्देशिका में प्रोजेक्ट कर्नेल शोषण के लिए WNF प्रिमिटिव प्रदर्शित करने के लिए हैं। आप Alex Plaskett की वार्ता और ब्लॉग (भाग 1, भाग 2, स्लाइड) में विस्तृत जानकारी पढ़ सकते हैं।
PoC की विश्वसनीयता 100% नहीं है। मैंने Windows 10 x64 के सभी संस्करणों के लिए कर्नेल ऑफसेट परिभाषित किए हैं, लेकिन केवल Windows 10 Version 1903 x64 पर परीक्षण किया है।
| प्रोजेक्ट | विवरण |
|---|---|
| PoolVulnDrv | यह WNF कर्नेल प्रिमिटिव का परीक्षण करने के लिए एक कमजोर कर्नेल ड्राइवर है। |
| WnfPoolOverflow | यह PoolVulnDrv का शोषण करने के लिए एक PoC है। |

इस निर्देशिका में आपका स्वयं का WNF कॉलबैक शेलकोड बनाने के लिए दस्तावेज़ और नमूना कोड शामिल हैं। देखें README.md।
आपके शोध के लिए धन्यवाद:
आपकी सहायता के लिए धन्यवाद: