更改可报警/可等待线程的上下文
Change context of an alertable / waitable thread
我想使用线程挂起方法将一段代码注入正在运行的模块中。
- SuspendThread
- GetThreadContext
- DoSomething
- 继续线程
我的问题是,如果我当前注入的线程处于alertable/waitable模式(WaitForSingleObject,GetMessage),会发生什么。一旦我点击ResumeThread命令会发生什么。
我想,如果不是这样,也会发生同样的事情。
假设目标线程当前处于用户模式。保存所有寄存器以备以后使用,将RIP
设置为指向代码并调用ResumeThread()
。在某个时刻,您的代码开始执行,执行它所做的一切,恢复保存的注入代码的所有寄存器,并让程序恢复正常操作。
现在假设目标线程正在等待。等待意味着线程执行一个系统调用,告诉调度程序在发生某些事情之前不要调度线程执行(发出事件信号等)。您保存用户模式上下文的寄存器(调用sysenter
时的方式),设置RIP指向您的代码并调用ResumeThread()
。这一切都很好,但调度器仍然不会安排它执行,直到满足等待条件。
当等待最终结束时,线程确实在内核模式下完成了它的业务,返回到用户模式,并不是在sysenter
之后执行ret
命令,而是继续执行代码。最后,您的代码恢复所有寄存器,并跳到保存的RIP
(从ntdll!ZwWaitForSingleObject
或其他),一切正常。
最后,假设你正在进行一次警觉的等待。这个故事和前两段差不多(你真的不需要我重复第三次,是吗?:),只是在等待函数返回之前,它会执行所有排队等待线程的用户APC-,就像没有你的干预一样-然后继续执行你的代码等。
所以基本上发生的事情是你应该预料到的:
- 如果调用
SetThreadContext()
,则无论线程是否在等待,用户模式上下文都会发生更改,计算机也会相应地运行 - 如果线程正在等待某个东西,它将继续等待相同的东西,而不管您是否调用了"SetThreadContext()"
- 如果线程处于可报警等待状态,则在系统调用返回之前,它会确保用户APC队列为空(可能是因为有用户APC并且它调用了它们,也可能是因为队列为空并且最终出现了"常规"等待条件)。同样,无论您是否调用
SetThreadContext()
相关文章:
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 提升 ASIO - io_service 不要等待连接到线程
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- 一个线程等待多个线程事件
- 如何让线程等待对象完全破坏?(对象也有一个线程)?
- 停止C++ 11 个 std::线程等待 std::condition_variable
- C++线程:等待condition_variable后无法解锁阵列中的互斥锁
- Qt 线程等待来自 GUI 的输入
- C++11线程等待
- 如何让线程等待对象的销毁
- Boost:等待工作线程等待条件变量
- C++11线程等待行为:std::this_Thread::yield()与std::this _Thread::sle
- 如何使线程等待而不轮询
- 使其中一个线程等待的时间尽可能少(几乎为零)
- 当线程等待互斥锁时捕获的信号
- Qt:如何让一个线程等待临时包障,并暂时增加另一个线程的优先级以删除 roadbock?
- C++ Windows MFC 并发:让线程等待,直到达到特定状态
- 线程等待父线程
- 使用异步方法vs线程等待
- c++线程等待时间