我想更改新创建的远程线程的堆栈,但是在调用CreateRemoteThread来创建处于挂起状态的线程时,堆栈尚未分配。
我在创建挂起的线程后使用GetThreadContext获取ESP的地址,但是如果我在VS调试器的反汇编窗口中查看此地址,则尚未分配。此外,每次使用WriteProcessMemory写入此地址都会失败。
如何编辑新创建但挂起的远程线程的堆栈?
答案 0 :(得分:1)
你所说的对我来说似乎很合乎逻辑。由于您创建的新线程已挂起,因此尚未调用线程函数,因此还没有堆栈。
也许你可以正常启动线程并让线程暂停自己作为第一个要完成的操作。
答案 1 :(得分:1)
答案 2 :(得分:1)
当你获得线程句柄时,它的堆栈被分配(以及TIB结构)。
MSVS调试器可能显示错误信息,因此请不要依赖它 我不确定线程上下文是否具有正确的值,也许稍后会设置。
你应该使用TIB
结构来获取堆栈地址,如果它真的是你需要的那样。
如果您只想在线程函数调用之前远程调用函数,则可以使用QueueUserAPC
或RtlRemoteCall
,这两者都可以在使用CREATE_SUSPENDED
标志创建线程时起作用。