nbboy 发表于 2011-1-10 19:46:02

如何hook iofcalldriver

这个代码我最近在看雪看到的。可以实现隐藏文件
但是这个函数如何去hook呢?显然inline&ssdthook都不行耶,各位有什么好方法吗?
IofCallDriver函数的原型
NTSTATUS
   __fastcall
   IofCallDriver(
   IN PDEVICE_OBJECT DeviceObject,
   IN OUT PIRP Irp
   );
这是一个fastcall函数,取参数的时候要注意一下。
下面是代码片段:
#define PROLOG __asm { pushad } __asm { pushfd }
#define RETURN __asm { popfd } __asm { popad } __asm { pop eax } __asm{ mov eax, 0xC000000D } __asm{ ret }
#define EPILOG __asm { popfd } __asm { popad } __asm { ret }

_declspec( naked )
NTSTATUS
__fastcall
IofCallDriver_Hook(
      IN PDEVICE_OBJECT DeviceObject,
      IN OUT PIRP Irp
      )
{
PROLOG
__asm
{
    push ecx
    pop dword ptr g_HookParam.DeviceObject
    push edx
    pop dword ptr g_HookParam.Irp
}
if (IsNeedProtect(g_HookParam.DeviceObject, g_HookParam.Irp))
{
    dprintf("Protect start...\n");
    RETURN
}

Exit0:
EPILOG

}

int IsNeedProtect(DEVICE_OBJECT *DeviceObject, PIRP Irp)
{
NTSTATUS status = STATUS_INVALID_PARAMETER;
int nResult = FALSE;
DRIVER_OBJECT*DriverObject = DeviceObject->DriverObject;
WCHAR      *pwsz = NULL;
IO_STACK_LOCATION *sp;
FILE_OBJECT    *FileObject = NULL;

sp = IoGetNextIrpStackLocation(Irp);
PROCESS_ERROR(sp);

if (sp->MajorFunction != IRP_MJ_SET_INFORMATION)
{
    goto Exit0;
}

if (sp->Parameters.SetFile.FileInformationClass != FileDispositionInformation)
{
    goto Exit0;
}

FileObject = sp->FileObject;
__try
{
    pwsz = wcsrchr(DriverObject->DriverName.Buffer, L'\\');
    PROCESS_ERROR(pwsz);
    pwsz ++;

    if (_wcsnicmp(pwsz, L"ntfs", 4) &&
      _wcsnicmp(pwsz, L"fastfat", 7))
    {
      goto Exit0;
    }

    dprintf("IofCallDriver: Delete file %ws\n", FileObject->FileName.Buffer);

    pwsz = wcsrchr(FileObject->FileName.Buffer, L'\\');
    if (pwsz)
    {
      pwsz ++;
    }
    else
    {
      pwsz = FileObject->FileName.Buffer;
    }

    if (!_wcsnicmp(pwsz, L"test.exe", 8))
    {
      Irp->IoStatus.Information = 0;
      Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;

      IoCompleteRequest(Irp, IO_NO_INCREMENT);
      nResult = TRUE;
      goto Exit0;
    }

}
__except(1)
{
    goto Exit0;
}

Exit0:
return nResult;
}

Lgc小孩修电脑 发表于 2011-1-10 19:51:57

不是给代码了么

Tesla.Angela 发表于 2011-1-10 20:43:49

这不就是inline hook吗。。。
不过我告诉你,Hook IofCallDriver没有任何用处,不信请看:
http://www.m5home.com/bbs/thread-4613-1-1.html

Tesla.Angela 发表于 2011-1-10 20:47:37

楼主如果要在Win32系统下保护文件,建议Hook以下函数:
IoCreateFile
IoCheckShareAccess
附件是我做的示例。
楼主如果要在Win64系统下保护文件,建议使用文件过滤驱动。或者参考:
http://www.m5home.com/bbs/thread-5007-1-1.html

gauss 发表于 2011-1-10 21:48:54

好文,谢谢分享啊!!!:curse::curse::curse:

gauss 发表于 2011-1-10 21:49:39

正在学习中,先谢啦,呵呵

nbboy 发表于 2011-1-11 12:02:08

回复 Tesla.Angela 的帖子

恩。。。自己发irp的确是个好方法。。。。。谢谢!

Tesla.Angela 发表于 2011-1-13 23:58:19

帮楼主找到个liuke_beeth写的hook iofcalldriver的例子。
liuke_beeth还说:

由于没有防止修改文件内容来删除文件,所以重新修改代码使其能防止修改文件内容来删除文件,由于代码上传不上去,所以把代码贴出来,希望大家对本人的文章提出更多的建议,谢谢大家!
修改源代码的部分如下,大家用它替换原文件的IsNeedProtect函数即可,重新编译就可以哪:

int IsNeedProtect(DEVICE_OBJECT *DeviceObject, PIRP Irp)
{
NTSTATUS status;
int nResult=FALSE;
DRIVER_OBJECT *DriverObject=DeviceObject->DriverObject;
WCHAR *pwsz=NULL;
IO_STACK_LOCATION *sp;
FILE_OBJECT *FileObject=NULL;
   
status=STATUS_INVALID_PARAMETER;
sp=IoGetNextIrpStackLocation(Irp);;
   

switch(sp->MajorFunction)
{
case IRP_MJ_SET_INFORMATION:
goto Continue11;
   
case IRP_MJ_WRITE:
goto Continue11;
   
default:
goto Exit00;
}
   
Continue11:
FileObject=sp->FileObject;
_try
{
    pwsz=wcsrchr(DriverObject->DriverName.Buffer,L'\\');
      pwsz++;
         
      //判断Irp是不是发往ntfs和fastfat驱动的,不是则跳出
      if (_wcsnicmp(pwsz,L"ntfs",4)&&_wcsnicmp(pwsz,L"fastfat",7))
      {
      goto Exit00;
      }
         
   DbgPrint("IofCallDriver:Delete File:%ws\n",FileObject->FileName.Buffer);

   pwsz=wcsrchr(FileObject->FileName.Buffer,L'\\');
   if (pwsz!=NULL)
   {
   pwsz++;
   }
   

   if (!_wcsnicmp(pwsz,L"1234.txt",16))
   {
    Irp->IoStatus.Information=0;
      Irp->IoStatus.Status=STATUS_ACCESS_DENIED;
      IoCompleteRequest(Irp,IO_NO_INCREMENT);
      nResult=TRUE;
      goto Exit00;
   }

}

except(1)
{
goto Exit00;
}

Exit00:
return nResult;
}

http://www.hacker.com.cn/forum/view_131269.html

nbboy 发表于 2011-1-14 10:22:18

回复 Tesla.Angela 的帖子

感谢。。。呵呵。。。。赶紧看看!

nbboy 发表于 2011-1-14 11:55:33

不过有些问题,?不知道原作者测试没有。。。。。?贴上奔溃时的一张图
不过网上也有人说了。最好不要hook这个函数因为。它很频繁使用,效率也是个问题。。。

Tesla.Angela 发表于 2011-1-14 12:12:14

最好不要hook这个函数是因为hook它没有用。

Tesla.Angela 发表于 2011-1-14 12:14:20

另外作者好像也确实缺乏一些安全判断,比如没有检查:
DriverObject->DriverName.Buffer
FileObject->FileName.Buffer
的有效性。

jiedengye 发表于 2011-1-19 11:35:55

Tesla.Angela你说的那个IoCheckShareAccess hook怎么在我虚拟机里面不行啊 也进入自己的函数了 权限也设置成拒绝了 可是照样能够访问 读写删除

Tesla.Angela 发表于 2011-1-19 16:08:22

回复 jiedengye 的帖子

这个就不知道了,不记得当年是可行的(XP-SP3)。
现在都用Win7x64了,Win32下的事情已经忘记得七七八八了。
页: [1]
查看完整版本: 如何hook iofcalldriver