【发布时间】:2017-06-13 14:13:15
【问题描述】:
我正在尝试使用一个名为 PsGetContextThread 的未记录函数从驱动程序中检索用户模式线程的上下文,我知道这可以从用户模式执行,但我有理由从内核执行此操作,这是不可协商的,所以请不要绕道。现在回到主题,调试时下面的代码包含一个有效的线程,一切对我来说看起来都很好,但它返回无效,错误代码 C0000005 是 ACCESS_VIOLATION 但我不知道这段代码如何触发它,并希望得到一些帮助这是因为我已经被困了很长一段时间了。
NTSTATUS GetThreadContext(PETHREAD thread) {
KPROCESSOR_MODE mode = UserMode;
CONTEXT context;
UNICODE_STRING setContextString, getContextString;
pPsGetContextThread PsGetContextThread;
NTSTATUS status = STATUS_SUCCESS;
RtlInitUnicodeString(&getContextString, L"PsGetContextThread");
RtlZeroMemory(&context, sizeof(CONTEXT));
PsGetContextThread = (pPsGetContextThread)MmGetSystemRoutineAddress(&getContextString);
context.ContextFlags = CONTEXT_FULL;
status = PsGetContextThread(thread, &context, mode);
if (!NT_SUCCESS(status)) {
return STATUS_UNSUCCESSFUL;
}
return STATUS_SUCCESS;
}
如果有人知道接下来要尝试什么或有任何建议,请在下面发布。
【问题讨论】:
-
只是为了了解您的工作:您使用 undocumented 函数,该函数旨在从 user 模式调用,从 kernel 模式。你想知道为什么它不起作用?注意到什么了吗?
-
@Olaf 你错了,PsGetContextThread 不应该从用户模式调用......它是内核导出的一部分,可以由驱动程序调用。指向函数的指针是有效的,它的调用本身在状态变量中返回 ACCESS_VIOLATION
-
我怀疑问题在于您传递的是内核模式地址
&context,但指定了UserMode。当UserMode被指定时,PsGetContextThread做的第一件事就是检查&context是一个有效的用户模式指针。请尝试指定KernelMode。 -
@HarryJohnston - 是的,你绝对正确,在
&context的内核模式地址中指定了UserMode的问题。但是指定KernelMode而是根据意义将 for 作为另一个上下文。如果我们正好需要UserMode- 首先需要分配用户模式地址并使用它
标签: c windows driver internals