阅读:1964回复:4
键盘钩子的问题
打开\\driver\\kbdclass,把所有分发函数替换为下面这个函数
NTSTATUS HookedDispatch(DEVICE_OBJECT *DeviceObject, IRP *Irp) { NTSTATUS status = STATUS_SUCCESS; PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp); if(stack->MajorFunction == IRP_MJ_READ) { if(Irp->UserBuffer) { KEYBOARD_INPUT_DATA *data = (KEYBOARD_INPUT_DATA *)Irp->UserBuffer; DbgPrint("ID: KBD%d\tCODE: 0x%x\tPUSH: %d\n", data->UnitId, data->MakeCode, data->Flags); Irp->IoStatus.Status = status; IoCompleteRequest(Irp, IO_NO_INCREMENT);//直接完成,不让irp下发 return status; } } else status = pOldDispatch[stack->MajorFunction](DeviceObject, Irp);//保存下来的原来的分发函数 return status; } 问题是,这个Irp完成不掉,函数返回后,马上来一个相同的Irp,data里的数据也一样,无限执行下去....调用原分发函数当然没有问题。 |
|
沙发#
发布于:2010-11-17 09:25
这样直接IoCompleteRequest当然不行了,看看windows中键盘的工作原理就明白了,建议参考《寒江独钓-windows内核安全编程》第4章
|
|
板凳#
发布于:2010-11-16 12:11
我觉得你这么干估计不行,你首先要记住它以前的函数地址,你不能简单的替换。应该调用一下他以前的函数
------------------------------------------------------------------ 帆子内核驱动网 bbs.kerneldev.com |
|
|
地板#
发布于:2010-11-12 16:39
如果设Irp.IoStatus.status为非SUCCESS,则从此以后再无Irp到来,键盘失效。
|
|
地下室#
发布于:2010-11-12 15:28
我就是想让这个键盘事件不让系统知道.....
![]() ![]() |
|