是否可以在Windows中确定线程的堆栈位置?

时间:2016-11-22 20:55:21

标签: windows winapi virtual-memory

我正在做一个项目,我需要完全控制进程的地址空间。我需要将线程的堆栈从当前的位置移动到我选择的预定义区域,因为我需要释放原始堆栈内存。我找不到关于如何做到这一点的任何事情,只知道如何处理堆栈大小,但这不是我需要的。我有两个想法如何做到这一点,没有一个是理想的:

  • 将ESP和EBP设置为我的预定义区域,并更新线程TEB中的堆栈基础和堆栈限制字段。这听起来像个坏主意,因为我很难知道是否还有其他地方需要更新,更不用说内核在内部保留有关堆栈位置的簿记信息的可能性。
  • 在任何地方保留内存基本上会强制在我可用的空间中分配新线程的堆栈。我知道这是一个糟糕的主意。

是否可以做这样的事情?它不必是相同的线程。

编辑:任何事情都可以解决原始堆栈并确定新/旧堆栈的新位置。因此,复制/移动堆栈,杀死旧线程并在预定义位置启动具有堆栈的新线程等应该可以。我不需要旧线程,我只需要一种方法来强制线程在某个位置运行(已经解决)并将其堆栈放在我决定的安全位置。所以在这种情况下丢弃旧的堆栈数据是好的,因为我现在不依赖它。

1 个答案:

答案 0 :(得分:0)

如果你想释放系统分配堆栈,你就会打开一堆蠕虫。问题是您需要知道线程上方所有堆栈帧的结构。这些帧可以引用堆栈上的地址,因此删除它们可能会导致各种问题。

您可以创建一个具有1页堆栈的线程,而不是取消分配它。然后分配您自己的内存块并将其地址移动到堆栈指针寄存器中。在您的顶级线程例程中。