我想使用线程挂起方法将一段代码注入正在运行的模块中。
我的问题是如果我当前正在注入的线程处于警报/等待模式(WaitForSingleObject,GetMessage)会发生什么。一旦我点击了ResumeThread命令,会发生什么。
答案 0 :(得分:1)
同样的事情本来会发生,我想。
让我们说目标线程当前处于用户模式。您保存所有寄存器以供日后使用,设置RIP
以指向您的代码并致电ResumeThread()
。在某些时候你的代码开始执行,做它做的任何事情,恢复注入代码保存的所有寄存器,并让程序恢复正常操作。
现在让我们说目标线程正在等待。等待意味着线程执行系统调用,该调用告诉调度程序不会调度线程执行,直到发生某事(发出事件信号等)。您保存用户模式上下文的寄存器(调用sysenter
时的方式),将RIP设置为指向您的代码并调用ResumeThread()
。这一切都很好,但调度程序仍然不会安排它执行,直到满足等待条件。
当等待最终结束时,线程确实以内核模式完成其业务,返回到用户模式,而不是在ret
之后执行sysenter
命令继续执行您的代码。最后,您的代码将恢复所有寄存器并跳转到已保存的RIP
(来自ntdll!ZwWaitForSingleObject
或其他任何内容),一切都将继续正常进行。
最后,假设您正在执行可警告的等待。这个故事几乎和前两段一样(你真的不需要我第三次重复这个,你呢?:)),除了在wait函数返回之前它执行所有排队等候的用户APC线程 - 与没有您干预的情况完全一样 - 然后继续执行您的代码等。
所以基本上会发生什么是你应该发生的事情:
SetThreadContext()
,则更改用户模式上下文并且计算机的行为相应,无论该线程是否在等待。SetThreadContext()
。