首页
社区
课程
招聘
[原创] 优雅的动态卸载键盘过滤驱动
发表于: 2023-5-12 15:20 10659

[原创] 优雅的动态卸载键盘过滤驱动

2023-5-12 15:20
10659


在参考《寒江独钓 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);


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 2
支持
分享
最新回复 (5)
雪    币: 42
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
有试过在win10中测试过码,我用独钓寒江的方法在win10下,测试卸载键盘后,所有的按键都不生效了
2023-9-21 20:33
0
雪    币: 917
活跃值: (4990)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
编程两年半 有试过在win10中测试过码,我用独钓寒江的方法在win10下,测试卸载键盘后,所有的按键都不生效了
就是在win10中
2023-9-22 08:25
0
雪    币: 917
活跃值: (4990)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
ALwalker 就是在win10中
你可以试试我的代码
2023-9-22 08:26
0
雪    币: 3059
活跃值: (30876)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢分享
2023-9-22 09:19
1
雪    币: 42
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
ALwalker 你可以试试我的代码
我试了,在这个地方蓝了:IoReleaseRemoveLock(&io_remove_lock, irp);    // 移除锁的释放可在此处,也可以在回调函数中实现
2023-9-22 17:28
0
游客
登录 | 注册 方可回帖
返回
//