首页
社区
课程
招聘
6
[原创]内核中判断文件有没有存在
发表于: 2013-3-20 16:38 7034

[原创]内核中判断文件有没有存在

2013-3-20 16:38
7034

在内核中如何判断应层程路径的文件是否存在?

在网络上的google一遍,没有找到现成的资料,现在整理出来分享给大家

应用层传路径给内核驱动时所传的路径为"C:\123\111.exe",在内核中是不能直接使用该路径,需要转成内核的文件路径

再进行文件判断(ZwQueryFullAttributesFile)

以下是实现代码

/************************************************************************
@method:CheckFileExists
判断应用层文件有没有存在
@param:        PUNICODE_STRING FileName

@return:存在TRUE
                不存在FALSE
@date:        [2012-07-11 zhansq]
************************************************************************/
BOOLEAN CheckFileExists(IN PWCHAR FileName)
{
        BOOLEAN bret = FALSE;
        NTSTATUS status = STATUS_SUCCESS;
        OBJECT_ATTRIBUTES attributes;
        UNICODE_STRING usSymfile;
        UNICODE_STRING ustmpfile;
        FILE_NETWORK_OPEN_INFORMATION  FileInformation;
        WCHAR pathhead[10] = L"\\??\\C:";

        //传入的路径如:C:\111\123.txt
        if (FileName == NULL || wcslen(FileName) < 4) return FALSE;

        pathhead[4] = FileName[0];
        RtlInitUnicodeString(&usSymfile,pathhead);

        try
        {
                ustmpfile.Length = 0;
                ustmpfile.MaximumLength = 600;
                ustmpfile.Buffer = ExAllocatePoolWithTag( NonPagedPool,600,'tSpR');;
                if (ustmpfile.Buffer == NULL)
                {
                        leave;
                }
                RtlZeroMemory(ustmpfile.Buffer,ustmpfile.MaximumLength);

                if (QuerySymbolicLink(&usSymfile,&ustmpfile) == FALSE)
                {
                        leave;
                }

                status = RtlAppendUnicodeToString(&ustmpfile,&FileName[2]);
                if (!NT_SUCCESS(status))
                {
                        leave;
                }

                InitializeObjectAttributes( &attributes,&ustmpfile,OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,NULL,NULL );

                status = ZwQueryFullAttributesFile(&attributes,&FileInformation);
                if (NT_SUCCESS(status))
                {
                        //文件存在
                        bret = TRUE;
                }
        }
        finally
        {
                if (ustmpfile.Buffer != NULL) ExFreePoolWithTag(ustmpfile.Buffer,'tSpR');;
                return bret;
        }
}


[注意]看雪招聘,专注安全领域的专业人才平台!

上传的附件:
收藏
免费 6
支持
分享
赞赏记录
参与人
雪币
留言
时间
伟叔叔
为你点赞~
2024-5-31 07:21
心游尘世外
为你点赞~
2024-5-31 04:17
QinBeast
为你点赞~
2024-5-31 04:07
飘零丶
为你点赞~
2024-4-3 00:07
shinratensei
为你点赞~
2024-2-5 00:29
PLEBFE
为你点赞~
2023-3-7 00:35
最新回复 (4)
雪    币: 86
活跃值: (60)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
/************************************************************************
@method:QuerySymbolicLink
将名称转为符号连接 如 C:->/Device/HarddiskVolume1
@param:        PUNICODE_STRING SymName
PUNICODE_STRING VolumeName
@return:成功TRUE
失败FALSE
@date:        [2012-07-11 zhansq]
************************************************************************/
BOOLEAN QuerySymbolicLink(IN PUNICODE_STRING SymName,OUT PUNICODE_STRING VolumeName)
{
        NTSTATUS st;
        HANDLE LinkHandle = NULL;
        OBJECT_ATTRIBUTES object_attributes;
        ULONG rt;
        BOOLEAN bret = FALSE;
        try
        {
                InitializeObjectAttributes(&object_attributes,SymName,OBJ_KERNEL_HANDLE,NULL,NULL);

                st = ZwOpenSymbolicLinkObject(&LinkHandle,GENERIC_READ,&object_attributes);
                if (!NT_SUCCESS(st))
                {
                        DbgPrint("ZwOpenSymbolicLinkObject Error!\n");
                        leave;
                }

                st = ZwQuerySymbolicLinkObject(LinkHandle,VolumeName,&rt);
                if (!NT_SUCCESS(st))
                {
                        if (st == STATUS_BUFFER_TOO_SMALL)
                                DbgPrint("ZwQuerySymbolicLinkObject STATUS_BUFFER_TOO_SMALL!");
                        else
                                DbgPrint("ZwQuerySymbolicLinkObject Error!\n");
                        leave;
                }
                ZwClose(LinkHandle);
                LinkHandle = NULL;
                bret = TRUE;
        }
        finally
        {
                if (LinkHandle != NULL) ZwClose(LinkHandle);
                return bret;
        }
}
2013-3-20 17:44
0
雪    币: 295
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
ZwQueryFullAttributesFile返回的status很多,你至少也得判断下 是不是FILE_NOT_FOUND之类的吧。。。
2013-3-20 17:59
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
4
ZwCreateFile不可以么?
2013-3-20 18:28
0
雪    币: 86
活跃值: (60)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
ZwQueryFullAttributesFile返回的status是有很多,没有一个一个去试过,
但是经过NT_SUCCESS(status)简单的判断在使用过程中没有发现判断错的。

至于ZwCreateFile这个函数,个人认为ZwQueryFullAttributesFile这个更好效率更高
2013-3-21 08:42
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册