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