不同会话之间的共享内存

时间:2019-05-03 20:55:33

标签: c windows ipc shared-memory privileges

我有两个应用程序:

第一个:使用由服务启动的SYSTEM特权和 第二个:仍然以SYSTEM身份运行,但特权较低(SE_GROUP_INTEGRITY =“ S-1-16-4096”)

我希望两个应用程序都通过共享内存进行通信。 两者都需要读写。

在我的第一个应用程序中,我使用从此帖子中学到的特定SECURITY_ATTRIBUTES创建文件映射:How to share memory between services and user processes?

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;GWR;;;IU)",
    SDDL_REVISION_1,
    &attributes.lpSecurityDescriptor,
    NULL);
HANDLE test = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 1024, "Global\\Test");

一切正常,但是如果我然后尝试在第二个应用程序中打开文件映射,则会在OpenFileMapping崩溃并出现访问冲突。

HANDLE test = OpenFileMapping(FILE_ALL_ACCESS, FALSE, 1024, "Global\\Test");

1 个答案:

答案 0 :(得分:0)

如果要允许访问低完整性代码的对象,则需要添加低强制级别 SDDL_ML_LOW 完整性标签 SDDL_MANDATORY_LABEL )到安全描述符。例如

"D:PNO_ACCESS_CONTROLS:(ML;;NW;;;LW)"

因此一般代码是下一个:

ULONG CreateSectionWithLowAccess(PHANDLE SectionHandle, ULONG dwMaximumSize, PCWSTR lpName)
{
    SECURITY_ATTRIBUTES sa = { sizeof(sa) };

    if (ConvertStringSecurityDescriptorToSecurityDescriptorW(L"D:PNO_ACCESS_CONTROLS:(ML;;NW;;;LW)", 
        SDDL_REVISION_1, &sa.lpSecurityDescriptor, NULL))
    {
        *SectionHandle = CreateFileMappingW(INVALID_HANDLE_VALUE, &sa, PAGE_READWRITE, 0, dwMaximumSize, lpName);

        LocalFree(sa.lpSecurityDescriptor);

        return *SectionHandle ? NOERROR : GetLastError();
    }

    return GetLastError();
}