更改可警告/可等待线程的上下文

时间:2015-12-21 17:22:28

标签: c++ windows winapi code-injection dll-injection

我想使用线程挂起方法将一段代码注入正在运行的模块中。

  1. SuspendThread
  2. GetThreadContext
  3. DoSomething的
  4. ResumeThread
  5. 我的问题是如果我当前正在注入的线程处于警报/等待模式(WaitForSingleObject,GetMessage)会发生什么。一旦我点击了ResumeThread命令,会发生什么。

1 个答案:

答案 0 :(得分:1)

同样的事情本来会发生,我想。

让我们说目标线程当前处于用户模式。您保存所有寄存器以供日后使用,设置RIP以指向您的代码并致电ResumeThread()。在某些时候你的代码开始执行,做它做的任何事情,恢复注入代码保存的所有寄存器,并让程序恢复正常操作。

现在让我们说目标线程正在等待。等待意味着线程执行系统调用,该调用告诉调度程序不会调度线程执行,直到发生某事(发出事件信号等)。您保存用户模式上下文的寄存器(调用sysenter时的方式),将RIP设置为指向您的代码并调用ResumeThread()。这一切都很好,但调度程序仍然不会安排它执行,直到满足等待条件。

当等待最终结束时,线程确实以内核模式完成其业务,返回到用户模式,而不是在ret之后执行sysenter命令继续执行您的代码。最后,您的代码将恢复所有寄存器并跳转到已保存的RIP(来自ntdll!ZwWaitForSingleObject或其他任何内容),一切都将继续正常进行。

最后,假设您正在执行可警告的等待。这个故事几乎和前两段一样(你真的不需要我第三次重复这个,你呢?:)),除了在wait函数返回之前它执行所有排队等候的用户APC线程 - 与没有您干预的情况完全一样 - 然后继续执行您的代码等。

所以基本上会发生什么是你应该发生的事情:

  • 如果您调用SetThreadContext(),则更改用户模式上下文并且计算机的行为相应,无论该线程是否在等待。
  • 如果线程正在等待某事,它继续等待同样的事情,无论你是否调用了'SetThreadContext()'。
  • 如果线程处于可警告的等待状态,则在系统调用返回之前,确保用户APC队列为空(因为有用户APC并且它调用它们,或者因为队列为空并且“常规”等待条件终于发生了)。这也是,无论您是否致电SetThreadContext()