gpt4 book ai didi

c - 如何在服务和用户进程之间共享内存?

转载 作者:太空狗 更新时间:2023-10-29 17:08:34 26 4
gpt4 key购买 nike

我有一组 Win32 应用程序,它们使用通过 CreateFileMapping()MapViewOfFile() 创建的共享内存段来共享信息。其中一个应用程序是系统服务;其余的由登录用户启动。在 Windows XP 上,没有问题。我们将 segmentation 市场命名为“Global\Something”,一切顺利。

Vista(以及假定的 Windows 7)中的附加安全性似乎阻止了此体系结构的工作。不允许普通用户在全局命名空间中创建(Win32 错误 5)对象。 MSDN 指出,如果该帐户具有“创建全局”权限,那么一切都应该很好,但在实践中似乎并非如此。此外,Vista 的“完整性”功能似乎可以防止“低完整性”用户进程访问“高完整性”服务创建的共享内存对象。看起来我应该能够通过一些神奇的 SetSecurityDescriptorSacl() 咒语来解决这个问题,但我很难学会说 sacl。

所以问题是:在服务和普通用户进程之间使用共享内存段的正确方法是什么?

为了抢占“只需关闭 UAC”这个简单的答案,我们处于一个相当封闭的环境中,这是不可能的。

编辑:服务和用户进程都需要对该段进行读/写访问。

最佳答案

最简单的方法是让您的服务创建共享内存并在 CreateFileMapping 中指定一个 DACL,以授予普通用户对共享内存的读取权限。

普通用户没有create global权限,但是services可以有这个权限。如果你必须让你的用户创建共享内存然后让服务探测它,你可以有一个 IPC 方案,你的用户代码向服务发送一条包含文件映射句柄的消息,然后服务将调用 DuplicateHandle 来获取一个引用它。这将要求您的服务以调试权限运行。

创建 DACL 的最简单方法是使用 ConvertStringSecurityDescriptorToSecurityDescriptor,它采用名为 SDDL 的格式的字符串来指定 ACL。

Writing Secure Code包含有关使用 SDDL 创建 DACL 的优秀章节。

// Error handling removed for brevity
SECURITY_ATTRIBUTES attributes;
ZeroMemory(&attributes, sizeof(attributes));
attributes.nLength = sizeof(attributes);
ConvertStringSecurityDescriptorToSecurityDescriptor(
L"D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GR;;;IU)",
SDDL_REVISION_1,
&attributes.lpSecurityDescriptor,
NULL);

CreateFileMapping(INVALID_HANDLE_VALUE, &attributes,
PAGE_READWRITE, sizeHigh, sizeLow, L"Global\\MyObject");

LocalFree(attributes.lpSecurityDescriptor);

“D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GR;;;IU)”指定 DACL。 D:P 表示这是一个 DACL(而不是 SACL……您很少使用 SACL),后面跟着几个控制谁可以访问的 ACE 字符串。每个都是 A(允许)并允许对象并包含继承 (OICI)。第一个向系统 (SY) 和管理员(BA,内置管理员)授予所有访问权限(GA - grant all)。最后向交互式用户 (IU) 授予读取 (GR),交互式用户是实际登录到 session 的用户。

完成此操作后,普通用户应该能够调用 OpenFileMapping 来获取共享映射的句柄,并能够将其映射到他们的进程中。由于普通用户对该对象的权限有限,他们必须确保打开它并将其映射为只读访问。

如果用户需要写入权限,您可以将 GR 替换为 GWGR。请注意,这并不安全 - 受限用户将能够在您的服务读取和尝试解析信息时修改共享内存,从而导致您的服务崩溃。

关于c - 如何在服务和用户进程之间共享内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/898683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com