运行单一实例:
一般病毒都会使用运行单一实例技术,防止病毒文件多次运行,减小暴露的风险。
本次实现是创建互斥体来实现。
实现原理
CreateMutex(
_In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes,
_In_ BOOL bInitialOwner,
_In_opt_ LPCSTR lpName
);
lpMutexAttributes [in, optional] 指向 _SECURITY_ATTRIBUTES
结构的指针。如果此参数为 NULL,则该句柄不能由子进程继承。
bInitialOwner [in] 如果此值为 TRUE,并且调用者创建了互斥锁,则调用线程将获得互斥锁对象的初始所有权。否则,调用线程不会获得互斥锁的所有权。
lpName[in,optional] 互斥对象的名称。该名称仅限于 MAX_PATH 字符,名称区分大小写。如果 lpName为NULL,则会创建不带名称的互斥对象。
使用CreateMutex创建互斥体后,系统在每次运行的时候,通过判断系统中是否有相同命名的互斥对象来确定程序是否重复运行。
程序通过CreateMutex创建一个命名的互斥对象,如果创建成功,通过GetlastError()函数获得返回值为ERROR_ALREADY_EXISTS,表示命名互斥对象存在,即重复运行。
代码实现:
使用VS2015编译。
#include<Windows.h>
#include<iostream>
using namespace std;
BOOL IsOnlyRun()
{
HANDLE hMutex = NULL;
hMutex = CreateMutexA(NULL, FALSE, "TEST");
if (hMutex)
{
if (ERROR_ALREADY_EXISTS == GetLastError())
{
printf("Already Run!\r\n");
return TRUE;
}
//如果互斥体不存在
printf("NOT Already Run!\r\n");
}
return FALSE;
}
int main()
{
IsOnlyRun();
getchar();
return 0;
}
运行结果:
运行第一个实例:
运行多个实例:
参考书籍:《Windows核心编程》