通常防止程序重复运行,我们可以使用Windows中的互斥对象来检测,CreateMutex是常用的创建互斥对象的函数。
一般情况下,我们都会用如下代码检查是否已经重复运行:
CreateMutex(NULL, FALSE, "mutexrandstring");
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
OutputDebugString("[-] Mutex already exist !");
// 程序已运行
return;
}
其实这样写并不严谨,比如在SYSTEM用户下运行时,即使程序多次运行,也不会检测到。所以,上面代码仅限在本地用(local)户权限下和管理员(administrator)权限下。
在SYSTEM用户权限下,解决这个问题的方法是,我们把 CreateMutex 的第三个参数字符串以"Global\"开头,表示全局;SYSTEM用户下重复运行GetLastError()的返回值为ERROR_ACCESS_DENIED,所以应该判断该值。最后完整代码如下:
CreateMutex(NULL, FALSE, "Global\\mutexrandstring");
if (GetLastError() == ERROR_ACCESS_DENIED)
{
OutputDebugString("[-] Mutex already exist !");
// 程序已运行
return;
}
如果想做一个全局互斥,在Local用户下、Administrator用户下、System用户下同时有效,可以创建两个互斥对象,一个以"Global\"开头,一个正常字符串。欢迎补充指教其他更好方法🤗