从 IE EPM BHO 访问命名管道服务器
Accessing named pipe servers from within IE EPM BHO
我正在尝试对我们的旧产品进行一些更改以支持 BHO 上的 IE EPM。我已经设法加载它并调用各种方法 - SetSite、DocumentComplete 等。
我在尝试连接到 Windows 服务中的命名管道服务器 运行 时似乎遇到了麻烦。
之前,我们已经进行了更改以允许处于保护模式的 IE BHO 访问命名管道服务器 - 使用 LOW_INTEGRITY_SDDL_SACL ("S:(ML;;NW;;;LW)")。在代码中,我们使用 ConvertStringSecurityDescriptorToSecurityDescriptor 方法创建安全描述符,然后在实际 SD 或 SECURITY_ATTRIBUTES 对象上执行 SetSecurityDescriptorSacl。这允许 BHO 代码访问 SYSTEM 服务中托管的命名管道服务器。
我参考了几篇文章,最有用的可能是这篇文章 post - Is there a way to create a named pipe from an AppContainer BHO on IE11?
我对 SDDL 做了一些更改,现在看起来像 -
#define EPM_INTEGRITY_SDDL L"S:(ML;;NW;;;LW)D:(A;;FA;;;SY)(A;;FA;;;WD)(A;;FA;;;AC)"
这基本上为 DACL 部分中的所有人、所有应用程序包和系统提供了完整的文件访问权限。我知道这太宽松了,但我预计这至少应该在我使用 SetSecurityDescriptorDacl 后起作用:-)
无论如何,现在设置 SD 的代码如下所示。我在这里遗漏了什么吗?
if (!ConvertStringSecurityDescriptorToSecurityDescriptor(EPM_INTEGRITY_SDDL, SDDL_REVISION_1, &pLISD, NULL))
{
OutputDebugString(L"Unable to get the app-container integrity security descriptor");
return false;
}
PACL pAcl = 0;
BOOL bAclPresent = FALSE;
BOOL bAclDefaulted = FALSE;
if (!GetSecurityDescriptorSacl(pLISD, &bAclPresent, &pAcl, &bAclDefaulted) || !bAclPresent)
{
return false;
}
if (!SetSecurityDescriptorSacl(pSecurityDesc, TRUE, pAcl, FALSE))
{
return false;
}
pAcl = 0;
bAclPresent = FALSE;
bAclDefaulted = FALSE;
if (!GetSecurityDescriptorDacl(pLISD, &bAclPresent, &pAcl, &bAclDefaulted) || !bAclPresent)
{
OutputDebugString(L"Setting to low integrity : No DACL Available");
return false;
}
if (!SetSecurityDescriptorDacl(pSecurityDesc, TRUE, pAcl, FALSE))
{
OutputDebugString(L"Setting to low integrity : Unable to set the DACL");
return false;
}
我做了一些研究并设法找到了一种有效的方法。
首先,AppContainer 内的 BHO 似乎无法访问在 Windows 会话中创建的命名管道等,而不是它自己的会话。因为我是在 Windows 服务中创建我的命名管道服务器,所以我指定什么安全描述符并不重要。不行。
其次,使用中等完整性代理进程创建具有相同尝试 SD 的命名管道,它将可访问。因此,我采用的方法是为我的 BHO 创建一个代理,将这些消息转发到 Windows 服务。所以,我的"server"逻辑不需要移动。
我对这种方法并不满意,但也不算太糟糕,因为我也可以将这段代码重用于基于 JS 的扩展,而无需完全重写核心代码。
第三,我需要一些方法来回叫 BHO,要求它根据外部刺激采取一些行动。我设法通过在 BHO 的 SetSite 中创建一个 HWND_MESSAGE window 并使用来自 Broker 进程的 SendMessage 调用它来实现这一点。由于这是跨进程的,因此您需要使用 WM_COPYDATA.
我正在尝试对我们的旧产品进行一些更改以支持 BHO 上的 IE EPM。我已经设法加载它并调用各种方法 - SetSite、DocumentComplete 等。
我在尝试连接到 Windows 服务中的命名管道服务器 运行 时似乎遇到了麻烦。
之前,我们已经进行了更改以允许处于保护模式的 IE BHO 访问命名管道服务器 - 使用 LOW_INTEGRITY_SDDL_SACL ("S:(ML;;NW;;;LW)")。在代码中,我们使用 ConvertStringSecurityDescriptorToSecurityDescriptor 方法创建安全描述符,然后在实际 SD 或 SECURITY_ATTRIBUTES 对象上执行 SetSecurityDescriptorSacl。这允许 BHO 代码访问 SYSTEM 服务中托管的命名管道服务器。
我参考了几篇文章,最有用的可能是这篇文章 post - Is there a way to create a named pipe from an AppContainer BHO on IE11?
我对 SDDL 做了一些更改,现在看起来像 -
#define EPM_INTEGRITY_SDDL L"S:(ML;;NW;;;LW)D:(A;;FA;;;SY)(A;;FA;;;WD)(A;;FA;;;AC)"
这基本上为 DACL 部分中的所有人、所有应用程序包和系统提供了完整的文件访问权限。我知道这太宽松了,但我预计这至少应该在我使用 SetSecurityDescriptorDacl 后起作用:-)
无论如何,现在设置 SD 的代码如下所示。我在这里遗漏了什么吗?
if (!ConvertStringSecurityDescriptorToSecurityDescriptor(EPM_INTEGRITY_SDDL, SDDL_REVISION_1, &pLISD, NULL))
{
OutputDebugString(L"Unable to get the app-container integrity security descriptor");
return false;
}
PACL pAcl = 0;
BOOL bAclPresent = FALSE;
BOOL bAclDefaulted = FALSE;
if (!GetSecurityDescriptorSacl(pLISD, &bAclPresent, &pAcl, &bAclDefaulted) || !bAclPresent)
{
return false;
}
if (!SetSecurityDescriptorSacl(pSecurityDesc, TRUE, pAcl, FALSE))
{
return false;
}
pAcl = 0;
bAclPresent = FALSE;
bAclDefaulted = FALSE;
if (!GetSecurityDescriptorDacl(pLISD, &bAclPresent, &pAcl, &bAclDefaulted) || !bAclPresent)
{
OutputDebugString(L"Setting to low integrity : No DACL Available");
return false;
}
if (!SetSecurityDescriptorDacl(pSecurityDesc, TRUE, pAcl, FALSE))
{
OutputDebugString(L"Setting to low integrity : Unable to set the DACL");
return false;
}
我做了一些研究并设法找到了一种有效的方法。
首先,AppContainer 内的 BHO 似乎无法访问在 Windows 会话中创建的命名管道等,而不是它自己的会话。因为我是在 Windows 服务中创建我的命名管道服务器,所以我指定什么安全描述符并不重要。不行。
其次,使用中等完整性代理进程创建具有相同尝试 SD 的命名管道,它将可访问。因此,我采用的方法是为我的 BHO 创建一个代理,将这些消息转发到 Windows 服务。所以,我的"server"逻辑不需要移动。
我对这种方法并不满意,但也不算太糟糕,因为我也可以将这段代码重用于基于 JS 的扩展,而无需完全重写核心代码。
第三,我需要一些方法来回叫 BHO,要求它根据外部刺激采取一些行动。我设法通过在 BHO 的 SetSite 中创建一个 HWND_MESSAGE window 并使用来自 Broker 进程的 SendMessage 调用它来实现这一点。由于这是跨进程的,因此您需要使用 WM_COPYDATA.