首页
社区
课程
招聘
[原创]IRP Hook 键盘Logger
发表于: 2009-9-15 08:04 20961

[原创]IRP Hook 键盘Logger

2009-9-15 08:04
20961

前天拜读combojiang 的rootkit hook 系列之[五] IRP Hook全家福(原帖:http://bbs.pediy.com/showthread.php?t=60022)之后,决定用文中的第三种方法实现一个KeyLogger。但是combojiang前辈并没有放上Demo,而且我在网上貌似也没找着完整的IRP Hook 键盘Logger实例,于是就写了一个,权当是为学习rootkit 的新人提供一份完整的参考代码(当然,我也是驱动新人),大牛请无视。

承achillis 前辈指教,我修改了卸载函数,卸载时把处于Pending状态的那个IRP取消掉,这样不需要再等待一个按键。

本例只替换原键盘驱动中的IRP_MJ_READ分发函数,并在回调函数中简单打印出键盘码。

主要代码如下:


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (20)
雪    币: 280
活跃值: (58)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
好东西,学习下irp以及驱动
2009-9-15 08:44
0
雪    币: 326
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
沙发被抢了。。。占座学习之。
2009-9-15 09:00
0
雪    币: 1491
活跃值: (985)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
4
好东西,谢谢共享!
2009-9-15 09:26
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
你这个卸载时还得等待按键吧?这个问题没有解决?
2009-9-15 09:39
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
6
还是先支持一下楼主,这个源码其实网上有
2009-9-15 09:40
0
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
这个估计是最简单的了,呵呵
2009-9-15 11:05
0
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
请问,为什么还要等待最后一个按键?
2009-9-15 12:02
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
9
因为有个IRP没有完成,还在Pending呢,如果不等待直接卸载,当这个IRP完成时会执行CompleteRoutine,而这个地址所在的驱动已经卸载了,系统就会BSOD~解决方法是设置CancelRoutine,这样卸载时IoCancelIrp就可以了,无须等待
2009-9-15 12:24
0
雪    币: 320
活跃值: (278)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
谢谢achillis 前辈指点 不过我这个代码没有attach到具体的键盘设备上去,卸载的时候貌似取不到CurrentIrp,所以如何得到当前IRP,请前辈详述之
2009-9-16 07:10
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
11
因为实际上这里只会有一个Irp处于Pending状态,当一个新的Irp到来时上一个已经完成了,所以你可以使用一个全局变量在FakeDispatchRead中把经过的IRP记录下来,那么下一次按键前,这个Irp必然就是那个pending的Irp,卸载时取消的也是这个Irp
2009-9-16 10:24
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不太明白为什么会在unload的调用KeSetPriorityThread:
// 把当前线程设置为低实时模式,以便让它的运行尽量少影响其他程序。
KeSetPriorityThread(CurrentThread, LOW_REALTIME_PRIORITY);
2009-10-14 21:54
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
学习一下。。。。
2009-10-15 17:27
0
雪    币: 268
活跃值: (40)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
14
支持一个,我也刚接触驱动,正好参考一下
2009-10-16 09:04
0
雪    币: 235
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我是来感谢 achillis
2009-10-20 08:43
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
if (CancelKeyboardIrp(PendingIrp) == STATUS_CANCELLED)
这个函数不是返回BOOLEAN吗,LZ改一下
2009-10-20 15:54
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
另外请教一下,这里为什么不用公开的API  IoGetDeviceObjectPointer 获取?
2009-10-20 16:34
0
雪    币: 351
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
好像寒江的。。。
不过,还是支持一下。。。
2009-10-22 15:23
0
雪    币: 167
活跃值: (136)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
很好的键盘记录
2009-10-23 08:16
0
雪    币: 306
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
20
代码还不错噶..学习下..
2009-10-27 13:00
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
21
support!
2009-10-27 13:10
0
游客
登录 | 注册 方可回帖
返回
//