Internet explorer 从IE EPM BHO内访问命名管道服务器

Internet explorer 从IE EPM BHO内访问命名管道服务器,internet-explorer,internet-explorer-11,bho,epm,appcontainer,Internet Explorer,Internet Explorer 11,Bho,Epm,Appcontainer,我正在尝试对我们的传统产品进行一些更改,以支持BHO上的IE EPM。我已经设法加载了它,并调用了各种方法——SetSite、DocumentComplete等 在尝试连接到Windows服务中运行的命名管道服务器时,我似乎遇到了一个障碍 在此之前,我们已经进行了更改,允许处于保护模式的IE BHO使用低完整性SDDL SACL(“S:(ML;;NW;;LW)”)访问命名管道服务器。在代码中,我们使用ConvertStringSecurityDescriptorToSecurityDescrip

我正在尝试对我们的传统产品进行一些更改,以支持BHO上的IE EPM。我已经设法加载了它,并调用了各种方法——SetSite、DocumentComplete等

在尝试连接到Windows服务中运行的命名管道服务器时,我似乎遇到了一个障碍

在此之前,我们已经进行了更改,允许处于保护模式的IE BHO使用低完整性SDDL SACL(“S:(ML;;NW;;LW)”)访问命名管道服务器。在代码中,我们使用ConvertStringSecurityDescriptorToSecurityDescriptor方法创建安全描述符,然后对实际SD或security_属性对象执行SetSecurityDescriptorSacl。这允许BHO代码访问系统服务中托管的命名管道服务器

我参考了几篇文章,可能最有用的是这篇文章-

我对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服务中创建命名管道服务器的,所以我指定的安全描述符并不重要。这行不通

第二,使用medium integrity broker进程创建具有相同尝试SD的命名管道,并且可以访问该管道。因此,我采取的方法是为我的BHO创建一个代理,将这些消息转发到Windows服务。因此,我的“服务器”逻辑不需要移动

我对这种方法并不感到兴奋,但也不算太糟糕,因为我也可以在不完全重新编写核心代码的情况下将这些代码用于基于JS的扩展


第三,我需要一些方法,让BHO根据外部刺激采取一些行动。我通过在BHO的SetSite中创建一个HWND_消息窗口并使用代理进程中的SendMessage调用它来实现这一点。由于这是一个交叉过程,您需要使用WM_COPYDATA。

非常感谢您提供了出色的
EPM_INTEGRITY\u SDDL
。工作起来很有魅力,现在我的BHO在Windows10的IE11中以EPM模式运行,能够打开一些由常规桌面进程创建的共享内存。是的,我知道,这不是一条路(又名“巨大的后门”),但总有一天我会走经纪路线……干杯!据我所知,常规的桌面进程就是你的“经纪人”。在我的例子中,我试图将我的Windows服务(在会话0中运行)作为代理进程,但即使使用SDDL,跨会话请求也无法在那个里工作。下面的解决方案告诉你如何兼顾双向沟通。