服务启动进程下的跨进程事件Event问题

问题描述:
当xdr原先的进程启动方式,改为服务启动时,与chrome之间的通信失败。

问题背景:
chrome所支持的协议分为Https和Http两种,我们目前的xdr只支持Https。
所以在打开浏览器注入成功后,xdr会先关闭chrome的Http,再重新启动chrome的控制台。

通过日志,逐步定位到,有一个跨进程的事件,chrome访问该Event时失败,导致init失败,无法监控chrome的行为。

下面对这个跨进程的Event进行详细讲解。

我对Event的用法一直都是同一个进程的不同线程之间同步和异步的一种方法。
这一次涉及到跨进程对event的用法。

跨进程与同一个进程内多线程的使用方法,区别如下:

  1. 跨进程访问Event,必须在CreateEvent时,对事件命名。
  2. 事件的命名有Local和Global的区别

遇到的第一个问题,就是进程方式启动时,需要将Local 改成Global。
至于为什么这么改,可以参考这篇文章:
CreateEvent 和OpenEvent时事件全局名称问题 Global

解决Global问题后,在OpenEvent时,还是不成功,getlasterror 显示打开失败,查阅相关资料,说是权限不够的问题。
既然是权限问题,这个我熟啊,前几天刚解决了 管道设置安全描述符降低权限的问题,直接用在这里不就好了。

但这一次我尝试了一个简单地方法,就是把他的PACL直接置为NULL。
PACL置为NULL,微软的文档上说这是一种不安全的方法:
PACL为空和不存在分别代表的含义
具体原因,直译过来就是:

空的和不存在的 DACL 之间有一个重要的区别。当 DACL 为空时,它不包含访问控制条目(ACE);因此,没有明确授予访问权限。结果,对对象的访问被隐式拒绝。
当对象没有 DACL 时(当pDacl参数为NULL时),不会为对象分配保护,并且所有访问请求都会被授予。为帮助维护安全性,请使用 DACL 限制访问。
在bDaclPresent标志和pDacl参数的不同配置中存在三种可能的结果:
当pDacl参数指向一个 DACL 并且bDaclPresent标志为TRUE时,一个 DACL 被指定并且它必须包含允许访问的 ACE 以允许访问该对象。
当pDacl参数不指向 DACL 并且bDaclPresent标志为TRUE时,指定NULL DACL。允许所有访问。不应将NULL DACL 与对象一起使用,因为任何用户都可以更改 DACL 和安全描述符的所有者。这会干扰对象的使用。
当pDacl参数不指向 DACL 并且bDaclPresent标志为FALSE时,可以通过继承或默认机制为对象提供 DACL。

除了这一种偷懒但是危险的解决办法,还有一个比较好的解决办法,也是前几天我刚遇到的管道pipe降权的解决办法,附上我的原创文章链接:
降低权限-nng 服务器底层给管道设置安全描述符,开启listen,实现与chrome跨进程通信

在降低权限之后,该Golbal事件终于能够被其他进程正常打开访问。问题到此全部解决。

最后,附上一份偷懒但是危险的降权代码:

void* module::create_event(bool &bStarted, const char * event/*=signal_changed*/, bool bNeedPermison/* = true*/)
{
    void* ret = NULL;
    if(bNeedPermison)
    {
        SECURITY_ATTRIBUTES sea;
        SECURITY_DESCRIPTOR seds;
        sea.nLength = sizeof(SECURITY_ATTRIBUTES);
        sea.bInheritHandle = FALSE;
        sea.lpSecurityDescriptor = &seds;
        InitializeSecurityDescriptor(&seds, SECURITY_DESCRIPTOR_REVISION);
        SetSecurityDescriptorDacl(&seds, TRUE, 0, FALSE);
        ret = (void*)::CreateEventA(&sea, TRUE, FALSE, event);
    }
    else
    {
        ret = (void*)::CreateEventA(NULL, TRUE, FALSE, event);
    }
    
    bStarted = (GetLastError() == ERROR_ALREADY_EXISTS);
    return ret;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值