前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用互斥体防止程序多开技术

使用互斥体防止程序多开技术

作者头像
IBinary
发布2018-09-28 15:13:04
1.3K0
发布2018-09-28 15:13:04
举报
文章被收录于专栏:逆向技术逆向技术

   

学习完线程的同步函数. 互斥体的应用.那么我们可以使用互斥体进行放多开设置.

一丶编写思路.

在编写互斥体防止多开的时候.我们要查询下MSDN.看下互斥体的介绍.

看到互斥体MSDN返回值说的一段话.

If the function succeeds, the return value is a handle to the mutex object. If the named mutex object existed before the function call, the function returns a handle to the existing object and GetLastError returns ERROR_ALREADY_EXISTS. Otherwise, the caller created the mutex.

If the function fails, the return value is NULL. To get extended error information, call GetLastError

上面的英文意思是.如果函数成功.则返回互斥体的句柄.如果调用此函数.发现名字已经有了.表示这个函数在之前已经调用过了.所以则会返回  ERROR_ALREADY_EXISTS的宏. 这个宏的意思就是已经存在.

如果函数失败.则返回NULL.  返回的宏必须调用 GetlastError获取.

根据上面返回值的意思我们明白了. 这个函数如果调用过则会返回 已经存在的宏. 那么我们可以写程序来校验一下.

代码语言:javascript
复制
#include "stdafx.h"
#include <Windows.h>
//创建临界区结构

int main(int argc, char *argv[])
{
    //初始化临界区全局原子变量
    HANDLE MutexHandle = CreateMutex(NULL, FALSE, TEXT("AAA"));  //创建互斥体. 信号量为0. 有信号的状态.wait可以等待
    DWORD ErrorCode = 0;
    ErrorCode = GetLastError();
    if (ERROR_ALREADY_EXISTS == ErrorCode)
    {
        printf("对不起,程序已经启动一份了.这份即将关闭\r\n");
        CloseHandle(MutexHandle);

        system("pause");
    }
    if (NULL == MutexHandle)
    {
        return 0; //表示句柄获取失败
    }

    for (size_t i = 0; i < 10; i++)
    {
        Sleep(1000);
        printf("当前程序运行中. EIP 位置 等于 %d \r\n", i);
    }
    system("pause");
    return 0;
}

我们打开同样的两个程序

一份提示正在执行.一份提示即将关闭.这个则是互斥体防止多开的原理.

当然有很多这样的方法.这个只是其中一种.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-09-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一丶编写思路.
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档