【问题标题】:Is it allowed to call CreateRemoteThread() on a suspended process?是否允许在暂停的进程上调用 CreateRemoteThread()?
【发布时间】:2018-11-28 10:44:49
【问题描述】:

如果我使用(未记录的)NtSuspendProcess 函数(从ntdll.dll 导出)挂起一个进程,然后调用CreateRemoteThread 在该进程中创建一个线程,则该线程开始运行而没有任何问题。

我想知道CreateRemoteThread 是否允许这样使用?

【问题讨论】:

  • 既然你已经在使用(无证)NtSuspendProcess,为什么还要关心是否允许这样使用CreateRemoteThread
  • 好吧,它为什么不开始运行。您在远程进程中创建一个线程,并要求它开始运行。它开始运行,你想知道为什么?您希望会发生什么?
  • NtSuspendProcess 枚举并挂起目标进程中所有未退出的线程。没有什么能阻止新的创建线程运行。所以CreateRemoteThread创建的新线程开始在用户模式下执行。但是..您将所有现有线程挂起在任意位置。可能一些挂起的线程持有进程全局临界区。当新线程尝试进入此部分时 - 他挂在这里。这可以和装载机锁。或者说进程堆暴击秒,如果你在分配或释放内存时挂起线程)。所以 nw 线程运行正常或挂起 - 运行
  • @VTT & David:问题太多,信息太少。
  • @RbMm:是的,好点。直到我查看NtSuspendProcess all it does 是它枚举进程线程并将它们从锁中挂起时,我才意识到这一点。换句话说,不存在“暂停进程”之类的东西。它只是可以暂停的线程。尽管如此,如果它碰巧调用 idk LoadLibrary 而对同一 API 的另一个调用在另一个线程中被挂起,我仍然看到你关于该远程线程中潜在死锁的观点。虽然,我看不出这与调用记录在案的 SuspendThread 有何不同。

标签: c++ multithreading winapi


【解决方案1】:

是的,这是可能的,我已经做到了。除非在CreateRemoteThread(); 上设置了CREATE_SUSPENDED 标志,否则新线程将立即开始执行。

是的,它应该如何工作,回答你的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    相关资源
    最近更新 更多