深入探索LsaManageSidNameMapping:为SID添加名称映射的技术实践

本文详细分析了Windows系统中未公开的LsaLookupManageSidNameMapping API及其相关函数LsaManageSidNameMapping,探讨了通过LSASS为SID添加名称映射的技术方法、调用限制,并提供了实用的.NET工具实现方案。

使用LsaManageSidNameMapping为SID添加名称

在研究服务SID如何映射回名称时,我发现了API LsaLookupManageSidNameMapping。毫不意外,这个API在MSDN或Windows SDK中都没有正式文档。不过,LsaManageSidNameMapping 倒是有文档(大部分)。经过一番挖掘,发现它们最终都指向LSASS中的同一个RPC函数,只是名称不同:

  • LsaLookupManageSidNameMapping → lsass!LsaLookuprManageCache
  • LsaManageSidNameMapping → lsasrv!LsarManageSidNameMapping

它们最终都会调用 lsasrv!LsarManageSidNameMapping。我不清楚为什么会有两个版本,以及为什么一个有文档而另一个没有。耸肩。当然,尽管MSDN上有这个函数的条目,但似乎在Ntsecapi.h头文件中并没有实际文档。再次耸肩。我找到的最好的文档是这个头文件。

这让我思考是否可以通过LSASS映射所有AppContainer命名功能,让普通应用程序解析它们,而不是我自己处理。这比修改SAM或类似的技巧要容易。遗憾的是,虽然可以通过这个API添加一些SID到名称的映射,但对于功能SID却不行,因为有如下调用限制:

  • 调用者需要SeTcbPrivilege(这是LSA API的基本要求)。
  • 要映射的SID必须在NT安全机构(5)中,且域的第一个RID必须在80到111之间(含)。
  • 必须首先注册包含该SID的域SID名称。

基本上,第二条限制阻止了我们为功能添加子域SID,因为它们使用包安全机构(15),而且我们不能直接添加SID到名称映射,因为需要先用API注册域,仅域存在是不够的。也许有其他简单的方法,但这不是。

相反,我整理了一个.NET工具来添加或删除你自己的SID到名称映射。它已经在github上。映射是临时的,所以如果你搞砸了什么,重启应该能修复。:-)

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计