首页
社区
课程
招聘
[求助]Hook ZwSetInformationFile 获得文件名
发表于: 2008-7-18 20:27 6730

[求助]Hook ZwSetInformationFile 获得文件名

2008-7-18 20:27
6730
我用修改SSDT的方法HOOK了 ZwSetInformationFile  函数,想达到防删除的目的,效果达到了,代码也很简单,可是有一问题搞不清楚

rt = ObReferenceObjectByHandle(FileHandle, GENERIC_READ, *IoFileObjectType, KernelMode, (PVOID*)&pFileObject, 0);

pFullPath=(PUNICODE_STRING)ExAllocatePool(NonPagedPool,MaxBuf);
                RtlZeroMemory(pFullPath,MaxBuf);
                pFullPath->MaximumLength = MaxBuf ;
               
//得到文件的全路径
rt = ObQueryNameString(pFileObject,pFullPath,MaxBuf,&ActualLength);

我用这种方法完全可以获得文件名,可是文件名是这种形式的:\Device\HarddiskVolume1\abcd.txt

问下大哥们有方法获得类似\??\c:\abcd.txt的文件名吗?而且win2000下也能用的

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

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
// 返回类似于C:\WINDOWS\Explorer.exe (ANSI)
        PVOID SectionObject;
        PFILE_OBJECT FileObject;
        UNICODE_STRING FilePath;
        UNICODE_STRING DosName;
        NTSTATUS Status;
        STRING AnsiString;

        SectionObject = NULL;
        FileObject = NULL;
        FilePath.Buffer = NULL;
        FilePath.Length = 0;
        *ProcessImageName = 0;
        Status = ObReferenceObjectByHandle(SectionHandle, 0, NULL, KernelMode, &SectionObject, NULL);

        if ( NT_SUCCESS(Status) )
        {
                FilePath.Buffer = ExAllocatePool(PagedPool,0x200);
                FilePath.MaximumLength = 0x200;
                FileObject = (PFILE_OBJECT)(*((ULONG *)SectionObject + 5)); // PSEGMENT
                FileObject = *(PFILE_OBJECT *)FileObject; // CONTROL_AREA
                FileObject = *(PFILE_OBJECT *)((ULONG)FileObject + 36); // FILE_OBJECT
                ObReferenceObjectByPointer((PVOID)FileObject, 0, NULL, KernelMode);
                RtlVolumeDeviceToDosName(FileObject-> DeviceObject, &DosName);
                RtlCopyUnicodeString(&FilePath, &DosName);
                RtlAppendUnicodeStringToString(&FilePath, &FileObject->FileName);
                ObDereferenceObject(FileObject);
                ObDereferenceObject(SectionObject);
                RtlUnicodeStringToAnsiString(&AnsiString, &FilePath, TRUE);
                if ( AnsiString.Length >= 256 )
                {
                        memcpy(ProcessImageName, AnsiString.Buffer, 0x100u);
                        *(ProcessImageName + 255) = 0;
                }
                else
                {
                        memcpy(ProcessImageName, AnsiString.Buffer, AnsiString.Length);
                        ProcessImageName[AnsiString.Length] = 0;
                }

.............(ProcessImageName 就是了)
2008-8-13 22:05
0
雪    币: 321
活跃值: (275)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
3
RtlVolumeDeviceToDosName
2008-8-13 22:23
0
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
2楼那不是炉子写的吗?
2008-8-14 10:43
0
游客
登录 | 注册 方可回帖
返回