我正在使用 ZwCreateThread 在 VS C++ win64 native 中创建一个线程,并且我几乎可以让它工作,除非我的线程在汇编中执行 ret 指令时出现访问冲突,因为我没有在堆栈上放置返回地址,所以我的程序尝试在内存位置 0 执行代码
显然这行不通。那么问题来了,CreateThread 和 CreateRemoteThread 放在栈上的地址是什么?
我在想我可以使用 ExitThread 函数的地址。这合适吗?
此外,目标处理器是 AMD64
我正在使用 ZwCreateThread 在 VS C++ win64 native 中创建一个线程,并且我几乎可以让它工作,除非我的线程在汇编中执行 ret 指令时出现访问冲突,因为我没有在堆栈上放置返回地址,所以我的程序尝试在内存位置 0 执行代码
显然这行不通。那么问题来了,CreateThread 和 CreateRemoteThread 放在栈上的地址是什么?
我在想我可以使用 ExitThread 函数的地址。这合适吗?
此外,目标处理器是 AMD64
在 Windowsret
指令中应该正确终止线程。可能您的代码以某种方式破坏了堆栈。ExitThread
虽然,即使在这种情况下,调用也应该有效。
出于某种原因 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");