До Windows 8.1 операции приостановки и возобновления нити контролировались одной маской доступа, что отражает статья Thread Security and Access Rights:
И это подтверждалось телом функции NtResumeThread (6.2.9200.16384):
mov edx,2
mov rcx,r10
call ObReferenceObjectByHandleWithTag
Но в ядре Windows 8.1 маска доступа сменилась (6.3.9600.16384):
mov edx,000001000
mov rcx,r10
call ObReferenceObjectByHandleWithTag
test eax,eax
js .00000001`403B2F3C
...
; .00000001`403B2F3C:
add rsp,040
pop rbx
retn
Что характерно, новое ядро полностью потеряло совместимость со старой маской доступа. Новую константу 0x1000 можно найти в wdm.h от WDK 8.1:
#define THREAD_RESUME (0x1000)
MSDN про новый флаг ничего не рассказывает, но есть косвенное упоминание у Alex Ionescu в статье The Evolution of Protected Processes Part 2: Exploit/Jailbreak Mitigations, Unkillable Processes and Protected Services:
Остается только порадоваться, что теперь операции приостановки и возобновления нити являются разными с точки зрения безопасности.
ΞρεΤΙκ