NEU-Punk
驱动牛犊
驱动牛犊
  • 注册日期2009-10-02
  • 最后登录2010-11-13
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望131点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1964回复:4

键盘钩子的问题

楼主#
更多 发布于:2010-11-12 14:15
打开\\driver\\kbdclass,把所有分发函数替换为下面这个函数

NTSTATUS HookedDispatch(DEVICE_OBJECT *DeviceObject, IRP *Irp)
{
NTSTATUS status = STATUS_SUCCESS;
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
if(stack->MajorFunction == IRP_MJ_READ)
{
    if(Irp->UserBuffer)
    {    
        KEYBOARD_INPUT_DATA *data = (KEYBOARD_INPUT_DATA *)Irp->UserBuffer;
        DbgPrint("ID: KBD%d\tCODE: 0x%x\tPUSH: %d\n", data->UnitId, data->MakeCode, data->Flags);
        Irp->IoStatus.Status = status;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);//直接完成,不让irp下发
        return status;
    }
}
else
    status = pOldDispatch[stack->MajorFunction](DeviceObject, Irp);//保存下来的原来的分发函数
return status;
}

问题是,这个Irp完成不掉,函数返回后,马上来一个相同的Irp,data里的数据也一样,无限执行下去....调用原分发函数当然没有问题。
lyk_ffl
驱动牛犊
驱动牛犊
  • 注册日期2009-04-13
  • 最后登录2011-03-04
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望81点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-11-17 09:25
这样直接IoCompleteRequest当然不行了,看看windows中键盘的工作原理就明白了,建议参考《寒江独钓-windows内核安全编程》第4章
fanzi
驱动小牛
驱动小牛
  • 注册日期2004-12-09
  • 最后登录2013-12-19
  • 粉丝1
  • 关注0
  • 积分1004分
  • 威望754点
  • 贡献值0点
  • 好评度93点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-11-16 12:11
我觉得你这么干估计不行,你首先要记住它以前的函数地址,你不能简单的替换。应该调用一下他以前的函数

------------------------------------------------------------------
帆子内核驱动网
bbs.kerneldev.com
张帆的内核学习论坛 http://bbs.kerneldev.com
NEU-Punk
驱动牛犊
驱动牛犊
  • 注册日期2009-10-02
  • 最后登录2010-11-13
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望131点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2010-11-12 16:39
如果设Irp.IoStatus.status为非SUCCESS,则从此以后再无Irp到来,键盘失效。
NEU-Punk
驱动牛犊
驱动牛犊
  • 注册日期2009-10-02
  • 最后登录2010-11-13
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望131点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2010-11-12 15:28
我就是想让这个键盘事件不让系统知道.....
游客

返回顶部