吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 12233|回复: 11
收起左侧

[系统底层] CreateFile Bypass Filter

[复制链接]
MJ0011 发表于 2010-4-17 00:52
本帖最后由 MJ0011 于 2010-4-17 00:54 编辑

刚才发的和WOW撞车了,重新发一个,也是去年在360内部论坛发过的。

代码目的是用IoCreateFileSpecifyDeviceObjectHint打开文件,绕过fsfilter

其中判断只打开非系统卷(通过注册表识别)
同时,当卷未加载时,使用一个技巧(IoVerifyVolume)来间接调用IopMountVolume,让卷的设备在FS上能找到(VPB有底层设备)

是以前为了解决卡巴2010的一个脑残BUG写的,最后没使用,不过注册表识别系统卷和强制挂载卷的方法还是比较有意思的。
 



PVOID pIoCreateFileSpecifyDeviceObjectHint = 0 ;
extern POBJECT_TYPE *IoDeviceObjectType;
ULONG SystemVolumeIndex = 0xffffffff; 
NTSTATUS MyIoCreateFile(
                                                                                         OUT PHANDLE FileHandle,
                                                                                         IN ACCESS_MASK DesiredAccess,
                                                                                         IN POBJECT_ATTRIBUTES ObjectAttributes,
                                                                                         OUT PIO_STATUS_BLOCK IoStatusBlock,
                                                                                         IN PLARGE_INTEGER AllocationSize OPTIONAL,
                                                                                         IN ULONG FileAttributes,
                                                                                         IN ULONG ShareAccess,
                                                                                         IN ULONG Disposition,
                                                                                         IN ULONG CreateOptions,
                                                                                         IN PVOID EaBuffer OPTIONAL,
                                                                                         IN ULONG EaLength,
                                                                                         IN CREATE_FILE_TYPE CreateFileType,
                                                                                         IN PVOID ExtraCreateParameters OPTIONAL,
                                                                                         IN ULONG Options
                                                                                         )
{
        NTSTATUS stat ;
        LPWSTR pPathVolume;
        ULONG volumeindex ;
        WCHAR VolumePath[13] = L"\\GLOBAL??\\A:";
        HANDLE LinkHandle ; 
        OBJECT_ATTRIBUTES oba ; 
        PDEVICE_OBJECT DeviceObject ; 

        if (pIoCreateFileSpecifyDeviceObjectHint == NULL || UserInit)
        {
                goto NormalCreateFile; 
        }
        
        pPathVolume = ObjectAttributes->ObjectName->Buffer + 4;
        
        if (*pPathVolume >= L'A' && *pPathVolume <= L'Z')
        {
                volumeindex = *pPathVolume - L'A';
        }
        else if(*pPathVolume >= L'a' && *pPathVolume <= L'z')
        {
                volumeindex = *pPathVolume - L'a';
        }
        else
        {
                goto NormalCreateFile;
        }

        if (pPathVolume[1] != L':' || pPathVolume[2] != L'\\')
        {
                goto NormalCreateFile; 
        }

        if (volumeindex == SystemVolumeIndex )
        {
                goto NormalCreateFile;
        }

        if (VolumeBaseDevObjCache[volumeindex] == 0 )
        {
                UNICODE_STRING uniname ; 
                HANDLE KeyHandle ; 
                UNICODE_STRING DevUniName; 
                PVOID pKeyInfo ;
                ULONG btr ; 
                LPWSTR pDeviceName ; 
                PKEY_VALUE_PARTIAL_INFORMATION KeyValueInfo ;
                PFILE_OBJECT FileObject ; 

                VolumePath[10] = VolumePath[10] + volumeindex ; 


                RtlInitUnicodeString(&uniname , L"\\Registry\\Machine\\SYSTEM\\Setup");
                InitializeObjectAttributes(&oba , &uniname , OBJ_CASE_INSENSITIVE , 0 , 0);
                stat = ZwOpenKey(&KeyHandle , KEY_ALL_ACCESS , &oba);
                
                if (!NT_SUCCESS(stat))
                {
                        goto NormalCreateFile; 
                }
                pKeyInfo = ExAllocatePool(NonPagedPool , sizeof(KEY_VALUE_PARTIAL_INFORMATION)+ MAX_PATH * sizeof(WCHAR));
                
                if (!pKeyInfo)
                {
                        ZwClose(KeyHandle);
                        goto NormalCreateFile;
                }
                RtlInitUnicodeString(&uniname , L"SystemPartition");
                stat = ZwQueryValueKey(KeyHandle , 
                                                                &uniname ,
                                                                KeyValuePartialInformation , 
                                                                pKeyInfo  ,
                                                                sizeof(KEY_VALUE_PARTIAL_INFORMATION) + MAX_PATH * sizeof(WCHAR) ,
                                                                &btr );
                ZwClose(KeyHandle);

                if (!NT_SUCCESS(stat))
                {
                        ExFreePool(pKeyInfo);
                        goto NormalCreateFile;
                }
                
                RtlInitUnicodeString(&uniname, VolumePath);
                InitializeObjectAttributes(&oba  , &uniname , OBJ_CASE_INSENSITIVE , 0 , 0  );
                        
                        
                stat = ZwOpenSymbolicLinkObject(&LinkHandle , SYMBOLIC_LINK_QUERY , &oba );

                if (!NT_SUCCESS(stat))
                {
                        ExFreePool(pKeyInfo);
                        goto NormalCreateFile; 

                }
                pDeviceName = ExAllocatePool(NonPagedPool , MAX_PATH*sizeof(WCHAR));

                if (!pDeviceName)
                {
                        ExFreePool(pKeyInfo);
                        ZwClose(LinkHandle);
                        goto NormalCreateFile;
                }

                RtlInitUnicodeString(&DevUniName , pDeviceName);

                DevUniName.MaximumLength = MAX_PATH * sizeof(WCHAR);

                stat = ZwQuerySymbolicLinkObject(LinkHandle , &DevUniName , NULL);
        
                ZwClose(LinkHandle);
                
                if (!NT_SUCCESS(stat))
                {
                        ExFreePool(pKeyInfo);
                        ExFreePool(pDeviceName);
                }

                KeyValueInfo = (PKEY_VALUE_PARTIAL_INFORMATION)pKeyInfo ; 
                if (_wcsnicmp(pDeviceName , &KeyValueInfo->Data , DevUniName.Length / sizeof(WCHAR)) == 0)
                {
                        SystemVolumeIndex = volumeindex ; 
                        ExFreePool(pKeyInfo);
                        ExFreePool(pDeviceName);
                        goto NormalCreateFile;
                }

                ExFreePool(pKeyInfo);


                stat = IoGetDeviceObjectPointer(&DevUniName , 
                        FILE_READ_ATTRIBUTES , 
                        &FileObject , 
                        &DeviceObject );

                ExFreePool(pDeviceName);

                if (!NT_SUCCESS(stat))
                {
                        goto NormalCreateFile ; 
                }

                DeviceObject = IoGetBaseFileSystemDeviceObject(FileObject);
        
        
                if (DeviceObject == FileObject->DeviceObject)
                {
                        //DbgPrint("device object not mounted! %08x\n" , DeviceObject);
                        stat = IoVerifyVolume(DeviceObject , FALSE);
                        if (!NT_SUCCESS(stat))
                        {
                                //DbgPrint("try mounte volume failed %08x\n", stat);
                                ObDereferenceObject(FileObject);
                                goto NormalCreateFile ; 
                        }
                        //DbgPrint("mount volume OK\n");
                        if (DeviceObject->Vpb && DeviceObject->Vpb->DeviceObject)
                        {
                                DeviceObject = DeviceObject->Vpb->DeviceObject ; 
                        }
                }

                ObDereferenceObject(FileObject);

        
                if (!DeviceObject)
                {
                        goto NormalCreateFile;
                }

                VolumeBaseDevObjCache[volumeindex] = DeviceObject ;         

        }
        else
        {
                DeviceObject = VolumeBaseDevObjCache[volumeindex];
        }

        goto BypassCreateFile;
NormalCreateFile:
                        return IoCreateFile(FileHandle , DesiredAccess , 
                                ObjectAttributes , IoStatusBlock , AllocationSize , 
                                FileAttributes , ShareAccess , Disposition , CreateOptions , EaBuffer , 
                                EaLength , CreateFileType , ExtraCreateParameters , Options);

BypassCreateFile:
        
        __asm
        {
                        push DeviceObject 
                        push Options
                        push ExtraCreateParameters
                        push CreateFileType 
                        push EaLength 
                        push EaBuffer 
                        push CreateOptions 
                        push Disposition
                        push ShareAccess
                        push FileAttributes
                        push AllocationSize
                        push IoStatusBlock
                        push ObjectAttributes
                        push DesiredAccess
                        push FileHandle
                        call pIoCreateFileSpecifyDeviceObjectHint
                        mov stat ,eax
                        
        }
        
        return stat ;

}

点评

准备学习精品帖  发表于 2014-7-21 14:46

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

淡淡香草味 发表于 2010-4-17 00:54
抢偶像沙发 膜拜
Hmily 发表于 2010-4-17 01:08
326248485 发表于 2010-4-17 04:56
hixiaosheng 发表于 2010-4-17 13:21
只能膜拜了、、
bob123 发表于 2010-4-17 13:27
膜拜大牛
oopww 发表于 2010-4-18 10:09
不得不膜拜啊!!!
大江与小城 发表于 2010-6-15 15:48
给点注释吧!看不懂
646246208 发表于 2011-8-20 08:10
看看哦,呵呵呵
jiangbo47 发表于 2013-10-12 06:42
youdianyisi
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-20 01:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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