是否允许在暂停的进程上调用 CreateRemoteThread()?

Posted

技术标签:

【中文标题】是否允许在暂停的进程上调用 CreateRemoteThread()?【英文标题】:Is it allowed to call CreateRemoteThread() on a suspended process? 【发布时间】: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 有何不同。 【参考方案1】:

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

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

【讨论】:

以上是关于是否允许在暂停的进程上调用 CreateRemoteThread()?的主要内容,如果未能解决你的问题,请参考以下文章

kernel32.dll 这个系统模块

我可以在方法条目上暂停 Java 运行时以便有时间通过​​调试器或探查器附加吗?

详细解读:远程线程注入DLL到PC版微信

保存进程的内存供以后使用?

如何在Windows下暂停和恢复任何外部进程?

C++ 暂停外部程序