運行單一實例:
一般病毒都會使用運行單一實例技術,防止病毒文件多次運行,減小暴露的風險。
本次實現是創建互斥體來實現。
實現原理
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核心編程》