-
-
[原创] 优雅的动态卸载键盘过滤驱动
-
发表于:
2023-5-12 15:20
10661
-
在参考《寒江独钓 Windows内核安全编程》的键盘过滤驱动时,其键盘过滤驱动的卸载方式是通过调用KeDelayExecutionThread函数实现卸载函数所属的线程等待,在这期间通过按键处理掉键盘处于挂起状态的 `IRP_MJ_READ` 请求,从而顺利卸载键盘过滤驱动。
但是这种方法不够优雅,在了解到Windows I/O机制的移除锁时,想到通过该锁实现在卸载键盘过滤驱动时根据irp动态阻塞。这样的话,在某个时刻发生键盘按键事件时便可动态卸载。
1. IoReleaseRemoveLockAndWait 例程释放了驱动程序在之前调用 IoAcquireRemoveLock 中获取的删除锁,并等到释放锁的所有获取为止。
2. 由于 IoReleaseRemoveLockAndWait 工作在 PASSIVE_LEVEL,因此只能使用系统线程或工作项。
``` c
/* 此处为派遣函数 */
IoAcquireRemoveLock(&io_remove_lock, irp);
IoCopyCurrentIrpStackLocationToNext(irp);
IoSetCompletionRoutine(irp, c2pReadComplete, device_object, TRUE, TRUE, TRUE); // 此处设置了回调函数
//IoSkipCurrentIrpStackLocation(irp);
status = IoCallDriver(device_object_physics, irp);
IoReleaseRemoveLock(&io_remove_lock, irp); // 移除锁的释放可在此处,也可以在回调函数中实现
return status;
/* 此处为键盘过滤驱动的卸载函数 */
PIO_WORKITEM io_workitem = IoAllocateWorkItem(driver->DeviceObject);
IoQueueWorkItem(io_workitem, IoWorkitemRoutine, DelayedWorkQueue, driver);
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)