让应用程序只启动一次

作者: admin 分类: C++ 发布时间: 2013-08-23 15:14 ė2,460 浏览数 6没有评论
文章转自王牌软件
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)

在编写应用程序,有时候会有 让应用程序只启动一次的 要求。

一. 命名的内核对象
利用 内核中的命名对象 名称不能重复这一特性,来实现 应用程序的只启动一次的请求。

以Mutex为例,可以利用CreateMutex函数:

使用锁来实现应用程序启动一次:

 

二. 唯一的锁名
第一节中给出的例子,如果另外的应用程序刚好也创建了一个名为”TestForApp”名字的锁,将会导致此应用程序无法启动。那如何保证锁名的唯一性呢?

2.1 GUID保证锁名唯一性
GUID(Global Unique Identifier,全球唯一标示符),它由128位的整数表示,表现为格式:”XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX”(每一个X表示0-9或者A-F的字符),其用来保证不同计算机,不同时间产生唯一的标示符。

可以利用GUID生成一个唯一的名字,作为锁名;

2.2 GUID产生锁名

 

将”D5F78344-5051-4CB3-9CA7-A5A4B5AAEBD1″ GUID取代 “TestForApp”作为锁名,来保证锁名的唯一性
三. 避免Dos(Denial Of Service, 拒绝服务攻击)
3.1 攻击方法
第二节中的方法,虽然避免了锁名冲突的可能性,但并没有避免 有目的制造冲突。

通过Process Explorer工具查看到应用程序所创建的内核对象的名称,如下图所示,能够显示刚创建的名为”D5F78344-5051-4CB3-9CA7-A5A4B5AAEBD1″锁。

黑客很可能利用这个锁名,在应用服务程序启动之前,先创建这个锁,从而导致应用服务程序启动失败。

3.2 解决方法

创建专有的命名空间,专有命名空间就类似于 在内核名称之前在加上一个目录名称,ProcessExplorer中显示为 “\..\锁名”,而不会暴露专有命名空间名字。

专有命名空间关联一个 边界描述符 (Boundary Descriptor), 边界描述符 至少包含一个SID;

个人理解 边界描述符 就是 根据SID和边界描述符名称划分的一个域。

 



只回答业务咨询点击这里给我发消息 点击这里给我发消息

学习日记,兼职软件设计,软件修改,毕业设计。

本文出自 学习日记,转载时请注明出处及相应链接。

本文永久链接: https://www.softwareace.cn/?p=544

0

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">


Ɣ回顶部

无觅相关文章插件,快速提升流量