dazzlej
驱动牛犊
驱动牛犊
  • 注册日期2007-04-12
  • 最后登录2010-01-19
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
阅读:1862回复:3

来帮看下这段代码怎么老蓝....

楼主#
更多 发布于:2007-09-23 13:02
HOOK ZwQueryDirectoryFile来隐藏文件的,这些这个是替换的ZwQueryDirectoryFile函数,修改输出结果的部分都已经注释掉了,怎么还老蓝噢....
我是加载驱动后.开着dbgview,然后刷新文件夹来测试,有时候一刷新就蓝了,有时候又不会...大部分时候都蓝......为什么噢?高手们帮看下问题在哪```winxp sp2 + xp ddk,在sp2虚拟机下测试的

NTSTATUS NewZwQueryDirectoryFile(
    IN HANDLE hFile,
    IN HANDLE hEvent OPTIONAL,
    IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL,
    IN PVOID IoApcContext OPTIONAL,
    OUT PIO_STATUS_BLOCK pIoStatusBlock,
    OUT PVOID FileInformationBuffer,
    IN ULONG FileInformationBufferLength,
    IN FILE_INFORMATION_CLASS FileInfoClass,
    IN BOOLEAN bReturnOnlyOneEntry,
    IN PUNICODE_STRING PathMask OPTIONAL,
    IN BOOLEAN bRestartQuery
    )
{
    NTSTATUS ntStatus;

    ntStatus = ((ZWQUERYDIRECTORYFILE)(OldZwQueryDirectoryFile))(
                    hFile,
                    hEvent,
                    IoApcRoutine,
                    IoApcContext,
                    pIoStatusBlock,
                    FileInformationBuffer,
                    FileInformationBufferLength,
                    FileInfoClass,
                    bReturnOnlyOneEntry,
                    PathMask,
                    bRestartQuery);
    if(NT_SUCCESS(ntStatus))
    {
        if(FileInfoClass==3)
        {
            PFILE_BOTH_DIRECTORY_INFORMATION pFileInfo = (PFILE_BOTH_DIRECTORY_INFORMATION)FileInformationBuffer;
            PFILE_BOTH_DIRECTORY_INFORMATION pLastFileInfo = NULL;
            UNICODE_STRING uniFileName;
            ANSI_STRING ansiFileName;
            while(pFileInfo)
            {
                RtlInitUnicodeString(&uniFileName, pFileInfo->FileName);
                RtlUnicodeStringToAnsiString(&ansiFileName, &uniFileName, TRUE);
                if(ansiFileName.Buffer!=NULL)
                {
                    DbgPrint("pFileInfo->FileName = %s(%d)\n", ansiFileName.Buffer, ansiFileName.Length);
                /*    if(0 == memcmp(uniFileName.Buffer, HideFileName.Buffer, HideFileName.Length))
                    {
                        if(pLastFileInfo)
                        {
                            if(pFileInfo->NextEntryOffset)
                                pLastFileInfo->NextEntryOffset += pFileInfo->NextEntryOffset;
                            else
                                pLastFileInfo->NextEntryOffset = 0;
                        }
                        else
                        {
                            if(pFileInfo->NextEntryOffset)
                                (char *)FileInformationBuffer += pFileInfo->NextEntryOffset;
                            else
                                FileInformationBuffer = NULL;
                        }
                    }*/
                }
                pLastFileInfo = pFileInfo;
                if(pFileInfo->NextEntryOffset)
                    pFileInfo += pFileInfo->NextEntryOffset;
                else
                    pFileInfo = NULL;
            }
        }
    }

    return ntStatus;
}
vocanicy
驱动牛犊
驱动牛犊
  • 注册日期2004-08-02
  • 最后登录2010-09-27
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-10-07 21:33
有两个错误:

1、指针偏移错误
pFileInfo += pFileInfo->NextEntryOffset;
应该修改为
(char*)pFileInfo += pFileInfo->NextEntryOffset;
或者
pFileInfo = (PFILE_BOTH_DIRECTORY_INFORMATION)((char*)pFileInfo + pFileInfo->NextEntryOffset);

2、内存泄漏
没有RtlFreeAnsiString(&ansiFileName);
vocanicy
驱动牛犊
驱动牛犊
  • 注册日期2004-08-02
  • 最后登录2010-09-27
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-10-07 21:38
这句也危险
memcmp(uniFileName.Buffer, HideFileName.Buffer, HideFileName.Length)

一般情况下可能不会出问题
如果HideFileName长度远大于uniFileName时,可能会引发内存越界访问

为什么不用RtlCompareUnicodeString?
JaneAntime
驱动牛犊
驱动牛犊
  • 注册日期2006-05-13
  • 最后登录2010-11-01
  • 粉丝0
  • 关注0
  • 积分39分
  • 威望221点
  • 贡献值1点
  • 好评度70点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-10-08 08:59
#pragma text(PAGE,NewZwQueryDirectoryFile)
游客

返回顶部