符号联接的信息

作者:陆麟
转载请征得作者同意.
1999.11.27


嘿嘿,断了几天.这几天可真没白费.挖了一些UNDOCUMENTED API.这回,还想介绍一下被挖的API都怎么干的.:D
今天讲的乃是ZwOpenSymbolicLinkObject.这是个没有公开的函数.他打开一个符号联接,返回个句柄.这个句柄是另外一个UNDOCUMENTED函数ZwQuerySymbolicLinkObject用的.我们现在就来看一下该函数的大致运作过程吧!!

NTSTATUS ZwOpenSymbolicLinkObject(OUT PHANDLE LinkHandle,
      IN ACCESS_MASK DesiredAccess,
      IN POBJECT_ATTRIBUTES ObjectAttributes)
{
   NTSTATUS Status;
   PVOID Object;

   Status = ObReferenceObjectByName(ObjectAttributes->ObjectName,
        ObjectAttributes->Attributes,
        NULL,
        DesiredAccess,
        NULL,
        UserMode,
        NULL,
        &Object);
   if (!NT_SUCCESS(Status))
     {
 return(Status);
     }

   Status = ObCreateHandle(PsGetCurrentProcess(),
      Object,
      DesiredAccess,
      FALSE,
      LinkHandle);
   if (!NT_SUCCESS(Status))
     {
 return(Status);
     }

   return(STATUS_SUCCESS);
}

这里面又用到了对象管理器里的几个UNDOCUMENTED函数.当然,现在没有必要讲.那么有了句柄,肯定要有用才行.接下来就是要讲ZwQuerySymbolicLinkObject的时候了.这个函数可以返回符号联接实际的初始对象的名字.也是QUERYDOSDEVICE的实际实现函数.ZwQuerySymbolicLinkObject的实现乃是:

NTSTATUS ZwQuerySymbolicLinkObject(IN HANDLE LinkHandle,
       IN OUT PUNICODE_STRING LinkTarget,
       OUT PULONG ReturnedLength OPTIONAL)
{
   PSYMLNK_OBJECT SymlinkObject;
   NTSTATUS Status;

   Status = ObReferenceObjectByHandle(LinkHandle,
          SYMBOLIC_LINK_QUERY,
          IoSymbolicLinkType,
          UserMode,
          (PVOID*)&SymlinkObject,
          NULL);
   if (Status != STATUS_SUCCESS)
     {
 return(Status);
     }

   RtlCopyUnicodeString(LinkTarget,SymlinkObject->Target.ObjectName);
   if (ReturnedLength!=NULL)
     {
 *ReturnedLength=SymlinkObject->Target.Length;
     }
   ObDereferenceObject(SymlinkObject);
   return(STATUS_SUCCESS);
}
这样一来,符号联接的实际对象的名字就被拿到手了.
当然,NATIVE API里有他对应的地方:DDD
NTSTATUS NtQuerySymbolicLinkObject(IN HANDLE LinkHandle,
       IN OUT PUNICODE_STRING LinkTarget,
       OUT PULONG ReturnedLength OPTIONAL)
{
   return(ZwQuerySymbolicLinkObject(LinkHandle,LinkTarget,ReturnedLength));
}
这些函数对于需要在KERNEL MODE获取符号联接信息的朋友特别有用.可以脱离WIN32的参与自己完成获取目标对象的名字了...
啊,今天心情特别好.贴了这么多.以后不知道会不会有这样的心情来写. :DDD