其他分享
首页 > 其他分享> > 第一章 运行单一实例

第一章 运行单一实例

作者:互联网

第一章 运行单一实例

前言

前言

运行过多的进程可能会造成c/s端通讯异常,而过多的危险程序进程也会增加暴露风险,所以说可以给程序加一个api,通过创建一个系统命名互斥对象来实现。又比如在自启维权操作时,可以保证马已经在运行的时候,不用再次运行payload加载部分,避免过多的操作造成暴露风险。

函数介绍

CreateMutex函数

创建或打开一个命名或未命名的互斥对象。

语法

HANDLE CreateMutexA(
  [in, optional] LPSECURITY_ATTRIBUTES lpMutexAttributes,
  [in]           BOOL                  bInitialOwner,
  [in, optional] LPCSTR                lpName
);

参数

[in, optional] lpMutexAttributes

指向SECURITY_ATTRIBUTES结构的指针 。如果此参数为NULL,则子进程不能继承句柄。

[in] bInitialOwner

如果此值为TRUE并且调用者创建了互斥锁,则调用线程将获得互斥锁对象的初始所有权。否则,调用线程不会获得互斥锁的所有权。

[in, optional] lpName

互斥对象的名称。

返回值

如果函数成功,则返回值是新创建的互斥对象的句柄。

如果函数失败,则返回值为NULL。要获取扩展错误信息,请调用GetLastError

如果互斥体是命名互斥体并且对象在此函数调用之前已存在,则返回值是现有对象的句柄,并且GetLastError函数返回ERROR_ALREADY_EXISTS

示例

代码

#include <iostream>
#include <Windows.h>

bool main()
{
	HANDLE hMutex = NULL;
	hMutex = ::CreateMutex(NULL, FALSE, "TEST");   
	if (hMutex)
	{
		if (ERROR_ALREADY_EXISTS == ::GetLastError())
		{
			MessageBox(NULL, "程序已在运行中", "提示", NULL);
			return TRUE;
		}
		MessageBox(NULL, "程序第一次运行中", "提示", NULL);
		return FALSE;
	}
}

测试

第一次执行:
image-20211119222147943
再次执行:
image-20211119222219035

原理学习

通常情况下,系统中的检测是相互独立的,每个进程都拥有自己的资源和地址空间。所以,同一个程序可以重复运行;但是,一些特殊情况下,程序在系统上只需要保存一个进程,所以有了互斥。

微软提供CreateMutex函数来创建或打开一个命名或未命名的互斥对象,程序每次运行的时候,通过判断系统中是否存在相同命名的互斥对象来确定程序是否已在运行中。

程序判断是通过CreateMutex函数创建一个*“TEST”的互斥对象,如果对象创建成功,获取GetLastError函数返回ERROR_ALREADY_EXISTS*,则证明*“TEST”*的互斥对象已存在,程序已在运行中;否则,程序第一次运行。

标签:函数,对象,程序,第一章,互斥,实例,NULL,单一,运行
来源: https://blog.csdn.net/qq_45491298/article/details/121665829