键盘过滤驱动快捷实现

     最近在网上无意中看到一段代码,主要讲述的是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对话框尝试过,竟然能捕获键盘输入的数据。那天要是能安装在网吧的机器上,岂不是可以盗取网管的密码!!!(现实并非这么简单)

时间: 2024-08-01 02:21:23

键盘过滤驱动快捷实现的相关文章

过滤驱动禁止U盘读写(非注册表)

问题描述 过滤驱动禁止U盘读写(非注册表) 张帆的<Windows 驱动开发技术详解>中有一个U盘过滤驱动,实现U盘的只读锁定.我想在某种情况下实现U盘的读写锁定.因为我想做一个密码的判断,所以不可能手动对注册表修改来实现这个功能.运行实例代码是好的.但是我加了一个对读操作请求的处理,然后Windows7 32bit测试机立刻蓝屏.代码如下: NTSTATUS USBSCSICompletion( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN

Windows文件过滤驱动经验总结

看了 ChuKuangRen 的第二版<文件过滤驱动开发教程>后,颇有感触.我想,交流都是 建立在平等的基础上,在抱怨氛围和环境不好的同时应该先想一想自己究竟付出了多少?只 知索取不愿付出的人也就不用抱怨了,要怪也只能怪自己.发自己心得的人无非是两种目的 ,一是引发一些讨论,好纠正自己错误的认识,以便从中获取更多的知识使自己进步的更快 .二是做一份备忘,当自己遗忘的时候能够马上找到相关资料.我这里也总结了近几年做文 件过滤驱动时所积累下来的一些小小经验,这分笔记也是看了 ChuKuangRen

过滤驱动加密文件(代码)

摘要:     我想做一个unlocker一样的程序,不管这个文件有没有被使用,先实现删除它.在查资料过程中,就知道了如果不访问磁盘扇区的话,除非写驱动才能做到.奈何时间有限,工作匆忙,一直没有完成.而且忽视了更简便的方法--在别的路径下把修改后的OCX控件重新注册一下就可以了.     这些都不要说了,这段闲暇时间,我写了一个过滤加密,就这么简单.在DDK的示例Sfilter基础上改的.   文件过滤加密的源代码   //过滤读 NTSTATUS SfRead(__in PDEVICE_OBJ

识别-Windows环境下ndis过滤驱动

问题描述 Windows环境下ndis过滤驱动 各位大神,我想请教下,本机向外发送文件,通过网络过滤驱动,可以识别出外发数据包的源吗? 解决方案 源包是可以识别的,通过SmartSniff就可以,但如果加密了,就需要解密 解决方案二: 可以根据发送的包,查找对应目标进程等.

Windows过滤驱动开发,求指导或者资料推荐

问题描述 Windows过滤驱动开发,求指导或者资料推荐 目前在做一个U盘防盗的项目,要求插入U盘系统提示输入密码验证权限.文件内容透明加密.据我所知,这两个功能都可以通过过滤驱动实现.<Windows驱动开发技术详解>.<深入浅出Windows驱动开发>.<Windows设备驱动程序WDF开发>等等这些书我都大致看了一下.但是所有的这些书的实例代码用VS2015编译 ,在win7虚拟机上运行各种错误.完全不知道怎么办?希望有人能够指导一下或者推荐一下学习资料.谢谢.

Windows过滤驱动与控制台程序交互

问题描述 Windows过滤驱动与控制台程序交互 我想做一个密码控制U盘使用权限的程序.是U盘插入的时候U盘过滤驱动调用控制台要求用户输入密码,还是插入U盘的时候没反应,需要用户打开控制台程序输入密码然后才能正常使用U盘?这两个哪个容易实现一点?我个人觉得第一种设计合理一点,但是不知道技术上实现的难度怎样?有大神指点一下么?谢谢! 解决方案 这两个办法都不太好.推荐你用shell扩展在用户打开文件夹的时候让用户输入.

WinCE下非标准键盘的驱动程序设计

    键盘作为收入设备,在嵌入式系统中应用广泛.它与PC键盘不同,嵌入式系统中的键盘千差万别,随实际应用的场景不同而不同.今天在这里介绍就是一种非标准键盘的驱动程序设计.在一些应用中,可能只会用到有限的几个按键.为了节省硬件成本,并充分利用既有的硬件资源,通常将这些按键连接到MCU的外部中断引脚上.如S3C2410有一百多个GPIO,几十个外部中断,我们就可以用几个外部中断来实现系统的按键功能.     虽然嵌入式系统中的键盘形形色色,各不相同,但驱动的框架基本一致.从工作模式的角度来看,一般

新扬天机型标配USB键盘功能键驱动问题注意事项(Win10)

新扬天电脑所配USB键盘,F1-F12系统下会默认为快捷键(功能键)而非F1-F12实际功能.可能会导致您在使用习惯上的不适应. 解决方案: 在系统下默认为功能键盘,其中F1-F12的功能如下: 键盘驱动安装目录: X:\Driver\Lx_Key\Lenovo Edge Slim New F5 KB (YT)LBG parts\setup.exe 补充说明: 自检过程: 在自检过程中按F1可正常进入BIOS,F9.F10均可正常使用:Fn+F1也可正常进入到BIOS,Fn+F9,Fn+F10均

win10升级失败提示银行网银键盘保护驱动 peckp.sys解决办法

既然是网银的相关文件保护导致无法升级系统我们只需要找到对应的文件然后删除即可了,具体操作步骤如下. 1.在系统中:定位到 C:\Windows\system32\drivers\PECKP 2.然后我们再进入之后我们点击删除就行了. 3.这样就可以继续升级win10了哦 好了删除成功之后这样我们再去升级win10系统你会发现不再在保护提示了.