【问题标题】:Can I create a Thread with its stack at a specific address?我可以在特定地址创建一个带有堆栈的线程吗?
【发布时间】:2016-06-28 00:19:54
【问题描述】:

我正在做一些试验,想知道是否可以在我提供的特定地址创建一个线程堆栈,或者至少让线程堆栈只在我可以指定的一些(巨大的)虚拟内存区域内产生.

我对此感兴趣的原因是我想在某个时候将整个堆栈复制到远程进程,并且需要指针保持完整,并且线程堆栈不会发生冲突。

我知道,这可能不是最好/最安全的方法,但这只是一个小爱好项目。如果您知道如何在 Linux 上执行此操作,我也对此感兴趣。

【问题讨论】:

  • 嗯...您确实知道系统管理的内存(例如堆栈)会移动,并且您的指针可能在线程生命周期结束时无效,对吗?此外,您知道堆栈中的所有内存都将在线程退出的那一刻被释放和回收(因此没有一个是有效的,并且在您获得它时另一个进程可能正在使用它)......对吗?
  • 可惜你不在 POSIX/Unix/Linux/WhateverBSD 上,你本可以使用 pthread_attr_setstackaddr(3)...
  • @Myst System 不能也不会移动堆栈。如果这样做,所有指针都将无效。对象的整个生命周期都具有相同的地址。
  • 即使 if 你可以为你的堆栈分配一个特定的地址,这不会让你更接近你想要解决的任何问题。堆栈上的值可以是任何东西:屏幕坐标、GDI 对象句柄、文件指针、内核对象句柄、动态分配对象的指针等等。将此数据复制到外部进程会使其无法使用。
  • 大声笑,移动虚拟内存,堆栈等。我的应用程序都不会运行超过几毫秒:)

标签: c windows multithreading winapi memory


【解决方案1】:

只是编译 cmets 所说的内容。

【讨论】:

  • 即使在 Windows 下,您当然也可以使用您选择的缓冲区作为堆栈,只需在线程创建期间保留一个最小缓冲区并在退出时恢复原始堆栈或调用 ExitThread。只需使用一个小型程序集包装器来切换堆栈指针并在伪造的堆栈帧上回调 C。您将需要通过结构异常手动处理保护页/溢出检查,并且存在特定于平台的细微之处(异常展开记录、双栈安腾、对齐要求等)。加上自上次尝试以来我一直压抑的许多微妙之处。
  • 查看这个link from Intel,它处理在至强处理器上调整堆栈地址..我没有看到任何特定于至强的asm,因此它可能适用于其他 x86 Windows 平台..
猜你喜欢
  • 1970-01-01
  • 2022-10-20
  • 2021-10-22
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多