首页
社区
课程
招聘
[原创]QQProtect驱动保护目录跟踪漏洞详细分析(9月22日更新)
发表于: 2013-9-20 19:43 8902

[原创]QQProtect驱动保护目录跟踪漏洞详细分析(9月22日更新)

2013-9-20 19:43
8902
NTSTATUS 
NTAPI
studZwSetInformationFile(
    IN HANDLE  FileHandle,
    OUT PIO_STATUS_BLOCK  IoStatusBlock,
    IN PVOID  FileInformation,
    IN ULONG  Length,
    IN FILE_INFORMATION_CLASS  FileInformationClass
    )
{
    NTSTATUS        status = STATUS_UNSUCCESSFUL;
    BOOLEAN         bProtect = FALSE;
    PWSTR           NewQQPathDir = NULL;
 
    bProtect = CheckAndRecordRenameInfor(
                    FileHandle,
                    IoStatusBlock,
                    FileInformation,
                    Length,
                    FileInformationClass,
                    &NewQQPathDir );
    if( bProtect )
    {
        status = STATUS_ACCESS_DENIED;
        goto exit;
    }
    else
    {
        PZWSETINFORMATIONFILE OrgFuncAddr = (PZWSETINFORMATIONFILE)
            g_BaseHookTbl[ BaseHookId_ZwSetInformationFile ].OriginalFuncAddress;
        if( !OrgFuncAddr || !MmIsAddressValid( OrgFuncAddr))
        {
            if( g_Org_Ssdt_Func_table != NULL &&
                (LONG)g_BaseHookTbl[ BaseHookId_ZwSetInformationFile ].IndexInSsdt >= 0 &&
                g_BaseHookTbl[ BaseHookId_ZwSetInformationFile ].IndexInSsdt < KeServiceDescriptorTable.NumberOfServices)
            {
                OrgFuncAddr = (PZWSETINFORMATIONFILE)g_Org_Ssdt_Func_table[ g_BaseHookTbl[ BaseHookId_ZwSetInformationFile ].IndexInSsdt];
                if( !OrgFuncAddr )
                    OrgFuncAddr = (PZWSETINFORMATIONFILE)g_BaseHookTbl[ BaseHookId_ZwSetInformationFile ].OriginalFuncAddress;
            }
        }
        status = OrgFuncAddr( FileHandle,
                    IoStatusBlock,
                    FileInformation,
                    Length,
                    FileInformationClass);
 
        if( FileInformationClass = FileRenameInformation && NT_SUCCESS( status ))
        {
            if( !NewQQPathDir )
                return status;
            SetNewQQPathAndProtectExePathInReg( NewQQPathDir );
        }
    }//end if  bProtec else
 
 
exit:
    if( NewQQPathDir )
        ExFreePool( NewQQPathDir );
 
    return status;
}
BOOLEAN
NTAPI
CheckAndRecordRenameInfor(
    IN HANDLE  FileHandle,
    OUT PIO_STATUS_BLOCK  IoStatusBlock,
    IN PVOID  FileInformation,
    IN ULONG  Length,
    IN FILE_INFORMATION_CLASS  FileInformationClass,
    OUT PWSTR   *NewQQPathDir)
/*++
 
NOTE:
    the caller must call ExFreePool to free the memory that returned by NewQQPathDir
--*/
{
    WCHAR               FileName[MAX_UNICODE_STRING_CHARS + 1 ] = {0};
    IO_STATUS_BLOCK     ioStatusBlock = {0};
    FILE_STANDARD_INFORMATION FileInfor = {0};
    HANDLE              hFile = 0;
    BOOLEAN             bResult = FALSE;
    ULONG               chars = 0,bytes = 0,current_pid = 0;
    REGISTRY_DB_HELPER_DATA HelperData = {0};
 
    if( !g_bFileMon ||
        !(g_GlobalControlBlock.MonFlag & 0x10) ||
        ( FileInformationClass != FileRenameInformation &&
           FileInformationClass != FileLinkInformation &&
           FileInformationClass != FileDispositionInformation &&
           FileInformationClass != FileAllocationInformation) ||
        ExGetPreviousMode() == KernelMode ||
        FileHandle == 0 ||
        IsProcessInList5AndBelievable( current_pid = (ULONG)PsGetCurrentProcessId(),6,NULL )
      )
    {
        goto exit;
    }
 
    if( !NT_SUCCESS( DuplicateHandle( FileHandle,*IoFileObjectType,&hFile)))
        goto exit;
    if( !NT_SUCCESS( ZwQueryInformationFile( hFile,
                                             &ioStatusBlock,
                                             &FileInfor,
                                             sizeof(FileInfor),
                                             FileStandardInformation)))
        goto exit;
    if( FileInfor.DeletePending == TRUE )
        goto exit;
 
    bResult = GetFileDosDeviceNameByHandle( FileHandle,FileName,MAX_UNICODE_STRING_CHARS);
    if( !bResult )
        goto exit;
 
    AdjustPathString( FileName,MAX_UNICODE_STRING_CHARS );
    chars = wcslen( FileName );
    if( FileName[ chars - 1 ] == L'\\')
        FileName[ chars - 1 ] = L'\0';
 
    __try{
    HelperData.Unknown2 = 4;
    HelperData.Flags = FileInformationClass;
    HelperData.Pid = current_pid;
    bResult = IsFileNameProtectedFile( FileName,MAX_UNICODE_STRING_CHARS,0,&HelperData);
    }__except( EXCEPTION_EXECUTE_HANDLER )
    {
        KdPrint(("Exception occurred in CheckAndRecordRenameInfor 1 \n"));
    }
 
    if( bResult || 
        FileInformationClass != FileRenameInformation ||
        FileInformation == NULL )
        goto exit;
 
    __try{
    VerifyAndHashMemory( FileInformation,sizeof(FILE_RENAME_INFORMATION),4 );
    bytes = ((PFILE_RENAME_INFORMATION)FileInformation)->FileNameLength;
    if( bytes )
    {
        VerifyAndHashMemory( ((PFILE_RENAME_INFORMATION)FileInformation)->FileName,
                              bytes,
                              sizeof(WCHAR));
        if( !IsFileDirectory( hFile ) ||
            !(bResult = IsDirectoryInQQSubBinDirTbl( FileName,MAX_UNICODE_STRING_CHARS)) &&
            !(bResult = IsDirectoryInMyProtectedDataFileDir(
                ((PFILE_RENAME_INFORMATION)FileInformation)->FileName,bytes / sizeof(WCHAR)))
        )
        {
            AdjustPathString( ((PFILE_RENAME_INFORMATION)FileInformation)->FileName,
                                (USHORT)(bytes / sizeof(WCHAR)));
            MakeNewQQPathDir( FileName,
                              ((PFILE_RENAME_INFORMATION)FileInformation)->FileName,
                              bytes / sizeof(WCHAR),
                              NewQQPathDir );
        }
    }//end if bytes
    }__except(EXCEPTION_EXECUTE_HANDLER )
    {
        KdPrint(("Exception occurred in CheckAndRecordRenameInfor 2 \n"));
    }
 
exit:
    if( hFile )
    {
        ZwClose( hFile );
        hFile = 0;
    }
    if( bResult )
        RecordRequestFileInfor( 6,current_pid,FileName,MAX_UNICODE_STRING_CHARS,4,FALSE );
 
    return bResult;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 5
支持
分享
最新回复 (35)
雪    币: 129
活跃值: (2763)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
求快递公仔 求包邮
2013-9-20 19:48
0
雪    币: 458
活跃值: (306)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
3
学习一下。
2013-9-20 20:02
0
雪    币: 100
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
呵呵,以前写目录保护的驱动也碰到这个问题,就是父目录匹配欠考虑!
2013-9-20 20:10
0
雪    币: 2323
活跃值: (4113)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
5
学习,谢谢分享
2013-9-20 21:00
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
6
前来支持楼主!!!坚持做完不容易
2013-9-20 21:06
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
7
......数字用户公司的悲剧,谁叫它是腾讯呢?
2013-9-20 21:08
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
8
BTW:楼主联系我一下?
2013-9-20 21:09
0
雪    币: 297
活跃值: (265)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
9
好文 Mark
2013-9-20 21:37
0
雪    币: 13246
活跃值: (4296)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
500KX哪里能换公仔?
2013-9-20 21:47
0
雪    币: 89
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
好像是以前,论坛有一个这样的活动。
2013-9-20 21:56
0
雪    币: 9695
活跃值: (2501)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
弱弱的问下,突破了QQ驱动保护的漏洞会怎样?
2013-9-20 22:02
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
mark
2013-9-20 22:06
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
想不到原来漏洞还可以这样
2013-9-20 23:33
0
雪    币: 341
活跃值: (85)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
15
广告位招租
2013-9-20 23:37
0
雪    币: 124
活跃值: (469)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
过保护吗、、、、、、
2013-9-21 01:20
0
雪    币: 27
活跃值: (127)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
17
好文章,阅读学习
2013-9-21 09:24
0
雪    币: 496
活跃值: (286)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
18
好文,不过你提交给厂商了么,为啥厂商没有处理呢?

建议以后先提交厂商,厂商修复再拿出来分享。。。
2013-9-21 10:43
0
雪    币: 245
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
谢谢楼主分享
2013-9-21 12:31
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
20
公仔是小孩子玩具、布娃娃一类?有没有智能点的
这个绕开驱动保护后,可以有哪些利用呢
这么隐蔽的bug怎么就发现的,,,

度娘告诉我:
腾讯安全应急响应中心,Tencent Security Response Center,TSRC.
2013-9-21 13:58
0
雪    币: 680
活跃值: (68)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
21
标记下
2013-9-21 15:05
0
雪    币: 1689
活跃值: (379)
能力值: ( LV15,RANK:440 )
在线值:
发帖
回帖
粉丝
22
大家都来讨论一下最后那个问题吧。
2013-9-22 06:30
0
雪    币: 194
活跃值: (261)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
顶个。。
2013-9-22 11:06
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
24
非常感谢hackerlzc童鞋的漏洞,其他童鞋如有腾讯相关产品的漏洞可通过TSRC平台提交给我们,平台链接:http://security.tencent.com
经确认的漏洞可获得安全币,用安全币可兑换很多礼品,包括mac、单反、ipad等,具体见:http://security.tencent.com/index.php/shop
2013-9-22 12:48
0
雪    币: 541
活跃值: (654)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
25
看的我也想弄个公仔玩玩,楼主,分析漏洞有哪些技巧啊
2013-9-22 14:29
0
游客
登录 | 注册 方可回帖
返回
//