找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 14983|回复: 13

如何hook iofcalldriver

 火... [复制链接]

5

主题

39

回帖

1

精华

铂金会员

积分
1567
发表于 2011-1-10 19:46:02 | 显示全部楼层 |阅读模式
这个代码我最近在看雪看到的。可以实现隐藏文件
但是这个函数如何去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;
}

5

主题

47

回帖

0

精华

铜牌会员

积分
210
发表于 2011-1-10 19:51:57 | 显示全部楼层
不是给代码了么

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2011-1-10 20:43:49 | 显示全部楼层
这不就是inline hook吗。。。
不过我告诉你,Hook IofCallDriver没有任何用处,不信请看:
http://www.m5home.com/bbs/thread-4613-1-1.html

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2011-1-10 20:47:37 | 显示全部楼层
楼主如果要在Win32系统下保护文件,建议Hook以下函数:
IoCreateFile
IoCheckShareAccess
附件是我做的示例。
楼主如果要在Win64系统下保护文件,建议使用文件过滤驱动。或者参考:
http://www.m5home.com/bbs/thread-5007-1-1.html

protectfile.7z

7.91 KB, 阅读权限: 10, 下载次数: 35

售价: 2 水晶币  [记录]

0

主题

3

回帖

0

精华

初来乍到

积分
6
发表于 2011-1-10 21:48:54 | 显示全部楼层
好文,谢谢分享啊!!!:curse::curse::curse:

0

主题

3

回帖

0

精华

初来乍到

积分
6
发表于 2011-1-10 21:49:39 | 显示全部楼层
正在学习中,先谢啦,呵呵

5

主题

39

回帖

1

精华

铂金会员

积分
1567
 楼主| 发表于 2011-1-11 12:02:08 | 显示全部楼层
回复 Tesla.Angela 的帖子

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

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 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("IofCallDriverelete 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

InlineHook IoCallDriver来保护文件.7z

8 KB, 下载次数: 4

售价: 2 水晶币  [记录]

5

主题

39

回帖

1

精华

铂金会员

积分
1567
 楼主| 发表于 2011-1-14 10:22:18 | 显示全部楼层
回复 Tesla.Angela 的帖子

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

5

主题

39

回帖

1

精华

铂金会员

积分
1567
 楼主| 发表于 2011-1-14 11:55:33 | 显示全部楼层
不过有些问题,?不知道原作者测试没有。。。。。?贴上奔溃时的一张图
不过网上也有人说了。最好不要hook这个函数因为。它很频繁使用,效率也是个问题。。。
12.gif

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2011-1-14 12:12:14 | 显示全部楼层
最好不要hook这个函数是因为hook它没有用。

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2011-1-14 12:14:20 | 显示全部楼层
另外作者好像也确实缺乏一些安全判断,比如没有检查:
DriverObject->DriverName.Buffer
FileObject->FileName.Buffer
的有效性。

29

主题

134

回帖

4

精华

论坛元老

积分
5970
QQ
发表于 2011-1-19 11:35:55 | 显示全部楼层
Tesla.Angela  你说的那个IoCheckShareAccess hook怎么在我虚拟机里面不行啊 也进入自己的函数了 权限也设置成拒绝了 可是照样能够访问 读写删除

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2011-1-19 16:08:22 | 显示全部楼层
回复 jiedengye 的帖子

这个就不知道了,不记得当年是可行的(XP-SP3)。
现在都用Win7x64了,Win32下的事情已经忘记得七七八八了。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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