EreTIk's Box » Cтатьи, исходники » Сюрпризы от Windows 10 build 17133: маска для NtBuildNumber


Этой небольшой заметкой хочу открыть серию, которая будет описывать сюрпризы Windows 10 build 17133 для Kernel- разработчика.


Есть такая недокументированная (но экспортируемая) переменная ядра: NtBuildNumber. Эта переменная, как нетрудно догадаться из названия, содержит номер сборки ядра Windows. Засада в том, что в этой переменной старшие биты отведены под флаги, а для получения номера сборки нужно на значение этой переменной наложить маску. В Windows Internals 5 Edition, например, предлагают производить операцию логического и с константой 0x3FFF. И именно так (раньше) поступала системная функция PsGetVersion:


0:000> u PsGetVersion L b ntoskrnl!PsGetVersion: 00000000`0051b9f0 4885c9 test rcx,rcx 00000000`0051b9f3 7406 je ntoskrnl!PsGetVersion+0xb (00000000`0051b9fb) 00000000`0051b9f5 c70105000000 mov dword ptr [rcx],5 00000000`0051b9fb 4885d2 test rdx,rdx 00000000`0051b9fe 7406 je ntoskrnl!PsGetVersion+0x16 (00000000`0051ba06) 00000000`0051ba00 c70202000000 mov dword ptr [rdx],2 00000000`0051ba06 4d85c0 test r8,r8 00000000`0051ba09 740e je ntoskrnl!PsGetVersion+0x29 (00000000`0051ba19) 00000000`0051ba0b 8b050f3c0900 mov eax,dword ptr [ntoskrnl!NtBuildNumber (00000000`005af620)] 00000000`0051ba11 25ff3f0000 and eax,3FFFh 00000000`0051ba16 418900 mov dword ptr [r8],eax
0:000> lm vm ntoskrnl start end module name 00000000`00400000 00000000`00897000 ntoskrnl Loaded symbol image file: ntoskrnl.exe Image name: ntoskrnl.exe Timestamp: Tue Oct 19 18:24:13 2010 (4CBDB81D) CheckSum: 0046165F ImageSize: 00497000 File version: 5.2.3790.4789 Product version: 5.2.3790.4789 File flags: 0 (Mask 3F) File OS: 40004 NT Win32 File type: 1.0 App File date: 00000000.00000000 Translations: 0409.04b0 CompanyName: Microsoft Corporation ProductName: Microsoft® Windows® Operating System InternalName: ntkrnlmp.exe OriginalFilename: ntkrnlmp.exe ProductVersion: 5.2.3790.4789 FileVersion: 5.2.3790.4789 (srv03_sp2_gdr.101019-0340) FileDescription: NT Kernel & System LegalCopyright: © Microsoft Corporation. All rights reserved.

А проблема достаточно очевидна: маска 3FFFh меньше номера сборки новой Windows 10 - 17133:

0:000> ? 3FFF Evaluate expression: 16383 = 00000000`00003fff

Поэтому, если у вас в закромах остался старый код, использующий недокументированную nt!NtBuildNumber, то может пришла пора переписать его на вызов RtlGetVersion? Если же использование nt!NtBuildNumber для вас милее, то нужно заменить маску на 0xFFFFFFF. В ядре 10.0.17133, например, уже нет внутренних ссылок на NtBuildNumber:

0:000> uf PsGetVersion ntoskrnl!PsGetVersion: 0053e12e 8bff mov edi,edi 0053e130 55 push ebp 0053e131 8bec mov ebp,esp 0053e133 8b4508 mov eax,dword ptr [ebp+8] 0053e136 85c0 test eax,eax 0053e138 7406 je ntoskrnl!PsGetVersion+0x12 (0053e140) Branch ntoskrnl!PsGetVersion+0xc: 0053e13a c7000a000000 mov dword ptr [eax],0Ah ntoskrnl!PsGetVersion+0x12: 0053e140 8b450c mov eax,dword ptr [ebp+0Ch] 0053e143 85c0 test eax,eax 0053e145 7518 jne ntoskrnl!PsGetVersion+0x31 (0053e15f) Branch ntoskrnl!PsGetVersion+0x19: 0053e147 8b4510 mov eax,dword ptr [ebp+10h] 0053e14a 85c0 test eax,eax 0053e14c 7516 jne ntoskrnl!PsGetVersion+0x36 (0053e164) Branch ntoskrnl!PsGetVersion+0x20: 0053e14e 8b4d14 mov ecx,dword ptr [ebp+14h] 0053e151 85c9 test ecx,ecx 0053e153 0f854b490800 jne ntoskrnl!PsGetVersion+0x84976 (005c2aa4) Branch ntoskrnl!PsGetVersion+0x2b: 0053e159 32c0 xor al,al 0053e15b 5d pop ebp 0053e15c c21000 ret 10h ntoskrnl!PsGetVersion+0x31: 0053e15f 832000 and dword ptr [eax],0 0053e162 ebe3 jmp ntoskrnl!PsGetVersion+0x19 (0053e147) Branch ntoskrnl!PsGetVersion+0x36: 0053e164 c700ed420000 mov dword ptr [eax],42EDh 0053e16a ebe2 jmp ntoskrnl!PsGetVersion+0x20 (0053e14e) Branch ntoskrnl!PsGetVersion+0x84976: 005c2aa4 a1f8926800 mov eax,dword ptr [ntoskrnl!CmCSDVersionString (006892f8)] 005c2aa9 8901 mov dword ptr [ecx],eax 005c2aab a1fc926800 mov eax,dword ptr [ntoskrnl!CmCSDVersionString+0x4 (006892fc)] 005c2ab0 894104 mov dword ptr [ecx+4],eax 005c2ab3 e9a1b6f7ff jmp ntoskrnl!PsGetVersion+0x2b (0053e159) Branch

ΞρεΤΙκ