阅读:4363回复:3
Raw Input Thread 鼠标事件
经查资料得如下信息:
1)操作系统通过RIT(raw input thread,RIT)等待系统硬件输入队列(system hardware input queue,SHIQ)的消息,一旦鼠标或键盘发生操作,系统就向SHIQ添加一条硬件事件,这时RIT将被唤醒,并从SHIQ中取出这个事件,转换成适当的WM_KEY***、WM_?BUTTON***、WM_MOUSEMOVE等消息添加到适当线程消息队列(VIQ)中,RIT判断适当线程的机制: 1.对于鼠标消息,RIT只是确定是哪一个窗口在鼠标光标之下。利用这个窗口,RIT调用GetWindowThreadProcessID来确定是哪一个线程建立了这个窗口,那么就把消息发送到这个线程的线程消息队列(VIQ)中。 2.对于按键消息,在 任何时刻只有一个线程与RIT“连接”,与之相连的这个线程称为前景线程(foreground thread),也就是说RIT将把消息发送到建立当前获得焦点的窗口的线程的线程的线程消息队列(VIQ)中。 (原文地址:http://bbs.pediy.com/showthread.php?t=87167) 如果上面说的是对的,由于GetWindowThreadProcessID函数会调用Shadow SSDT 中NtUserQueryWindow这个函数。那么如果我HOOK 这个函数,并触发一个鼠标事件(这个事件被鼠标驱动转化为消息发到SHIQ队列中),按理说我通过调用PsGetCurrentThread函数总能获取到RIT这个线程,由于根据线程得到的信息不是很明朗,所以根据改线程获取其进程,根据进程名就应该知道是哪个进程创建的RIT了。如果我的推理没错的话,为什么我等到的进程中除了一个“ctfmon.exe”外,就没有像system、csrss.exe这样的进程了呢?我大胆猜想RIT线程是由某个系统进程创建的。 哪位高手帮我解决一下这个问题呢:按下鼠标时,获取RIT线程 —》获取进程。 当然前提是上面的资料信息及我的推理是对的,如果有什么地方不对,万望指正哦,诚谢!!! |
|
沙发#
发布于:2009-07-24 10:53
现在知道为什么我hook NtUserQueryWindow这个函数没用了,是因为RIT线程根本就不从Shadow SSDT表中获取NtUserQueryWindow函数地址,它得到的地址始终是最原始的地址。
|
|
板凳#
发布于:2010-10-11 17:04
有學習到了,那從那hook thread
|
|
地板#
发布于:2010-10-11 17:27
鼠标线程是system进程创建的。它通过readfile从鼠标驱动中读取鼠标事件。
|
|
|