如何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;
}
不是给代码了么 这不就是inline hook吗。。。
不过我告诉你,Hook IofCallDriver没有任何用处,不信请看:
http://www.m5home.com/bbs/thread-4613-1-1.html 楼主如果要在Win32系统下保护文件,建议Hook以下函数:
IoCreateFile
IoCheckShareAccess
附件是我做的示例。
楼主如果要在Win64系统下保护文件,建议使用文件过滤驱动。或者参考:
http://www.m5home.com/bbs/thread-5007-1-1.html 好文,谢谢分享啊!!!:curse::curse::curse: 正在学习中,先谢啦,呵呵 回复 Tesla.Angela 的帖子
恩。。。自己发irp的确是个好方法。。。。。谢谢! 帮楼主找到个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 回复 Tesla.Angela 的帖子
感谢。。。呵呵。。。。赶紧看看! 不过有些问题,?不知道原作者测试没有。。。。。?贴上奔溃时的一张图
不过网上也有人说了。最好不要hook这个函数因为。它很频繁使用,效率也是个问题。。。
最好不要hook这个函数是因为hook它没有用。 另外作者好像也确实缺乏一些安全判断,比如没有检查:
DriverObject->DriverName.Buffer
FileObject->FileName.Buffer
的有效性。 Tesla.Angela你说的那个IoCheckShareAccess hook怎么在我虚拟机里面不行啊 也进入自己的函数了 权限也设置成拒绝了 可是照样能够访问 读写删除 回复 jiedengye 的帖子
这个就不知道了,不记得当年是可行的(XP-SP3)。
现在都用Win7x64了,Win32下的事情已经忘记得七七八八了。
页:
[1]