我可以为那些知道互斥锁密码的进程全局创建一个Windows互斥锁吗?
Can I create a Windows mutex globally for those processes which know the password of the mutex?
我想通过使用WinAPI, CreateMutex()
和OpenMutex()
创建一个Windows互斥锁。但出于安全考虑,我希望互斥锁由那些知道"密码"或硬编码魔法码的进程打开。我不希望每个进程都访问互斥锁
创建名为"Globelcd689f00-0462-11e5-b939-0800200c9a66"的互斥锁。所以只有知道互斥锁名称的进程才能访问这个互斥锁。但这不是一个好的解决方案,因为您可以简单地使用Winobj.exe,您仍然有机会找到这个互斥锁。我希望这个互斥被保护的东西像ACL(访问控制列表)。问题是,我找不到为ACL创建自己的SID的方法。
以下是我所知道的和我想要的:1. 我知道我可以通过将其命名为"GlobalMyMutexName"来使互斥锁被许多进程访问。2. 我也试着理解MSDN上提到的ACL和SID。但是我仍然找不到一种方法来创建自己的SID(也许这没有意义?)3.我不想把我的进程提升到Admin.你试图做的事情与Windows使用的安全模型不符。权限的授予总是基于运行可执行文件的人,而不是可执行文件本身。但是,根据您的场景,可能会有合适的选项。
如果所有涉及的进程都在同一个用户的上下文中,那么你可以使用IPC(例如,命名管道)来识别你的"友好"进程,并使用DuplicateHandle()来传递一个句柄给进程之间的未命名互斥锁。
如果进程必须在不同的用户上下文中,一种选择是让系统服务在特权上下文中运行以充当代理。当然,这需要以管理员权限安装系统服务,但这通常是可以接受的;这只需要做一次。
如果应用程序必须是可移植的(没有安装,或者能够在没有管理员访问的情况下安装),并且必须跨越用户边界,那么我认为您必须使用IPC来实现自己的互斥锁。当然,那将是非常低效的。
请记住,在任何这些情况下,恶意用户仍然可以访问互斥锁——您能做的最好的事情就是稍微增加一些难度。例如,如果使用实际的互斥锁,攻击者可以枚举其中一个进程的句柄,识别互斥锁,并复制该句柄。(或者简单地将恶意代码注入到所谓的"友好"进程中,以直接使用句柄。)甚至IPC也可能被监视和复制。
您应该认真考虑边际安全效益是否值得复杂度的显著增加。在我看来,不太可能。
(顺便说一下,正确的解决方案是让系统服务完成所有需要访问互斥锁的工作;用户运行的应用程序通常是一个瘦客户机,除了提供GUI之外什么都不做。让Windows创建一个新的SID;不要试图自己创造一个。有了这个SID,您就可以构建一个ACL(访问控制列表),它授予对持有该SID的所有进程的访问权,并(隐式地)拒绝其他所有进程的访问权。然后可以将此ACL应用于互斥锁,以保护互斥锁。
现在要获得访问权限,您需要为该SID创建一个模拟令牌。如果我理解MSDN,这个过程是打开你的线程令牌,通过SetTokenInformation
设置TokenUser
,然后通过SetThreadToken
应用修改的令牌。这个模拟令牌现在在检查互斥锁的ACL时使用。
MSDN不完全清楚创建一个有效的用户SID的过程;在上述过程中,可能需要将"User SID"替换为"Group SID"。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 试图在visual studio上用C++创建一个桌面应用程序
- 如何创建一个空的全局类并在启动时实例化它
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我正在尝试使用 c++ 创建一个货币转换程序,我不知道如何继续
- visual是否可以在c++中创建一个接收无限数量相同类型(或至少相当数量)参数的函数
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 如何使用CLion在Mac上创建一个新的.txt文件
- 如何在没有数据拷贝的情况下从指针创建一个Eigen VectorXd对象
- 在c++中为double类型的数组创建一个unique_ptr
- 如何创建函数管道,以便函数一个接一个地运行?
- 如何从这些语句中的每一个创建不同的函数?
- 给定一个创建的带有货物的链表,我需要使用函数检查实际序列或"train"是否有效
- 一个创建彩票游戏的程序,该彩票游戏可以有效地创建 10 套而没有任何重复?
- 如何实现一个创建新对象并返回对它的引用的C++方法
- 如何成功创建一个创建对象并返回指向该对象的指针的函数