Kernel mode - PsGetCurrentProcessId && PsGetCurrentProcess bad docs

alex golunov 0 Reputation points
2025-06-05T07:34:44.51+00:00

в ходе написания драйвера столкнулся с необходимостью скрыть импорты. начал писать импретацию функций PsGetCurrentProcessId и PsGetProcessId(PsGetCurrentProcess()). обнаружил ошибку вроде как две функции по названию имеют один и тот же смысл но нет обратный реверс инженеринг показал обратное.

PsGetCurrentProcessId имеет следующий asm код

mov rax, gs:188

mov rax, [rax+4C8h] //ETHREAD::Cid

ret

проблема в данной функции что она берет process id из cid а точнее из какого процесс был создан поток.

PsGetCurrentProcess функция имеет правильный код тем самым она берет Process структуру из apc state вот asm code

mov rax, gs:188h

mov rax, [rax+0B8h] //KTHREAD::ApcState.Process

ret

получается что функция PsGetCurrentProcess берет текущий процесс из apc state который меняется зависимо переключения контекста. получается что если наш ядерный поток подключен к адресному пространству процесса то у него apcState будет указывать на процесс к которому подключен получается что абсолютно два разных вызова получение текущего proc id будут возвращать разные id.

C++
C++
A high-level, general-purpose programming language, created as an extension of the C programming language, that has object-oriented, generic, and functional features in addition to facilities for low-level memory manipulation.
3,960 questions
0 comments No comments
{count} votes

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.