- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用一个名为 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;
}
如果有人知道下一步要尝试什么或有任何建议,请在下面发帖。
最佳答案
是的,@HarryJohnston 说得对,当我们指定 UserMode
PsGetContextThread
时,检查 &context
是一个有效的用户模式指针。所以我们需要为此传递有效的用户模式指针。我们可以通过调用 ZwAllocateVirtualMemory
来获取它 - 使用此代码 - 这是可行的
NTSTATUS GetThreadContext(PETHREAD thread, PCONTEXT ctx)
{
#if 0
typedef NTSTATUS (NTAPI* GETSETCONTEXTTHREAD)(PETHREAD, PCONTEXT,MODE);
static GETSETCONTEXTTHREAD PsGetContextThread;
static BOOLEAN bInit;
if (!bInit)
{
STATIC_UNICODE_STRING(aPsGetContextThread, "PsGetContextThread");
PsGetContextThread = (GETSETCONTEXTTHREAD)MmGetSystemRoutineAddress(&aPsGetContextThread);
bInit = TRUE;
}
if (!PsGetContextThread)
{
return STATUS_PROCEDURE_NOT_FOUND;
}
#endif
CONTEXT * BaseAddress = 0;
SIZE_T Size = sizeof(CONTEXT);
NTSTATUS status = ZwAllocateVirtualMemory(NtCurrentProcess(), (void**)&BaseAddress, 0, &Size, MEM_COMMIT, PAGE_READWRITE);
if (0 <= status)
{
BaseAddress->ContextFlags = ctx->ContextFlags;
if (0 <= (status = PsGetContextThread(thread, BaseAddress, UserMode)))
{
memcpy(ctx, BaseAddress, sizeof(CONTEXT));
}
ZwFreeVirtualMemory(NtCurrentProcess(), (void**)&BaseAddress, &Size, MEM_RELEASE);
}
return status;
}
<小时/>
并且认为您不需要使用MmGetSystemRoutineAddress
而是静态导入PsGetContextThread
,但如果您无论如何想在运行时获取此指针 - 不需要每次都这样做 - 但只需一次。使指针指向函数静态
关于c - PsGetContextThread 返回 C0000005(ACCESS_VIOLATION),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41901723/
我正在尝试使用一个名为 PsGetContextThread 的未记录函数从驱动程序检索用户模式线程的上下文,我知道这在用户模式下是可能的,但我有我的理由从内核中执行此操作,这是不可协商的,所以请不要
我在使用这个钩子(Hook)引擎时遇到问题 http://www.codeproject.com/Articles/21414/Powerful-x86-x64-Mini-Hook-Engine 函数
在尝试 checkout 或更新工作副本时,我们会重复遇到错误。 环境 我们的环境如下:- svn 1.8.9 (r1591380) 客户端和服务器在同一服务器上运行(客户端在另一台服务器上也会发生,
我尝试使用 DirectX 9 创建并填充 LPDIRECT3DTEXTURE9 纹理,方法如下。 首先,我使用 IDirect3DTexture9::CreateTexture 创建纹理: LPDI
场景:我们正在尝试从我们的网站下载 2500 个 PDF,我们需要找到该场景与应用程序的其他业务流程一起运行时的响应时间。我编写的用于动态选择和下载 PDF 的自定义代码在 vugen 甚至 Cont
我遇到了一个问题:我尝试调用一个应该在控制台中打印一些内容的 java 方法。它是使用 JNI 从 C++ native dll 调用的。问题是它不起作用,我得到了那个错误: # # A fatal
我是一名优秀的程序员,十分优秀!