模拟后 CreateMutex 失败

2024-05-09

这是我尝试模拟用户然后创建互斥体的代码。未创建互斥体。我收到 ERROR_ACCESS_DENIED 错误。

void Impersonate()
{
    DWORD logonType = LOGON32_LOGON_INTERACTIVE;
    DWORD logonProvider = LOGON32_PROVIDER_DEFAULT;
    HANDLE userToken;
    HANDLE hMutex;
    DWORD err;

    LPSTR user = "zoom"; // the user I created myself on my machine. 
    // It has Administrator privileges, and my account, 
    // from which I start the app, is Admin too
    LPSTR password = "zoom";
    LPSTR domain = ".";
    hMutex = NULL;

    LogonUserA(user, domain, password, logonType, logonProvider,&userToken);

    // just to make sure that mutexes are created fine before impersonation
    hMutex = CreateMutexA( NULL, FALSE, "mutex_good" );  

    ImpersonateLoggedOnUser(userToken);

    hMutex = CreateMutexA( NULL, FALSE, "mutex_797" ); // I can set any 
                                                       // random name, no difference
    if( hMutex == NULL )
    {
        err = GetLastError();
        // here err is ERROR_ACCESS_DENIED 
    }

    CloseHandle(userToken);
}

我发现了几个类似的主题,但所有这些主题都在讨论从两个不同的用户上下文创建同名互斥体,即在模拟之前已经创建了互斥体“MUTEX_1”,并尝试使用相同的名称但从模拟的对象调用 CreateMutex用户由于缺乏权限而失败。

这里的情况并非如此,因为我非常确定在此代码之前没有创建同名的互斥体(或根本没有任何互斥体)。

我想我应该将一些非空值传递给 CreateMutex,但到底是什么?

我不太擅长 Windows 安全性。我理解将 NULL 作为 CreateMutex 的第一个参数传递意味着将使用“默认”安全属性。在这种情况下,它将是与线程关联的安全参数,即与模拟用户关联的安全参数。

我的假设正确吗?


首先你需要了解NT命名空间 https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#nt_namespaces并使用WinObj https://technet.microsoft.com/en-us/sysinternals/winobj.aspx tool.

这就像内存中的小型文件系统,其中包含文件夹和不同的“文件”(此处“文件”下表示不同的对象类型 -Event, Mutant(互斥体),Section, Device,...)。每次创建命名对象时 - 它都会放置到某个文件夹中NT命名空间 https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#nt_namespaces。这里的文件夹(如 NTFS 中的文件夹)具有安全描述符。因此,并非每个人都可以在任何文件夹下创建对象。

解释一下你在文件系统语言上所做的事情(也许会更清楚):

i (John)尝试在下创建文件“mutex_good”%USERPROFILE%\Documents这没关系。因为这是我的个人文件夹,我对其有写权限。

然后我登录(模拟)为zoom并尝试在下再次创建文件“mutex_797”%USERPROFILE%\Documents (%USERPROFILE%在这两种情况下都扩展到相同的路径,例如c:\Users\John冒充不影响此)

and zoom创建文件失败。为什么 ?只是他没有权利这样做。仅有的John, Administartors, SYSTEM有写权限c:\Users\John但不是zoom.

现在让我们回到NT命名空间 https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#nt_namespaces。当我们打电话时CreateMutexA( NULL, FALSE, "mutex_797" );哪里"mutex_797"将被放置?

如果你不appcontainer并且不在系统中运行session 0- 你在某个用户中运行session <N>你的命名对象将被放置在\Sessions\<N>\BaseNamedObjects目录,其中 N=1,2..

so call CreateMutexA( NULL, FALSE, "mutex_797" );

尝试创建互斥体\Sessions\<N>\BaseNamedObjects\mutex_797

然而在\Sessions\<N>\BaseNamedObjects存在下一个 SymbolicLinks(这就像在 NTFS 文件系统中):

Global -> \BaseNamedObjects
Local  -> \Sessions\<N>\BaseNamedObjects
Session -> \Sessions\BNOLINKS

所以说如果你打电话CreateMutexA( NULL, FALSE, "Global\\mutex_797" );

对象管理器尝试将互斥体放在\BaseNamedObjects\mutex_797

有关此内容的更多信息,请阅读内核对象命名空间 https://msdn.microsoft.com/en-us/library/windows/desktop/aa382954(v=vs.85).aspx

当然我们必须理解AccessCheck 的工作原理 https://msdn.microsoft.com/en-us/library/windows/desktop/aa446683(v=vs.85).aspx

对于目录对象定义了下一个访问权限:

//
// Object Manager Directory Specific Access Rights.
//

#define DIRECTORY_QUERY                 (0x0001)
#define DIRECTORY_TRAVERSE              (0x0002)
#define DIRECTORY_CREATE_OBJECT         (0x0004)
#define DIRECTORY_CREATE_SUBDIRECTORY   (0x0008)

也可以在以下位置阅读更多相关内容DirectoryObject DesiredAccess 标志 https://msdn.microsoft.com/en-us/library/windows/hardware/ff566492(v=vs.85).aspx

we need DIRECTORY_CREATE_OBJECT使用权 (对目录对象的名称创建访问)用于在目录中创建互斥体(或事件或任何对象)

现在了解为什么可以在中创建互斥体\Sessions\<N>\BaseNamedObjects but zoom不能 - 需要寻找Security Descriptor对于这个文件夹。我转储它:

T FL AcessMsK Sid
0 00 000F000F S-1-5-90-0-1 DWM-1
0 00 000F000F S-1-5-18 SYSTEM
0 0B 10000000 S-1-5-18 SYSTEM
0 0B 10000000 S-1-3-0 CREATOR OWNER
0 00 000F000F S-1-5-21-4026734978-3280735129-2412320105-1001 John
0 0B 10000000 S-1-5-5-0-294807 LogonSessionId_0_294807
0 00 0002000F S-1-5-5-0-294807 LogonSessionId_0_294807
0 00 0002000F S-1-5-32-544 Administrators
0 02 00000003 S-1-1-0 Everyone
0 00 00000002 S-1-5-12 RESTRICTED
17 00 00000001 S-1-16-4096 Low Mandatory Level

那么谁有DIRECTORY_CREATE_OBJECT(4)这里?DWM-1, SYSTEM, Administrators,当前登录会话用户(LogonSessionId_0_294807), 当前用户 (John) - 和所有。zoom没有此访问权限。

例如Everyone有 (3) -DIRECTORY_QUERY|DIRECTORY_TRAVERSE - Name lookup and Query但不是Name creation

您可以问在这种情况下我可以在模拟后在哪里创建互斥体?需要使用\BaseNamedObjects ( 全局命名空间 )OR \BaseNamedObjects\Restricted目录 - 我测试它的安全描述符和结果:

for \BaseNamedObjects

T FL AcessMsK Sid
0 00 0002000F S-1-1-0 Everyone
0 00 00000002 S-1-5-12 RESTRICTED
0 00 000F000F S-1-5-90-0-0 
0 00 000F000F S-1-5-18 SYSTEM
17 00 00000001 S-1-16-4096 Low Mandatory Level

for \BaseNamedObjects\Restricted

T FL AcessMsK Sid
0 00 0002000F S-1-1-0 Everyone
0 00 0002000F S-1-5-12 RESTRICTED
0 00 000F000F S-1-5-90-0-0 
0 00 000F000F S-1-5-18 SYSTEM
17 00 00000001 S-1-16-4096 Low Mandatory Level

那么你如何查看Everyone这里有 2000F - 所有需要的访问。希望zoom是的成员Everyone?下一个代码我肯定会起作用

CreateMutexA(0, 0, "Global\\mutex_797");

for \BaseNamedObjects (全局命名空间) 存在一个例外:

在全局命名空间中创建文件映射对象,通过 使用 CreateFileMapping,从会话零以外的会话是 特权操作。因此,运行在 任意远程桌面会话主机(RD 会话主机)服务器会话 必须启用 SeCreateGlobalPrivilege 才能创建 全局命名空间中的文件映射对象成功。这 权限检查仅限于文件映射对象的创建, 并且不适用于打开现有的。例如,如果一个服务 或者系统创建一个文件映射对象,任何运行在 任何会话都可以访问该文件映射对象,前提是用户 拥有必要的访问权限。

但对于互斥锁或事件 - 不需要Se创建全局权限已启用


你也可以说,但是zoom是管理员帐户并且Administrator可使用\Sessions\<N>\BaseNamedObjects- 那么为什么这不起作用呢?因为与LOGON32_LOGON_INTERACTIVE and UAC系统分配给zoom过滤后的令牌。Administrator Group (S-1-5-32-544) 存在于令牌中but with SE_GROUP_USE_FOR_DENY_ONLY https://msdn.microsoft.com/en-us/library/windows/desktop/aa379596(v=vs.85).aspx仅属性 - 因此它会忽略 SID 允许访问的 ACE。 和zoom有另一种LogonSessionId_0_XXXSID - 作为结果和ERROR_ACCESS_DENIED

正如 @Harry Johnston 所指出的 - 如果我们使用LOGON32_LOGON_BATCH反而LOGON32_LOGON_INTERACTIVE- 我们得到了提升的令牌 - 这里Administrator团体将与SE_GROUP_ENABLED https://msdn.microsoft.com/en-us/library/windows/desktop/aa379596(v=vs.85).aspx属性 - 启用对允许访问的 ACE 的访问检查

或者我如何提供 - 使用Global\名称前的前缀 - 用于放置对象\BaseNamedObjects where Everyone拥有完全访问权限

我理解将 NULL 作为第一个参数传递CreateMutex方法 将使用“默认”安全属性。在这种情况下,它将 是与线程关联的安全参数,即 冒充的用户。

第一个参数 - 指向的指针SECURITY_ATTRIBUTES让您覆盖新对象的默认安全描述符。这是控制谁可以访问它。但这不会让您或多或少地访问您尝试放置对象的目录 - 您必须拥有DIRECTORY_CREATE_OBJECT已授予访问权限,我们无法通过以下方式影响此行为:SECURITY_ATTRIBUTES- 这影响到新对象但不在现有目录上

and finally some visualization of NT Namespace https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#nt_namespaces enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模拟后 CreateMutex 失败 的相关文章

  • C语言实现延时函数

    我想使用空循环实现延迟函数 但是完成一次循环所需的时间取决于编译器和机器 我希望我的程序自行确定时间并将程序延迟指定的时间 谁能给我任何想法如何做到这一点 注意 有一个名为delay 的函数可以将系统暂停指定的毫秒 是否可以在不使用此功能的
  • 如何用另一个静态变量初始化一个静态变量?

    静态1 hpp include
  • 如何获取属于某个进程的打开句柄的计数?

    您可以使用该程序流程浏览器 http technet microsoft com en us sysinternals bb896653查看正在运行的应用程序有多少个句柄 有没有办法用Delphi代码来获取这个数字 我有兴趣跟踪应用程序本身
  • 更改图像颜色与透明背景

    我需要使用 c System Drawings 将透明背景上带有绿色圆圈的图像加载到位图图像中 这是最简单的部分 但是 我需要在将其添加到更大的图像之前更改圆圈的颜色 而不影响周围的透明度 就我而言 我需要将圆圈颜色更改为黄色并将其添加为太
  • 错误:“运行所选代码生成器时出错:包恢复失败”

    我正在尝试将控制器添加到 ASP NET Core 项目中的解决方案中 当我尝试这样做时 我收到此错误 我收到相同的消息 为控制器添加最小依赖项和完整依赖项 我也有这个问题 使用实体框架添加控制器 gt 带有操作的 API 控制器 将给出
  • .NET 中的 Class.forName() 等效项?

    动态获取对象类型然后创建它的新实例的 C 方法是什么 例如 如何在 C 中实现以下 Java 代码的结果 MyClass x MyClass Class forName classes MyChildClass newInstance Lo
  • 为什么 fgets 接受 int 而不是 size_t?

    功能如strcpy malloc strlen 和其他各种接受他们的参数或返回值作为size t代替int or an unsigned int出于显而易见的原因 一些文件功能 例如fread and fwrite use size t以及
  • 值类型如何实现引用类型

    我遇到了一个值类型正在实现 ref 的场景 类型 只是想知道这怎么可能 幕后发生了什么 结构体是值类型 接口是引用 类型但结构可以实现接口而不会出现任何错误 有什么想法吗 提前致谢 实际上 它同时以两种不同的方式进行 首先 任何值类型都可以
  • 如何在Unity Inspector中创建多维数组?

    如何在 Unity Inspector 中创建枚举多维数组并使其可序列化 以便我可以从不同的脚本调用它 public enum colors red blue green yellow cyan white purple public in
  • 用 OpenCL C 编写快速线性系统求解器

    我正在编写一个 OpenCL 内核 它将涉及求解线性系统 目前我的内核太慢了 提高线性系统部分的性能似乎是一个不错的起点 我还应该注意 我并没有尝试使我的线性求解器并行 我正在研究的问题在宏观层面上已经是令人尴尬的并行 以下是我编写的 C
  • 可以通过模板间接访问基类中的私有类型

    我试图在编译时根据类型是否在给定范围内公开可用来选择要使用的类型 最好直接看代码 include
  • 是否自初始化 'A a = a;'允许吗?

    此代码在运行时在复制构造函数中失败 但编译器 MSVS2008 没有发出警告 您能解释一下 最好引用标准 这段代码是否非法或什么 我理解 A a a 永远不应该写在第一位 但我正在寻找理论背景 class A public A p new
  • FFplay成功移入我的Winform中,如何设置它无边框?

    用这个代码 在 C 应用程序中显示 tcp 视频流 来自 FFPLAY FFMPEG https stackoverflow com questions 14201894 show a tcp video stream from ffpla
  • “DeploymentItem”属性是什么意思?

    假设我们有一个简短的程序 namespace ConsoleTryIt static class Program static void Main string args var sum Add 1 2 private static int
  • WCF 服务中的缓冲区大小

    我们有一个 WCF 服务 它执行某些存储过程并将结果返回给 silverlight 客户端 某些存储过程最多返回 80K 行 下面给出的是 web config 中服务的设置
  • 我的代码哪里有泄漏?

    下面是我的代码 它打开一个 XML 文件 old xml 过滤无效字符并写入另一个 XML 文件 abc xml 最后 我将再次加载 XML abc xml 当执行以下行时 出现异常 表示 xml 文件被另一个进程使用 xDoc Load
  • NSubstitute - 测试特定的 linq 表达式

    我在当前正在开发的 MVC 3 应用程序中使用存储库模式 我的存储库界面如下所示 public interface IRepository
  • 为什么我无法通过 lambda 捕获“this”指针?

    考虑以下代码 class A public void foo auto functor this A a this auto functor a The compiler won t accept this instead of a a g
  • C++ 在预处理器 #if 中对 sizeof() 比较抛出编译错误

    我有这个 它不会从 Visual Studio 编译错误 致命错误 C1017 无效的整数常量表达式 我该怎么做 template
  • 为什么 INT64_MIN 的定义不同?为什么他们的行为不同?

    The stdint h我公司的标题是 define INT64 MIN 9223372036854775808LL 但在我项目的一些代码中 一位程序员写道 undef INT64 MIN define INT64 MIN 92233720

随机推荐

  • xdotool 类型需要很长时间并导致整个桌面冻结

    我一直在使用xdotool type过去只能在快捷方式上输入耸肩xdotool type 这可行 但总是需要相当长的时间 并导致整个桌面冻结 完全冻结 而不仅仅是输入 几秒钟 不过并没有太打扰我 现在我需要一种方法来从文件中读取内容 对其进
  • Android ACTION_DATE_CHANGED 广播

    我有 Nexus S 当我在手机上手动更改日期时 ACTION DATE CHANGED 并不总是被广播 如果我将日期从 2014 年 2 月 13 日更改为 2014 年 2 月 14 日 我还没有获得 ACTION DATE CHANG
  • 禁用页面的浏览器打印选项(页眉、页脚、边距)?

    我在 SO 和其他几个网站上看到过以几种不同的方式提出这个问题 但大多数都太具体或过时了 我希望有人能在这里提供明确的答案 而不是迎合猜测 当有人在浏览器中打印时 有没有办法使用 CSS 或 javascript 更改默认打印机设置 当然
  • 熊猫滚动意味着更新

    考虑数据框 df pd DataFrame a None None None None 1 2 1 0 1 b 5 4 6 7 None None None None None gt gt a b 0 NaN 5 0 1 NaN 4 0 2
  • glBlitFramebuffer 渲染缓冲区和渲染全屏纹理哪个更快?

    哪个更快更高效 使用 OpenGL 纹理作为 CUDA 表面并在四边形上渲染 新样式 使用渲染缓冲区作为 CUDA 表面并使用 glBlitFramebuffer 进行渲染 None
  • 设置字节中的特定位

    我正在尝试设置 Java 字节变量中的位 它确实提供了适当的方法 例如 setBit i 有谁知道我如何才能实现这一点 我可以按位迭代给定的字节 if my byte 1 lt lt i 0 但是我不能将此位置设置为 1 或 0 可以吗 使
  • 在composer.json中运行命令行命令

    我正在尝试编写一个composer json 文件 该文件将连续运行多个命令行命令 作为一个示例 如下所示 scripts test createDir createDir mkdir testing 当我在终端中运行作曲家文件时使用com
  • 使用 javascript 选择框架上下文

    有没有一种方法可以使用 Javascript 以编程方式选择框架上下文 假设当前网页中有两个不同的框架 我需要将 hello 附加到第二个框架 问题是第二个框架的域与当前网页不同 使用 Chrome 开发者工具 我可以简单地选择第二个框架上
  • 类似的 PHP 表单代码:如果 $_REQUEST 为空,第一个抛出错误,第二个则不抛出错误

    我是 PHP 新手 所以这可能是一个简单的答案 希望我能正确地按照 SO 标准格式化它 对于该网站来说仍然是新的 我正在通过 SitePoint 编写两组非常相似的代码 提交表单数据并使用 htmlspecialchars 来阻止 XSS
  • pytest 在导入时找不到模块,但代码运行良好

    目标是为使用 Cython 的 Python3 项目使用 pytest 单元测试框架 这不是即插即用的事情 因为默认情况下 pytest 无法导入 Cython 模块 也就是说 从 Cython pyx 模块导入时出现以下错误 在我的例子中
  • C++/CLI 在运行时显式加载托管 DLL(相当于非托管的 LoadLibrary)

    问题一 有没有办法在 C CLI 中在运行时而不是在编译时显式加载库 目前我在编译时使用 NET 添加引用 我想显式加载托管 dll NET 中是否有 LoadLibrary 的等效项 Update 感谢兰多夫 Assembly LoadF
  • Angularjs 中字母数字的正则表达式

    我想要 angularJS 中字母数字字符的正则表达式 我尝试了一些正则表达式 例如 d a z 但它们允许我仅输入数字和字母 但我想要一个不允许我输入它们的正则表达式 例子 121232 abchfe abd 42232 5 是一些例子i
  • perl imap 将邮件移至垃圾箱 (Mail::IMAPClient)

    我需要将所有未见的邮件移至垃圾箱 然后从收件箱中删除 my inbox imap gt select Inbox my mails imap gt unseen foreach my msgid mails imap gt set flag
  • Spring 将 URL 映射到控制器和视图

    我在 Netbeans 8 0 2 中有标准的 Spring 4 x 文件 我添加了一个控制器 RegisterController java in the controllers 包裹 我还添加了一个模型 一个User 以及有关用户的一些
  • Django:使用 python-magic 在模型中进行文件字段验证

    我有一个包含文件字段的模型 我想将其限制为 pdf 文件 我在模型中编写了干净的方法 因为我还想检查管理和 shell 级别模型的创建 但它不适用于模型清理方法 然而 形式清洁方法正在发挥作用 class mymodel models Mo
  • 同一参数有两个不同的名称有什么意义?

    func mapEachElement inArray arr Int withFunc aFunc Int 为什么会有 inArray 然后 arr 有什么意义 对于 withFunc 和 aFunc 也是如此 它使代码变得更加复杂并且阅
  • 如何使用复合键映射多对多

    我有以下表格 Trainingplan TrainingplanID int 11 AI PK Trainer int 11 Client int 11 validFrom date validTo date type int 11 Tra
  • 在 web.xml 中引用环境变量

    我正在预打包一个 JSP Web 应用程序 该应用程序依赖于 web xml 中的某些文件路径设置 这些设置在打包时是未知的 因为它们引用了客户在部署整个应用程序 其中 Web 应用程序是管理界面 时将设置的路径 似乎避免安装程序脚本中的令
  • 在 docker-compose 构建之后,docker-compose up 运行旧的未更新的容器

    我使用 docker compose 并发现以下问题 当我更改代码并想要重建我使用的泊坞窗时 docker compose stop docker compose build 然后我想通过以下方式运行系统 docker compose up
  • 模拟后 CreateMutex 失败

    这是我尝试模拟用户然后创建互斥体的代码 未创建互斥体 我收到 ERROR ACCESS DENIED 错误 void Impersonate DWORD logonType LOGON32 LOGON INTERACTIVE DWORD l