找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 4071|回复: 2

绕过这个IofcallDriver的方法

[复制链接]

280

主题

203

回帖

0

精华

版主

积分
1808
发表于 2011-1-16 00:29:59 | 显示全部楼层 |阅读模式
某日,看一篇HOOK Io(f)CallDriver的文章,心血来潮,想写一个绕过这个IofcallDriver的方法,众所周知,IoCallDriver里面直接调用了IofCallDriver函数,反汇编过这个两个函数的人都应该很有感触,这两个其实很好被挂钩,最简单时只需要该一个DWORD的值就可以了,具体是什么就不说了,不清楚的反汇编一下立刻明白。IofCallDriver的实现我们就算没有反汇编过也应该猜得到,就是按照Irp里面的参数调用相应驱动的分发函数而已。不过还有更简单的方法,看看rectos的实现就可以了,相当简单……

NTSTATUS

FASTCALL

IofCallDriver(IN PDEVICE_OBJECT DeviceObject,

              IN PIRP Irp)

{

    PDRIVER_OBJECT DriverObject;

    PIO_STACK_LOCATION Param;


    /* Get the Driver Object */

DriverObject = DeviceObject->DriverObject;


    /* Decrease the current location and check if */

    Irp->CurrentLocation--;

    if (Irp->CurrentLocation <= 0)

    {

        /* This IRP ran out of stack, bugcheck */

        KeBugCheckEx(NO_MORE_IRP_STACK_LOCATIONS, (ULONG_PTR)Irp, 0, 0, 0);

    }


    /* Now update the stack location */

    Param = IoGetNextIrpStackLocation(Irp);

    Irp->Tail.Overlay.CurrentStackLocation = Param;


    /* Get the Device Object */

    Param->DeviceObject = DeviceObject;


    /* Call it */

    return DriverObject->MajorFunction[Param->MajorFunction](DeviceObject,

                                                             Irp);

}

个人觉得,挂钩这个函数用处不大,因为,如果是为了拦截用户态调用,挂钩不够正统,如果是拦截驱动又基本不起作用。

28

主题

116

回帖

0

精华

铜牌会员

积分
273
发表于 2011-12-4 23:58:19 | 显示全部楼层

学习一下!

0

主题

16

回帖

0

精华

初来乍到

积分
9
发表于 2011-12-5 13:23:38 | 显示全部楼层
学习一下!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表