什么是堆栈上的线程返回地址?

时间:2013-10-18 18:40:08

标签: c++ multithreading assembly

我正在使用ZwCreateThread在VS C ++ win64 native中创建一个线程,我几乎让它工作,除非我的线程在程序集中执行ret指令我得到访问冲突,因为我还没有放回一个返回地址堆栈,所以我的程序试图在内存位置0执行代码

显然这不起作用。所以问题是CreateThread和CreateRemoteThread在堆栈上放置了什么地址?

我在想我可以使用ExitThread函数的地址。 这是否合适?

此外,目标处理器是AMD64

2 个答案:

答案 0 :(得分:1)

在Windows ret指令中,应正确终止线程。可能你的代码以某种方式打破了堆栈。虽然,即使在这种情况下,调用ExitThread也应该有效。

答案 1 :(得分:0)

由于某种原因,ZwCreateThread将Rsp寄存器设置为(tContext.Rsp - 0x30) 如果有人知道为什么会发生这种情况,请分享!

我通过以下方式解决了这个问题。

tContext.Rsp = (DWORD64) ((unsigned long long)BaseAddress + RegionSize - 8);
*(PULONG64) ((unsigned long long)BaseAddress + RegionSize - 0x38) = (unsigned long long) GetProcAddress(GetModuleHandleA("kernel32"), "ExitThread");