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解题方法汇总!