首页
社区
课程
招聘
[求助]一个GetFullName函数在VISTA下出错!大家帮看看
发表于: 2009-3-27 11:58 5406

[求助]一个GetFullName函数在VISTA下出错!大家帮看看

2009-3-27 11:58
5406
NTSTATUS   GetFullName(HANDLE     KeyHandle,char   *fullname)  //根据句柄去文件路径
{
        NTSTATUS   ns;
        PVOID   pKey=NULL,pFile=NULL;
        UNICODE_STRING                   fullUniName;
        ANSI_STRING                           akeyname;   
        ULONG   actualLen;   
        UNICODE_STRING   dosName;

        if (KeyHandle==0) return   STATUS_SUCCESS;
       
        fullUniName.Buffer=NULL;
        fullUniName.Length=0;   
        fullname[0]=0x00;   
        ns=ObReferenceObjectByHandle(KeyHandle,0,NULL,KernelMode,&pKey,NULL);
        if(!NT_SUCCESS(ns))   return ns;
        fullUniName.Buffer = ExAllocatePool(   PagedPool,   MAXPATHLEN*2);//1024*2
        fullUniName.MaximumLength =MAXPATHLEN*2;
        __try
        {
                pFile=(PVOID)*(ULONG   *)((char   *)pKey+20);
                pFile=(PVOID)*(ULONG   *)((char   *)pFile);
                pFile=(PVOID)*(ULONG   *)((char   *)pFile+36);
          
                ObReferenceObjectByPointer(pFile,   0,   NULL,   KernelMode);
                //DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,"%08x",RealIoVolumeDeviceToDosName);

                if ((RealIoVolumeDeviceToDosName!=0)&&(RealIoVolumeDeviceToDosName!=-1))
                {
                  ((TypeIoVolumeDeviceToDosName)RealIoVolumeDeviceToDosName)(((PFILE_OBJECT)pFile)->DeviceObject,&dosName);
                }
                else
                {
                RtlVolumeDeviceToDosName(((PFILE_OBJECT)pFile)->DeviceObject,&dosName);
                }
                RtlCopyUnicodeString(&fullUniName,   &dosName);
                RtlAppendUnicodeStringToString(&fullUniName,&((PFILE_OBJECT)pFile)->FileName);
                ObDereferenceObject(pFile);
                ObDereferenceObject(pKey);
                RtlUnicodeStringToAnsiString(&akeyname,&fullUniName,TRUE);
                if(akeyname.Length<MAXPATHLEN)     
                {   
                        memcpy(fullname,akeyname.Buffer,akeyname.Length);   
                        fullname[akeyname.Length]=0x00;   
                }   
                else   
                {   
                        memcpy(fullname,akeyname.Buffer,MAXPATHLEN);   
                        fullname[MAXPATHLEN-1]=0x00;   
                }
               
                RtlFreeAnsiString(&akeyname);   
                ExFreePool(dosName.Buffer);   
                ExFreePool(fullUniName.Buffer);  
                return   STATUS_SUCCESS;
        }
        __except(1)   
        {   
                if(fullUniName.Buffer) ExFreePool(fullUniName.Buffer);   
                if(pKey)   ObDereferenceObject(pKey   );   
                return   STATUS_SUCCESS;
        }
}

上面的函数在XP下没有问题 可惜在 其他操作系统下会蓝

我想因为是这段代码出了问题

                pFile=(PVOID)*(ULONG   *)((char   *)pKey+20);
                pFile=(PVOID)*(ULONG   *)((char   *)pFile);
                pFile=(PVOID)*(ULONG   *)((char   *)pFile+36);
不同系统结构偏移不同
2000 2003 以及 Vista 下 他们应该怎么写呢?

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
2
ZwQueryObject
ObjectNameInformation
2009-3-27 12:06
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
顺便问下MJ,ZwQueryObject查询名称信息时有时候会挂起的情况怎么解决?(ObQueryNameString的问题?)
2009-3-27 12:13
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
4
query key没问题
query file前要判断设备类型
2009-3-27 12:51
0
雪    币: 193
活跃值: (26)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
5
NTSTATUS   GetFullNamexxxx(HANDLE     KeyHandle,char   *fullname)  //取子进程文件名
{
PVOID   pKey=NULL;
POBJECT_NAME_INFORMATION ObjectNameInfo;
ULONG              retSize;
NTSTATUS   ns;

ns=ObReferenceObjectByHandle(KeyHandle,0,NULL,KernelMode,&pKey,NULL);
if (!NT_SUCCESS(ns)) return ns;

ObjectNameInfo = ExAllocatePool(NonPagedPool, 1024);
if (ObjectNameInfo==NULL) return STATUS_ACCESS_DENIED;

ns=ObQueryNameString(pKey,ObjectNameInfo,1024, &retSize);
if (!NT_SUCCESS(ns))
{
  ExFreePool(ObjectNameInfo);
  return ns;
}
ConvertFileNameWCHARToCHAR(ObjectNameInfo->Name.Buffer,fullname);
DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,"fullname:%s",fullname);
ExFreePool(ObjectNameInfo);
return STATUS_SUCCESS;
}

可惜还是没盘符的
2009-3-27 13:30
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
6
你是取键名啊拿来什么盘符
2009-3-27 13:38
0
雪    币: 193
活跃值: (26)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
7
我想通过文件句柄来获取文件名!
2009-3-27 13:54
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
8
那你写清楚是FileHandle啊!
还什么KeyHandle , pKey 啊是什么鬼东西啊!
2009-3-27 14:13
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
9
盘符去device map找!
2009-3-27 14:14
0
雪    币: 193
活跃值: (26)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
10
NTSTATUS   GetFullNamexxxx(HANDLE  KeyHandle,char   *fullname)  //取子进程文件名 Vista专用
{
PFILE_OBJECT   pKey=NULL;
ULONG              retSize;
NTSTATUS   ns;
UNICODE_STRING   dosName;
char aPathName[MAXPATHLEN];
if (KeyHandle==0) return STATUS_ACCESS_DENIED;
ns=ObReferenceObjectByHandle(KeyHandle,0,NULL,KernelMode,&pKey,NULL);
if (!NT_SUCCESS(ns)) return ns;

ns=IoVolumeDeviceToDosName(pKey->DeviceObject,&dosName);
if (!NT_SUCCESS(ns)) return ns;
ConvertFileNameWCHARToCHAR(dosName.Buffer,fullname);
ConvertFileNameWCHARToCHAR(pKey->FileName.Buffer,aPathName);
strcat(fullname,aPathName);
DbgPrintEx(DPFLTR_IHVBUS_ID ,DPFLTR_ERROR_LEVEL,"fullname:%s",fullname);
return STATUS_SUCCESS;
}

呵呵终于写好了,  感谢王小姐
2009-3-27 15:00
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
11
PL:qihoocom是男的。
2009-4-21 15:09
0
雪    币: 225
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
IoVolumeDeviceToDosName完要ExFreePool 不然会出问题的
换成RtlVolumeDeviceToDosName

IoVolumeDeviceToDosName allocates the Unicode string buffer for the MS-DOS path from the memory pool. After the buffer is no longer required, a caller of this routine should use ExFreePool to free it.
2009-4-21 15:24
0
游客
登录 | 注册 方可回帖
返回
//