键盘过滤驱动快捷实现

简介:      最近在网上无意中看到一段代码,主要讲述的是Windows 下键盘过滤驱动的实现方式,这段代码很有意识,是一种比较好的一种方法,主要将获取的键盘驱动对象的所有分发函数替换,然后另行处理,具体的代码如下;         //获取键盘驱动对象...

     最近在网上无意中看到一段代码,主要讲述的是Windows 下键盘过滤驱动的实现方式,这段代码很有意识,是一种比较好的一种方法,主要将获取的键盘驱动对象的所有分发函数替换,然后另行处理,具体的代码如下;

        //获取键盘驱动对象

    status = ObReferenceObjectByName(&uniNtNameString,
           OBJ_CASE_INSENSITIVE,
           NULL,
           0,
           IoDriverObjectType,
           KernelMode,
           NULL,
           (PVOID *)&KdbDriverObject);

        // 替换分发函数

    for (i=0;i<=IRP_MJ_MAXIMUM_FUNCTION;i++)
    {
          OldDispatchFunction[i] = KdbDriverObject->MajorFunction[i];
                  InterlockedExchangePointer(&KdbDriverObject->MajorFunction[i],
                 (PDRIVER_DISPATCH)c2pDispatchGeneral);
    }

      // 对IRP_MJ_READ分发例程单独处理

NTSTATUS   c2pDispatchGeneral(IN PDEVICE_OBJECT DeviceObject, IN PIRP irp)
{
    NTSTATUS status;
    PC2P_DEV_EXT devExt;
    PIO_STACK_LOCATION CurrentIrpStack; // 当前I/O堆栈
    KEVENT waitEvent;
    PIO_STACK_LOCATION iostack;
    iostack = IoGetCurrentIrpStackLocation(irp);
    KdPrint(("Other c2pDispatchGeneral/n/n/n"));
/*    IoSkipCurrentIrpStackLocation(irp);*/
    if (iostack->MajorFunction == IRP_MJ_READ)
    {
        KeInitializeEvent(&waitEvent,NotificationEvent,FALSE);
        if (irp->CurrentLocation == 1)
        {
            ULONG ReturnedInformation = 0;
            KdPrint(("Dispatch encountered bogus current location/n"));
            status = STATUS_INVALID_DEVICE_REQUEST;
            irp->IoStatus.Status = status;
            irp->IoStatus.Information = ReturnedInformation;
            IoCompleteRequest(irp,IO_NO_INCREMENT);
            return status;
        }

        gC2pKeyCount ++;
        devExt = (PC2P_DEV_EXT)DeviceObject->DeviceExtension;
        CurrentIrpStack = IoGetCurrentIrpStackLocation(irp);
        IoCopyCurrentIrpStackLocationToNext(irp);
        KdPrint(("c2pDispatchRead->IoSetCompletionRoutine/n"));
       IoSetCompletionRoutine(irp,c2pReadComplete,DeviceObject,TRUE,TRUE,TRUE);
        return IoCallDriver(devExt->LowerDeviceObject,irp);
    }
    // pLowerDeviceObject = IoAttachDeviceToDeviceStack(pFilterDeviceObject,pTargetDeviceObject);
    // 返回的低层驱动对象
    return IoCallDriver(((PC2P_DEV_EXT)DeviceObject->DeviceExtension)->LowerDeviceObject,irp);
}

     //完成例程函数处理

NTSTATUS c2pReadComplete(IN PDEVICE_OBJECT DeviceObject, IN PIRP irp, IN PVOID Context)
{
    PIO_STACK_LOCATION irpSp;
    PKEYBOARD_INPUT_DATA KeyData;
    int NumKeys;
    ULONG buf_len;
    size_t i;
    PUCHAR buf = NULL;
    buf_len = 0;
    irpSp = IoGetCurrentIrpStackLocation(irp);
    // 判断是否成功
    if (NT_SUCCESS(irp->IoStatus.Status))
    {
       KeyData = (PKEYBOARD_INPUT_DATA)irp->AssociatedIrp.SystemBuffer;
        NumKeys =  irp->IoStatus.Information/sizeof(KEYBOARD_INPUT_DATA);
        KdPrint(("Nnmkeys : %d",NumKeys));
        KdPrint(("ScanCode : %x",KeyData->MakeCode));
        KdPrint(("%s/n",KeyData->Flags?"UP":"DOWN"));
        print_keystroke((UCHAR)KeyData->MakeCode);
        if (KeyData->MakeCode == CAPS_LOCK)
        {
            KeyData->MakeCode = LCONTROL;
        }
    }
    gC2pKeyCount -- ;
    if (irp->PendingReturned)
    {
        // 传递PENDING
        IoMarkIrpPending(irp);
    }
    return irp->IoStatus.Status;
}

    简单吧,只需这几步就可以完成键盘过滤驱动,编写完之后,我利用PASSWORD对话框尝试过,竟然能捕获键盘输入的数据。那天要是能安装在网吧的机器上,岂不是可以盗取网管的密码!!!(现实并非这么简单)

目录
相关文章
|
Windows
万能脚本录制器(支持鼠标/键盘的前台和后台,支持多种绑定模式)
一款模拟鼠标键盘动作的软件。通过制作脚本,可以代替双手,自动执行一系列鼠标键盘动作。本程序简单易用,不需要任何编程知识就可以作出功能强大的脚本。只要在电脑前用双手可以完成的动作,本程序都可以替代完成。
15623 0
万能脚本录制器(支持鼠标/键盘的前台和后台,支持多种绑定模式)
|
8月前
|
Windows
MyKeymap按键映射工具
MyKeymap能减少键鼠切换、实现全键盘操作,让「编辑文字」和「窗口管理」更快捷。提升工作学习中写代码、编辑文字、整理笔记、管理窗口的效率,掌握MyKeymap后,能让使用Windows的日常,拥有流畅、舒适、顺滑的操作体验。
278 2
MyKeymap按键映射工具
|
8月前
|
存储 网络协议 网络虚拟化
神奇的H3C设备自动配置功能,不用按Ctrl-D/C了
神奇的H3C设备自动配置功能,不用按Ctrl-D/C了
多按键多界面二维数组表驱动设计
多按键多界面二维数组表驱动设计
80 0
|
Shell
用过的两种鼠标右键添加快捷指令方法
用过的两种鼠标右键添加快捷指令方法
464 1
用过的两种鼠标右键添加快捷指令方法
|
Java Android开发
接入物理键盘时, 默认弹出软件键盘
接入物理键盘时, 默认弹出软件键盘
249 0
|
Java 机器人
Selenium自动化用法详解【键盘控制】
Selenium自动化用法详解【键盘控制】
343 0
自己做输入框,控制更方便
自己做输入框,控制更方便
104 0
|
API 开发者 容器
面向键盘操作的半自动化解决方案
面向键盘操作的半自动化解决方案
面向键盘操作的半自动化解决方案