如何访问尚未开始运行的挂起线程的堆栈?

时间:2011-12-06 16:30:59

标签: c++ windows winapi

我想更改新创建的远程线程的堆栈,但是在调用CreateRemoteThread来创建处于挂起状态的线程时,堆栈尚未分配。

我在创建挂起的线程后使用GetThreadContext获取ESP的地址,但是如果我在VS调试器的反汇编窗口中查看此地址,则尚未分配。此外,每次使用WriteProcessMemory写入此地址都会失败。

如何编辑新创建但挂起的远程线程的堆栈?

3 个答案:

答案 0 :(得分:1)

你所说的对我来说似乎很合乎逻辑。由于您创建的新线程已挂起,因此尚未调用线程函数,因此还没有堆栈。

也许你可以正常启动线程并让线程暂停自己作为第一个要完成的操作。

答案 1 :(得分:1)

IIRC,您应该已经可以访问目标线程的寄存器,因此如果您设置其单步标志并取消暂停它,将执行一条指令,然后您将获得控制权 - 但是甚至可以运行单指令,其堆栈应该已经分配。这应该与@ Edwin的答案大致相同,但不要求你修改目标线程。

答案 2 :(得分:1)

当你获得线程句柄时,它的堆栈被分配(以及TIB结构)。

MSVS调试器可能显示错误信息,因此请不要依赖它 我不确定线程​​上下文是否具有正确的值,也许稍后会设置。

你应该使用TIB结构来获取堆栈地址,如果它真的是你需要的那样。

如果您只想在线程函数调用之前远程调用函数,则可以使用QueueUserAPCRtlRemoteCall,这两者都可以在使用CREATE_SUSPENDED标志创建线程时起作用。