【问题标题】:GetThreadContext via DuplicateHandle?通过 DuplicateHandle 获取线程上下文?
【发布时间】:2012-01-29 13:52:32
【问题描述】:

我正在尝试使用 GetThreadContext 打开进程重复句柄并从线程句柄查询信息,但我收到错误 ERROR_INVALID_HANDLE 或 ERROR_GEN_FAILURE。这方面的信息似乎非常有限......

processHandle = OpenProcess(PROCESS_DUP_HANDLE, FALSE, pid)
DuplicateHandle(processHandle,handle.Handle,GetCurrentProcess(),&dupHandle,0,FALSE,DUPLICATE_SAME_ACCESS);


            memset(&ctx,0x00,sizeof(ctx));
            GetThreadContext(dupHandle,&ctx);
            printf("Error:%x", GetLastError());

有人吗?

【问题讨论】:

  • DuplicateHandle 成功了吗? handle.Handle 是什么?
  • 是的 DuplicateHandle 成功,但 CTX 始终为空......并且 GetThreadContext 返回错误,正如我在上面发布的......

标签: c++ windows winapi error-handling inject


【解决方案1】:

首先,如上所述,您应该将线程句柄作为参数传递,而不是进程句柄。

那么,您要求GetThreadContext API 填充CONTEXT 结构的哪一部分?您将零留在那里,应该有 1+ 个标志来指示感兴趣的数据:

CONTEXT ThreadContext = { CONTEXT_CONTROL };
if(GetThreadContext(ThreadHandle, &ThreadContext)) {
    // ...

另请参阅https://stackoverflow.com/a/199809/868014 上的代码 sn-p

【讨论】:

  • 谢谢,它确实有助于设置标志,似乎正确返回了 ESP 值,但每个线程的 EIP 始终是相同的值......在内核的某个地方...... 0x7c90e514(我枚举explorer.exe 句柄)我使用的代码示例 -> forum.sysinternals.com/uploads/26792/handles.zip
  • 如果线程处于某种空闲状态,例如,为什么不呢?在WaitForSingleObject 内,您可能想步行查看感兴趣的实际位置
  • 嗯,不要认为所有线程都可能返回相同的 EIP,也有一些线程不返回 EIP .. 也许他们没有权限?我用无效的 EIP 尝试了 SetThreadContext 并且它起作用了,explorer.exe 急剧崩溃:)
【解决方案2】:

GetThreadContext 采用线程句柄而不是进程句柄。

【讨论】:

  • 是的,我正在枚举所有句柄,我成功获取了所有句柄,但 GetThreadContext 返回错误....
  • 如何获取线程句柄?您是否尝试过明确要求对副本的访问权限?
  • 我正在使用此代码示例来枚举句柄 -> forum.sysinternals.com/uploads/26792/handles.zip 如果有人有工作代码,请分享?这个确实返回句柄及其名称,但我不能在线程句柄上执行 GetThreadContext .....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 2015-11-24
  • 2015-09-29
  • 1970-01-01
相关资源
最近更新 更多