Доброго времени суток. Сегодня разбирал win32k.sys. На глаза попались три сервиса: NtUserCallNoParam NtUserCallOneParam NtUserCallTwoParam Оказывается это расширенные сервисы. Вот прототип NtUserCallOneParam(): NtUserCallOneParam( IN DWORD Parameter, IN ULONG Service ):ULONG Он помешает в стек параметр и передаёт управление на обработчик из таблицы, который индексируется пар. Service. Взглянув на обработчики из таблицы, заметил что если вызывающий поток не принадлежит csrss.exe, то при передаче указателей выполняются проверки валидности памяти, а если поток принадлежит csrss то никакие проверки не выполняются. Чтобы выполнить код в процессе csrss необходимы отладочные привилегии. Вот один из сервисов: Код (Text): Service38h: mov edi,edi push ebp mov ebp,esp push esi call ntoskrnl.PsGetCurrentProcess cmp eax,dword ptr ds:[1B6DA4] ;CsrssProcess:PEPROCESS jnz short 00127375 test byte ptr ds:[7FFE02D0],10 ;KUSER_SHARED_DATA.SuiteMask, default je short 00127375 mov esi,dword ptr ds:[1B80A0] test esi,esi je short 0012736E mov ecx,dword ptr ds:[1A85E4] ;54h mov eax,ecx push edi mov edi,dword ptr ss:[ebp+8] shr ecx,2 rep movs dword ptr es:[edi],dword ptr ds:[esi] mov ecx,eax and ecx,3 rep movs byte ptr es:[edi],byte ptr ds:[esi] xor eax,eax pop edi jmp short 0012737A 0012736E: mov eax,C000000E jmp short 0012737A 00127375: mov eax,C0000022 0012737A: pop esi pop ebp ret 4 [1B80A0]: bf9a80a0 bf9a99e0 00000000 00000000 81f90ab0 bf9a80b0 81ea6b50 00000000 00000000 00000000 bf9a80c0 00000000 00000000 00000000 00000000 bf9a80d0 00000000 00000000 00000000 Тоесть если вызвать этот сервис в контексте процесса csrss, то будет возможность заполнить произвольную область ядерной памяти таблицей(1B80A0). Я не проверял ещё это, но работать должно. Вопрос в том, как изменить этим какието данные(ntos и др.) так, чтобы можно было получить доступ в KernelMode.