|
这个代码我最近在看雪看到的。可以实现隐藏文件
但是这个函数如何去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;
}
|
|