|
代码目的是用IoCreateFileSpecifyDeviceObjectHint打开文件,绕过fsfilter
其中判断只打开非系统卷(通过注册表识别)
同时,当卷未加载时,使用一个技巧(IoVerifyVolume)来间接调用IopMountVolume,让卷的设备在FS上能找到(VPB有底层设备)
是以前为了解决卡巴2010的一个脑残BUG写的,最后没使用,不过注册表识别系统卷和强制挂载卷的方法还是比较有意思的。- <li>
- </li><li>
- </li><li>
- </li><li>
- </li><li>PVOID pIoCreateFileSpecifyDeviceObjectHint = 0 ;
- </li><li>extern POBJECT_TYPE *IoDeviceObjectType;
- </li><li>ULONG SystemVolumeIndex = 0xffffffff;
- </li><li>NTSTATUS MyIoCreateFile(
- </li><li>
- OUT PHANDLE FileHandle,
- </li><li>
- IN ACCESS_MASK DesiredAccess,
- </li><li>
- IN POBJECT_ATTRIBUTES ObjectAttributes,
- </li><li>
- OUT PIO_STATUS_BLOCK IoStatusBlock,
- </li><li>
- IN PLARGE_INTEGER AllocationSize OPTIONAL,
- </li><li>
- IN ULONG FileAttributes,
- </li><li>
- IN ULONG ShareAccess,
- </li><li>
- IN ULONG Disposition,
- </li><li>
- IN ULONG CreateOptions,
- </li><li>
- IN PVOID EaBuffer OPTIONAL,
- </li><li>
- IN ULONG EaLength,
- </li><li>
- IN CREATE_FILE_TYPE CreateFileType,
- </li><li>
- IN PVOID ExtraCreateParameters OPTIONAL,
- </li><li>
- IN ULONG Options
- </li><li>
- )
- </li><li>{
- </li><li> NTSTATUS stat ;
- </li><li> LPWSTR pPathVolume;
- </li><li> ULONG volumeindex ;
- </li><li> WCHAR VolumePath[13] = L"\\GLOBAL??\\A:";
- </li><li> HANDLE LinkHandle ;
- </li><li> OBJECT_ATTRIBUTES oba ;
- </li><li> PDEVICE_OBJECT DeviceObject ;
- </li><li>
- </li><li> if (pIoCreateFileSpecifyDeviceObjectHint == NULL || UserInit)
- </li><li> {
- </li><li> goto NormalCreateFile;
- </li><li> }
- </li><li>
- </li><li> pPathVolume = ObjectAttributes->ObjectName->Buffer + 4;
- </li><li>
- </li><li> if (*pPathVolume >= L'A' && *pPathVolume <= L'Z')
- </li><li> {
- </li><li> volumeindex = *pPathVolume - L'A';
- </li><li> }
- </li><li> else if(*pPathVolume >= L'a' && *pPathVolume <=
- L'z')
- </li><li> {
- </li><li> volumeindex = *pPathVolume - L'a';
- </li><li> }
- </li><li> else
- </li><li> {
- </li><li> goto NormalCreateFile;
- </li><li> }
- </li><li>
- </li><li> if (pPathVolume[1] != L':' || pPathVolume[2] != L'\\')
- </li><li> {
- </li><li> goto NormalCreateFile;
- </li><li> }
- </li><li>
- </li><li> if (volumeindex == SystemVolumeIndex )
- </li><li> {
- </li><li> goto NormalCreateFile;
- </li><li> }
- </li><li>
- </li><li> if (VolumeBaseDevObjCache[volumeindex] == 0 )
- </li><li> {
- </li><li> UNICODE_STRING uniname ;
- </li><li> HANDLE KeyHandle ;
- </li><li> UNICODE_STRING DevUniName;
- </li><li> PVOID pKeyInfo ;
- </li><li> ULONG btr ;
- </li><li> LPWSTR pDeviceName ;
- </li><li> PKEY_VALUE_PARTIAL_INFORMATION KeyValueInfo ;
- </li><li> PFILE_OBJECT FileObject ;
- </li><li>
- </li><li> VolumePath[10] = VolumePath[10] + volumeindex ;
- </li><li>
- </li><li>
- </li><li> RtlInitUnicodeString(&uniname ,
- L"\\Registry\\Machine\\SYSTEM\\Setup");
- </li><li> InitializeObjectAttributes(&oba , &uniname ,
- OBJ_CASE_INSENSITIVE , 0 , 0);
- </li><li> stat = ZwOpenKey(&KeyHandle , KEY_ALL_ACCESS ,
- &oba);
- </li><li>
- </li><li> if (!NT_SUCCESS(stat))
- </li><li> {
- </li><li> goto NormalCreateFile;
- </li><li> }
- </li><li> pKeyInfo = ExAllocatePool(NonPagedPool ,
- sizeof(KEY_VALUE_PARTIAL_INFORMATION)+ MAX_PATH * sizeof(WCHAR));
- </li><li>
- </li><li> if (!pKeyInfo)
- </li><li> {
- </li><li> ZwClose(KeyHandle);
- </li><li> goto NormalCreateFile;
- </li><li> }
- </li><li> RtlInitUnicodeString(&uniname , L"SystemPartition");
- </li><li> stat = ZwQueryValueKey(KeyHandle ,
- </li><li> &uniname
- ,
- </li><li>
- KeyValuePartialInformation ,
- </li><li>
- pKeyInfo ,
- </li><li>
- sizeof(KEY_VALUE_PARTIAL_INFORMATION) + MAX_PATH * sizeof(WCHAR) ,
- </li><li> &btr
- );
- </li><li> ZwClose(KeyHandle);
- </li><li>
- </li><li> if (!NT_SUCCESS(stat))
- </li><li> {
- </li><li> ExFreePool(pKeyInfo);
- </li><li> goto NormalCreateFile;
- </li><li> }
- </li><li>
- </li><li> RtlInitUnicodeString(&uniname, VolumePath);
- </li><li> InitializeObjectAttributes(&oba , &uniname ,
- OBJ_CASE_INSENSITIVE , 0 , 0 );
- </li><li>
- </li><li>
- </li><li> stat = ZwOpenSymbolicLinkObject(&LinkHandle ,
- SYMBOLIC_LINK_QUERY , &oba );
- </li><li>
- </li><li> if (!NT_SUCCESS(stat))
- </li><li> {
- </li><li> ExFreePool(pKeyInfo);
- </li><li> goto NormalCreateFile;
- </li><li>
- </li><li> }
- </li><li> pDeviceName = ExAllocatePool(NonPagedPool ,
- MAX_PATH*sizeof(WCHAR));
- </li><li>
- </li><li> if (!pDeviceName)
- </li><li> {
- </li><li> ExFreePool(pKeyInfo);
- </li><li> ZwClose(LinkHandle);
- </li><li> goto NormalCreateFile;
- </li><li> }
- </li><li>
- </li><li> RtlInitUnicodeString(&DevUniName , pDeviceName);
- </li><li>
- </li><li> DevUniName.MaximumLength = MAX_PATH * sizeof(WCHAR);
- </li><li>
- </li><li> stat = ZwQuerySymbolicLinkObject(LinkHandle ,
- &DevUniName , NULL);
- </li><li>
- </li><li> ZwClose(LinkHandle);
- </li><li>
- </li><li> if (!NT_SUCCESS(stat))
- </li><li> {
- </li><li> ExFreePool(pKeyInfo);
- </li><li> ExFreePool(pDeviceName);
- </li><li> }
- </li><li>
- </li><li> KeyValueInfo = (PKEY_VALUE_PARTIAL_INFORMATION)pKeyInfo ;
- </li><li> if (_wcsnicmp(pDeviceName , &KeyValueInfo->Data ,
- DevUniName.Length / sizeof(WCHAR)) == 0)
- </li><li> {
- </li><li> SystemVolumeIndex = volumeindex ;
- </li><li> ExFreePool(pKeyInfo);
- </li><li> ExFreePool(pDeviceName);
- </li><li> goto NormalCreateFile;
- </li><li> }
- </li><li>
- </li><li> ExFreePool(pKeyInfo);
- </li><li>
- </li><li>
- </li><li> stat = IoGetDeviceObjectPointer(&DevUniName ,
- </li><li> FILE_READ_ATTRIBUTES ,
- </li><li> &FileObject ,
- </li><li> &DeviceObject );
- </li><li>
- </li><li> ExFreePool(pDeviceName);
- </li><li>
- </li><li> if (!NT_SUCCESS(stat))
- </li><li> {
- </li><li> goto NormalCreateFile ;
- </li><li> }
- </li><li>
- </li><li> DeviceObject =
- IoGetBaseFileSystemDeviceObject(FileObject);
- </li><li>
- </li><li>
- </li><li> if (DeviceObject == FileObject->DeviceObject)
- </li><li> {
- </li><li> //DbgPrint("device object not mounted! %08x\n" ,
- DeviceObject);
- </li><li> stat = IoVerifyVolume(DeviceObject , FALSE);
- </li><li> if (!NT_SUCCESS(stat))
- </li><li> {
- </li><li> //DbgPrint("try mounte volume failed
- %08x\n", stat);
- </li><li> ObDereferenceObject(FileObject);
- </li><li> goto NormalCreateFile ;
- </li><li> }
- </li><li> //DbgPrint("mount volume OK\n");
- </li><li> if (DeviceObject->Vpb &&
- DeviceObject->Vpb->DeviceObject)
- </li><li> {
- </li><li> DeviceObject =
- DeviceObject->Vpb->DeviceObject ;
- </li><li> }
- </li><li> }
- </li><li>
- </li><li> ObDereferenceObject(FileObject);
- </li><li>
- </li><li>
- </li><li> if (!DeviceObject)
- </li><li> {
- </li><li> goto NormalCreateFile;
- </li><li> }
- </li><li>
- </li><li> VolumeBaseDevObjCache[volumeindex] = DeviceObject ;
-
- </li><li>
- </li><li> }
- </li><li> else
- </li><li> {
- </li><li> DeviceObject = VolumeBaseDevObjCache[volumeindex];
- </li><li> }
- </li><li>
- </li><li> goto BypassCreateFile;
- </li><li>NormalCreateFile:
- </li><li> return IoCreateFile(FileHandle , DesiredAccess ,
- </li><li> ObjectAttributes , IoStatusBlock ,
- AllocationSize ,
- </li><li> FileAttributes , ShareAccess , Disposition ,
- CreateOptions , EaBuffer ,
- </li><li> EaLength , CreateFileType ,
- ExtraCreateParameters , Options);
- </li><li>
- </li><li>BypassCreateFile:
- </li><li>
- </li><li> __asm
- </li><li> {
- </li><li> push DeviceObject
- </li><li> push Options
- </li><li> push ExtraCreateParameters
- </li><li> push CreateFileType
- </li><li> push EaLength
- </li><li> push EaBuffer
- </li><li> push CreateOptions
- </li><li> push Disposition
- </li><li> push ShareAccess
- </li><li> push FileAttributes
- </li><li> push AllocationSize
- </li><li> push IoStatusBlock
- </li><li> push ObjectAttributes
- </li><li> push DesiredAccess
- </li><li> push FileHandle
- </li><li> call pIoCreateFileSpecifyDeviceObjectHint
- </li><li> mov stat ,eax
- </li><li>
- </li><li> }
- </li><li>
- </li><li> return stat ;
- </li><li>
- </li><li>}</li>
复制代码 |
|