在windows下,USB设备中断的全流程如下(以USBHID键鼠设备为例):
HardWare Layer
USB设备,比如USB键盘、鼠标在按下或者是滑动的时候,根据键鼠内部的循环电路扫描以及USB-HID接口协议,触发一个中断,相关的数据,比如哪个键盘按下,鼠标移动多少等。这些数据被封装到了USB请求块(URB,USB Request Block)中。
USB主控驱动
USB主控驱动在windows中一般是`usbehci`等驱动,具体可能和USB主控的型号有关。他注册了相关的IDT中断,当USB设备中断的时候(实际上USB主控似乎是挂在PCI主控的,也就是中断走的应该是MSI而不是ACPI,具体原理不·清楚,总之可以中断到USB主控驱动注册的相关中断Routine中)。
USBHUB.sys
USB主控中断后,USBHUB(集线器驱动,主要负责管理USB驱动对象)会接受到来自USB主控的IoCallDriver的IRP,它会传递给上层驱动程序,同时负责管理USB设备的链接、断开,pnp相关。
HIDUSB
USBHUB传递IRP->HIDUSB(HIDUSB设备),此时IRP还是URB的形式,HIDUSB解析URB,传递给HIDCLASS类驱动。
HIDCLASS
即HIDCLASS.sys,到这一层,windows把数据和对象抽象成类了。此时数据已经不上URB的硬件格式,而是windows规定的协议格式的IRP包了(HID报告包,存疑,可能得实际逆向)。
接下来,更细致地分发到KBDHID.sys和MOUHID.sys,主要就是将HID报告->IRP(里面有各种鼠标移动,键盘的扫描码等信息)
kbdclass、mouclass
hidclass过滤键鼠,将这些IRP包发给具体的键盘鼠标类驱动,然后这些驱动去调用KeyboardClassServiceCallback等位于驱动内的回调,这些回调会插入到WIN32子系统的输入队列,最后win32k.sys分发给不同的应用窗口。
流程图如下:

一个键盘按(I2CHID,而不是USB-HID,除了从USBHUB哪里开始,其他hidclass等逻辑是一样的)下的调用栈(Windows on arm):

如何做键鼠监控?
- KbdMouServiceCallback
最高层的,所有都能监控到的->ServiceCallback
优点:位于调用链的最高层,usb键鼠、i2c、ps/2都可以监控到
缺点:太明显,被太多人盯着。
- IRP-HOOK
底层的,针对HID-USB键鼠,去hook所有的USB设备对象的IRP,拦截,逆向,解析他的数据包
优点:隐蔽
缺点:只能监控某种类型的键鼠,比如USB、I2C、或者PS/2,不同的类型硬件要进行不同的hook驱动对象的派遣函数,而且需要逆向他的数据解包。



https://shorturl.fm/h0Eo1
https://shorturl.fm/ChQWD
https://shorturl.fm/yhWDv
https://shorturl.fm/3Gjs5
https://shorturl.fm/B8Ioh
Your audience, your profits—become an affiliate today!
Hey, I’ve been using Nesime on Garantidennesine for a while now. It’s pretty smooth! Check it out nesime if you’re looking for a solid option.
Looking for ‘nesine at yarışı tahmin’? They have some good tips and predictions on Nesine for horse racing, worth checking out before placing your bets! nesine at yarışı tahmin
Agents 747, heard good things! Going to sign up and see what all the buzz is about. Hope it lives up to the hype! Wish me luck! agents 747