|
某日,看一篇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);
}
个人觉得,挂钩这个函数用处不大,因为,如果是为了拦截用户态调用,挂钩不够正统,如果是拦截驱动又基本不起作用。
|
|